Юрец

Частотомер На Atmega

53 сообщения в этой теме

mazzi    38
...большая разница в синтаксисе, в регистрах...

Откуда там большая разница в регистрах? Там почти одно и то же.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Zenner    1

Я кстати знаю пару человек, которые сидят на CVAVR только из-за того, что там можно писать "PORTB.x=x" :D

Про регистры подметили верно. Они в МК, а не в компиляторе. Потому разными быть не могут.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Юрец    9

пытаясь уйти от старого алгоритма подсчета частоты импульсов столкнулся с очередной проблемой:

//Clock frequency	 : 8,000000 MHz

unsigned long int counter; // количество тиков между прерываниями INT0 для расчетов
unsigned long int counter_timer;  // количество тиков между прерываниями INT0 для таймера
unsigned int c_tacho=0;  //  // расчитанное количество числа оборотов

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 1000,000 kHz
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x02;
TCNT2=0x00;
OCR2=0x00;

TIMSK=0x40;	 //0b01000000   разрешаем прерывания по TOIE2-переполнение таймера2	bit6

interrupt [EXT_INT0] void ext_int0_isr(void) //прерывание по появлению импульса на INT0
{
counter=counter_timer;
counter_timer=0;		//обнуляем количество пройденных импульсов timer2
c_tacho=60/(counter*0.000001);  // 0.000001 - период в секундах для частоты таймера2 1000,000 kHz
}

interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
counter_timer++;
}

void tacho_lcd_view()
{
sprintf(lcd_buffer,"%4d ob/min",c_tacho);	// 
lcd_gotoxy(0,0);
lcd_puts(lcd_buffer);//выводим 
}

Посмотрим расчет на примере.

расчитаем для частоты 8000 об/мин.

(1/8000)*60 = время измерительного импульса (период вращения одного оборота) и составляет 0,0075 сек, а период следования импульсов измерительного генератора (таймера) 0,000001с (1 мкс или 1000кГц), тогда за период одного оборота вращения зафиксируем:

0,0075сек/0,000001сек=7500 (импульсов), и скорость вращения будет F=60/(7500*0,00001)=8000 об/мин. что и требовалось доказать.

в протеусе так:

подаю на вход INT0 сигнал частотой 133.33333Гц ( 1/0,0075сек)

и вместо 8000 ob/min вижу 28000-30000 ob/min.

если в программе тупо делаю так: c_tacho=60/(7500*0.000001); то протеус показывает 8000 ob/min.

а если так: sprintf(lcd_buffer,"%4d ob/min",counter); то протеус показывает 29-30ob/min.

что-то я недопонимаю...

либо я где-нибудь затупил, либо протеус не умеет правильно эмулировать тактирование частоты.

все, разобрался. таймер 8-битный, и прерывание происходит на 256-й тик таймера а не с каждым его тиком, поэтому нужно так:

interrupt [EXT_INT0] void ext_int0_isr(void) //прерывание по появлению импульса на INT0

{

counter=counter_timer;

c_tacho=60/(counter*0.000256);

counter_timer=0; //обнуляем количество пройденных импульсов timer2

}

Изменено пользователем Юрец

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сообщения

    • Да, они занижены. Ночью в мой кипящий мозг пришла мысль, что они занижены ровно в два раза, поэтому и метки выставляются. Сегодня пришлось ехать на дачу, поэтому не занимался им.
    • Для этой цели давно использую цифровой фотоапарат - фоткаю плату с разных углов и ракурсов на макросъемке (для тех, кто не знает - специальный режим для съемки с очень близкого расстояния) и увеличиваю на компьютере до читабельного размера. Программные регуляторы гаммы, яркости и контраста помогут разглядеть даже мелкие пылинки на плате. Очень удобный метод и для рассматривания элементов и срисовывания схем.    
    • Может быть такое что китайцы палево просто покарявят что бы выглядело б.у.шым и шлют шлак? https://ru.aliexpress.com/item/MJ21195-MJ21196-MJ21195G-MJ21196G-4-50-3/32913837994.html?spm=a2g0v.10010108.1000013.8.2ce03652Wy3UzB&pvid=ee79ffbd-d941-4ac9-b997-09c38395efdf&gps-id=pcDetailBottomMoreThisSeller&scm=1007.13339.90158.0&scm-url=1007.13339.90158.0&scm_id=1007.13339.90158.0 Я например один раз брал уже б.у.шные тр-ры. В принципе норм были.
    • Я брал AD823 на али по $0.4 за штуку (корпус soic-8) при партии в 10 шт - не считаю его особенно дорогим. Конечно, есть вопрос о его оригинальности, тут уверенности нет. Но по скорости нарастания выходного сигнала полностью соответствует описанию (rail-2-rail тоже выдает). Словил интересный момент - если подключать его вход к его же +Vcc, через вход течет приличный ток, ОУ нагревается и т.д. Но, опять же, по описанию на вход надо подавать на 1.2 В меньше. Для справедливости - LM358 брал за 200 рублей там же в количестве 100 шт (DIP-8). Но при его характеристиках область его применения очень ограничена. У меня три LM358 (и одна AD823) пошли на двуполярный предрегулятор - у LM358 обнаружилась неприятная особенность - если ОУ работает в режиме компаратора (т.е. его выход либо плюс, либо минус питания), то он переключается с приличной задержкой (до 50 мкс). Видимо, какие-то внутренние транзисторы входят в глубокое насыщение, из которого не могут долго выйти. Поэтому одну микросхему в предрегуляторе пришлось заменить на AD823 (пробовал LM393, но он возбуждался даже с положительной обратной связью). Я имел в виду такую ситуацию - БП переходит в режим СС, при этом его выходное напряжение становится ниже. ОУ, отвечающий за напряжение будет хотеть поднять напряжение выше и на своем выходе выдаст потенциал, соответствующий (или даже превосходящий) максимальному выходному напряжению блока. Если в этот момент нагрузка резко снижает свое потребление, схема СС отключается и выходное напряжение снова будет определяться схемой CV. Если ОУ в схеме CV медленный (или замедлен ООС), то некоторое время (пока ОУ не отреагирует) выходное напряжение будет установлено на максимально возможном для блока уровне, после чего "придет в норму". Вот этого бы не хотелось. В общем случае задача по созданию стабильного линейного БП весьма сложна. Проблему усугубляет возможность подключения к выходу конденсатора и, тем самым, значительного снижения быстродействия выходного каскада. В сочетании с "быстрым ОУ" это приведет к неминуемой генерации. В то же время медленный ОУ будет допускать вот такие скачки выходного напряжения при возврате из режима СС. Да, но такое "слитие" происходит на высокой частоте, для качественной фильтрации которой нужен, опять же, "быстрый ОУ" в линейном стабилизаторе. Конкретно в моем случае, если ОУ достаточно замедлить, пульсации от предрегулятора могут достигать 60 мВ (против 10 мВ при полном его отключении). В то же время на "быстром ОУ" пульсации незаметны даже на максимальном уровне чувствительности осциллографа (2 мВ/дел). При этом импульсы на НК у меня возникают только в одном случае, когда закрывается ключ и ток вторичной обмотки (достаточно) резко обрывается через ДК. Вы принципиально не хотите использовать ОУ?
    • Автор же признаётся сразу, что не особо в теме...
    • Да ответами и советами завалили, не то слово . Я такой эксперимент не ставил. Но сейчас включил MUX[010] и поставил перемычку между А1 и А3. Получил 1 (единицу), но не ноль. Вот только не знаю, плохо это или нет? Заодно решил поэкспериментировать. запитал микроконтроллер с ADS1115 от одного источника (USB порт компьютера), а источник опорного напряжения, который я на схеме обозначил как "Объект измерения"  от другого БП. Земли не объединил! В итоге получил неустойчивые показания, но сравнимые с показаниями контрольного мультиметра. Сейчас уже поздно, завтра попробую запитать коннтроллер от нормального блока питания. Возможно с компьютера прёт всякая хрень по питанию. Но в связи с этим вопрос. А может и не надо объединять земли питания АЦП и измеряемую цепь?