Мелкие вопросы по МК и ПЛИС.

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Ну так, там не просто трансформатор а дифференциальный трансформатор. да очень просто, с него подаете напряжение через обязательный ограничитель(чтобы не спалить МК) прямо на вход АЦП, и измеряете с частотой примерно 50*16гц, со входного напряжения можно взять сигнал перехода через ноль - привязать моменты начала накопления сумм к переходу через ноль, итого у вас каждый период сетевого напряжения будет значение тока просуммированного 16 раз за период. Останется поделить его на 16(обычный логический сдвиг вправо, но вообще делить стоит после умножения чтобы не потерять младшие разряды числа) и умножить на коэффициент пропорциональности(зависит от коэфициента трансформации, нагрузки трансформатора тока и т.д. - этот коэфициент поддается рассчету при помощи обычной арифметики) и у тебя получится ток. Только учти, АЦП не измеряет отрицательные значения а значит у тебя измерено будет ровно в 2 раза меньше номинала - т.е. надо будет умножить показания еще на два.
Контактная информация:
Реклама
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

ibiza11 писал(а):так 4.56мкс :)) только пакет то извне надо задавать)
Дак он извне и задаётся, просто я добавил код для переустановки пакета, чтобы молотил постоянно.
Этот кусок :

Код: Выделить всё

   if(!--BitNum){
     BitNum=16;
     Packet=0xAAAA;
   }
можно убрать. Тогда будет "одиночный выстрел" и съэкономится ещё несколько тактов (уберётся условие).Хотя нет, вру, условие убрать не получится. Нужно контролировать окончание передачи.
ibiza11 писал(а): мне кажется вариант akl тут несомненно лидер по скорости.
Не могу спорить, т.к. не знаю ассемблера АВР. Но, сдаётся мне, что там в передаче фигурирует всего один байт.
В принципе, можно ещё немного подукоротить время выполнения, сделав побайтовый вывод данных. Выиграем время за счёт сдвига переменной.
Сделать можно всё, даже на ЯВУ, но нужно хорошо знать свой ассемблер и компилятор, и то, во что он разворачивает код.
Контактная информация:
Реклама
Опытный кот
Сообщения: 822
Зарегистрирован: Вс июн 02, 2013 12:23:03

Сообщение amd9800 »

ibiza11 писал(а):Изображение
не могу понять чем отличается режим 11 от 9.

В протеусе я получаю один и тот же результат.

Хотя у 11 написано только phase correct, а у 9 еще и frequency, то меняя значение в OCR1A частота меняется в обеих режимах.
Мудрый кот
Аватара пользователя
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

Найдите 10 отличий :) Вторая колонка с права на лево.
Запись в регистр OCR1A может производиться сразу при выполнении команды вывода в порт в/в (immediate), а может буферизироваться и производиться, когда счётчик находиться в "нижней" (bottom) или "верхней" (top) точке счёта. Чтобы не было искажения импульсов, когда запись в порт в/в производится в середине цикла счёта.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Реклама
Эиком - электронные компоненты и радиодетали
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Чт июн 26, 2014 15:27:55

Сообщение Starmarik »

Друзья, у меня вопрос. Можно ли использовать выход RESET микроконтроллера для перезапуска контроллера часто? Я сделал таймер для аквариума, запускается с момента подачи питания, и чтоб корректировать, сместить временной интервал, нужно его перезапустить. Я сделал на одном выходе обнуление переменных, работает прекрасно. Но смущает, что RESET болтается без дела, а целый порт для обнуления переменных задействован. Не будет ли вреда контроллеру, если я буду перезапускать его RESETом?
Реклама
Chettuser

Сообщение Chettuser »

А команда RESET не? :)
Если конечно в Вашем МК она есть. :)))
Реклама
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Чт июн 26, 2014 15:27:55

Сообщение Starmarik »

Chettuser писал(а):А команда RESET не? :)
Если конечно в Вашем МК она есть. :)))
У меня ATTINY13, собсно даже не задумывался над этим. Прекрасно работает и обнуление переменных, но меня уж очень смущает то, что нога RESET без дела :)
Chettuser

Сообщение Chettuser »

Вот так и вырастают... хакеры :)))
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Чт июн 26, 2014 15:27:55

Сообщение Starmarik »

Chettuser писал(а):Вот так и вырастают... хакеры :)))
:))) :))) :)))
Открыл глаза
Сообщения: 52
Зарегистрирован: Чт дек 12, 2013 02:28:20

Сообщение beniamin91 »

Добрый вечер уважаемые коты.
Помогите новичку в одном вопросе.
Нужно собрать управление инкубатором которое будет поддерживать определенную температуру и каждые 2 часа переворачивать яйца.
Как можно решить проблему что бы МК считал время и включал мотор и при этом не перестал бы смотреть за температурой?
Вот код, на синтаксис не обращайте внимания все точки с запятым потом поставлю. Как можно переделать алгоритм?

Код: Выделить всё

t = 37
c = 7200000
s = 0


if (температура < t){Включить нагреватель}
else{ if(температура > t){Выключить нагреватель} }




/////////////////нужно проверять нижнее условие по каждые 2 часа//////////////////

delay_ms(c)


if (s = 0)
   {Включить матор по часавой
    s++}
else { if(s = 1)
	{Включить матор против часавой
	 s == 0}
     } 


температура берется с датчика ds18b20
мотор будет отключатся по достижению латков яиц двум концевикам (прикрепил картинку)
Вложения
Безымянный.png
(11.38 КБ) 365 скачиваний
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

Про таймеры почитайте. А заодно и грамматику полистайте.
Fucking static initialization order fiasco
Контактная информация:
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Чт июн 26, 2014 15:27:55

Сообщение Starmarik »

beniamin91, можно сделать отсчет времени таймером. Например, как сделал я для аквариума - настройка таймера на прерывание по совпадению, вот расчет значений на 100 Гц, тоесть на 1/100 секунды -(за расчет отдельное спасибо oleg110592) 1/100 секунды равно 100Гц, Внутренний генератор тини13 9.6 MHz.
В документации есть формула из нее получается:
OCR=(Fclk/Focn*N)-1
N - коэффициент предделителя (1, 8, 64, 256, or 1024)
OCR=(9600000/100*N)-1=(9600000/(100*1024))-1= 92.75=93 . Далее в функции прерывания таймера ставишь увеличение переменной, напр. sec++, а в основном цикле пишеш отсчет времени, например, if (sec==6000){min++; sec=0} - одна минута, if (min==60){hour++; min=0} - один час. Далее условие на два часа - if(hour==2){включаем переворот яиц}, и так далее. Если интересно, то позже скину тебе код, который я делал для включения света и кормушки в аквариуме.
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

судя по коду, который предоставил beniamin91 - это его первая попытка программирования. И дальше нее он не пойдет. Ему нужно, чтобы кто-то за него написал. А это несколько в другом разделе.
Fucking static initialization order fiasco
Контактная информация:
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Чт июн 26, 2014 15:27:55

Сообщение Starmarik »

Pink-Pank писал(а):судя по коду, который предоставил beniamin91 - это его первая попытка программирования. И дальше нее он не пойдет. Ему нужно, чтобы кто-то за него написал. А это несколько в другом разделе.
Моя первая попытка программирования это было моргание светодиода и залоченный МК :) Но я увидел, всю мощь, так сказать, контроллеров, и изучаю дальше. Думаю, у товарища beniamin91 все еще впереди :))
Открыл глаза
Сообщения: 52
Зарегистрирован: Чт дек 12, 2013 02:28:20

Сообщение beniamin91 »

Starmarik спасибо за отзывчивость.
Я тоже думал что надо сделать с таймером но увы еще не совсем понимаю как работать с ним.
Starmarik писал(а): Если интересно, то позже скину тебе код, который я делал для включения света и кормушки в аквариуме.
буду очень признателен за код. Думаю уловлю суть работы и смогу доделать свой.
О какого мнения вы на счет регулятора температуры? По вашему такой код будет нормально держать температуру или же я совсем нечего полезного не написал?

Код: Выделить всё

if (температура < t){Включить нагреватель}
else{ if(температура > t){Выключить нагреватель} }
Pink-Pank писал(а):судя по коду, который предоставил beniamin91 - это его первая попытка программирования. И дальше нее он не пойдет.
не первая попытка и не последняя. О вы что с пелёнок занимались контролерами или же без начало сразу дошли до конца ?
Pink-Pank писал(а):Ему нужно, чтобы кто-то за него написал. А это несколько в другом разделе.
Ты не в моем голове и не знаешь что мне нужно, свои негативные эмоции держите в себе!
aam
Собутыльник Кота
Аватара пользователя
Сообщения: 2994
Зарегистрирован: Сб фев 20, 2010 14:00:12
Откуда: Москва

Сообщение aam »

Скажите, а кто-нибудь пробовал анализировать протокол RF-пультов для освещения типа таких:
Изображение
?
Как они вообще работают и насколько они унифицированы?

Хотелось с помощью покупного пульта управлять самодельным контроллером для люстры.

Помимо этого видел радиомодули УАРТ. В принципе они позволили бы реализовать что угодно. Но не делать же пульт самому.
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Чт июн 26, 2014 15:27:55

Сообщение Starmarik »

beniamin91 держи код, коменты на украинском, думаю, разберешся :)
Спойлер

Код: Выделить всё

#include <tiny13.h>
#include <delay.h>
unsigned int m_sec=0x00;//переменная мсек
unsigned int tim=0x00;  //таймер
unsigned char min=0x00;//переменная мин
unsigned char hour=0x00;//переменная час
unsigned char count=0x00;
unsigned int counter=0x00;
                 

// Timer 0 output compare A interrupt service routine
interrupt [TIM0_COMPA] void timer0_compa_isr(void)     //прерывания по совпадению
{
m_sec++;                                //переменная 1/100 секунды увеличивается
counter++;
}

// Timer 0 output compare B interrupt service routine
interrupt [TIM0_COMPB] void timer0_compb_isr(void)
{
// Place your code here

}


void reset() //обнулення змінних
{
m_sec=0;min=0;hour=0;tim=0;
}


void main(void)
{

// Declare your local variables here

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Input/Output Ports initialization
// Port B initialization
// Func5=In Func4=In Func3=In Func2=Out Func1=Out Func0=Out 
// State5=T State4=P State3=P State2=0 State1=0 State0=0 
PORTB=0x18;
DDRB=0x07;


// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 9,375 kHz
// Mode: CTC top=OCR0A
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x02;
TCCR0B=0x05;
TCNT0=0x00;
OCR0A=0x5D;
OCR0B=0x00;

// External Interrupt(s) initialization
// INT0: Off
// Interrupt on any change on pins PCINT0-5: Off
GIMSK=0x00;
MCUCR=0x00;

// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x0C;

// Analog Comparator initialization
// Analog Comparator: Off
ACSR=0x80;
ADCSRB=0x00;
DIDR0=0x00;

// ADC initialization
// ADC disabled
ADCSRA=0x00;

// Global enable interrupts
#asm("sei")

while (1)
      {
       /*ТАЙМЕР ВИКЛЮЧЕННЯ ФІЛЬТРА*/
       if(!PINB.3){PORTB.2=1;} 
       if(counter==100){count++;counter=0;}
       if(count==10){PORTB.2=0;count=0;}
       
       /*ГЕНЕРАЦІЯ ХВИЛИН І ГОДИН*/
       if(m_sec==3000){tim++;}           //30-секундний таймер для автокормушки
       if(m_sec==6000){m_sec=0;min++;}  //1 хвилина          
       if(min==60){min=0; hour++;}      //1 година

        /*КОРМУШКА*/
       //запуск автоматичної кормушки на 30 секунд
        if(hour==0&min==0&tim==0){PORTB.0=1;tim=0;} 
        else{PORTB.0=0;}  
       
       /*СВІТЛО*/
       if(hour==0){PORTB.1=1;}//включення світла одразу після запуску
       if(hour==4){PORTB.1=0;}//виключення світла через 4 години    
       if(hour==24){hour=0;} //24 години
       
       /*ОБНУЛЕННЯ ТАЙМЕРА*/ 
       if(!PINB.4){reset();} //обнулення таймера
    }  
}
На счет того кода, который ты написал, то там действительно ничего нет :) Извини за критику :) Я сам начинающий, но учусь, учусь и учусь. На счет подключения датчика, погугли в нете, есть готовые примеры подключения к avr, для начала как раз, чтоб в коде разобраться, и скачай Протеус, удобно проверять виртуально работу схемы и программу. Из моего кода выбери себе генерацию времени, и таймер. Да, чуть не забыл - код писан в CodeVisionAVR, Успехов :)
Открыл глаза
Сообщения: 52
Зарегистрирован: Чт дек 12, 2013 02:28:20

Сообщение beniamin91 »

Starmarik Спасибо за помощь, сейчас скачаю протеус и буду тестировать.
Желаю всем удачи.
Chettuser

Сообщение Chettuser »

... новеньких F1 давно вроде не было. Ориентироваться - простое F0, сложнее F3, F4. А F2 да уже и F1, мне лично, пока думаю в ближайшем не потребуются.
И все же - есть ли будущее у массовой F1? В основном на aliexpress продаются как раз таки они, а вот F2 и F3 попадаются не часто. Как насчёт простых F0?
Кстати, цены на более взрослые МК не такие уж и маленькие. А везде пишут о том, что STM дешевле. Возможно это раньше было?
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

берем самый дешевый из F1:
STM32F100C4T6B ARM Cortex-M3 32-bit, Flash: 16K, RAM: 4K, UART: 2, АЦП: 10 x 12bit, ШИМ: 6 x 16bit Тип корпуса: LQFP48
Цена 23,00 Грн
сравниваем с F0:
STM32F051C6T6 32бит ARM Cortex M0, 48МГц, 32кб Flash, 4кб ОЗУ, SPI, I2C, I2S, 2xUSART, CEC, 9 таймеров, АЦП 12 бит * 10 каналов, 12бит *ЦАП Тип корпуса: LQFP48
Цена 26,75 Грн
STM32F030C8T6
32бит ARM Cortex M0, 48МГц, 64кб Flash, 8кб ОЗУ, SPI, I2C, I2S, 1xUSART, CEC, 6 таймеров, АЦП 12 бит * 10 каналов, 12бит *ЦАП
Тип корпуса: LQFP48 Цена 26,00 Грн
STM32F030C6T6 32бит ARM Cortex M0, 48МГц, 32кб Flash, 4кб ОЗУ, SPI, I2C, 1xUSART, 4 таймера, АЦП 12 бит * 12 каналов, 39 GPIO, Цена 59.14р (в гривнах не нашел)
Если не волнует Cortex-M3, то какой выбор делаем?
цены на более взрослые МК не такие уж и маленькие
На то они и взрослые - у нас самый дешевый:
STM32F372V8T6 Ядро: ARM Cortex-M4: FLASH: 64 КБайт: RAM: 16 КБайт: АЦПканалов: 25: АЦПразр: 16: ЦАП: 1 Fcore: 72 Мгц
Цена 61,00 Грн
чуть дороже:
STM32F401VBT6 ARM Cortex-M4 Converters : A/D 16x12b; RAM Size : 64K x 8; ;FLASH: 128KB ; Number of I/O : 81; Peripherals : DMA, I2S, POR, PWM, WDTIrDA, LIN, SDIO, SPI, UART/USART, USB OTG; Speed : 84MHz
Цена 76,75 Грн.
В принципе недорого, для сравнения взрослый другой фирмы:
ATmega1280-16AU AVR 8-bit, Flash: 128K, RAM: 8K, EEPROM: 4K, UART: 4, АЦП: 16 x 10bit, ШИМ: 16 x 16bit Тип корпуса: TQFP100 Производитель: ATMEL
Цена 204,50 Грн.
Ответить

Вернуться в «Разные вопросы по МК»