Юрец

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

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

Юрец    9
Раз выбрано внешнее тактирование - значит однократный "тик".

если по прихождению одного импульса на вход Т1 возникает однократное прерывание ISR(TIMER1_COMPA_vect){counter++;}

тогда возникает следующий вопрос:

а это не то-же самое (с алгоритмической точки зрения) что и подсчет количества прерываний interrupt [EXT_INT0] void ext_int0_isr(void){i++;} за 1 сек ?

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


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

Нет. Таймер включен в режиме CTC, и прерывание будет происходить каждые 100 "тиков", когда TCTN1(он инкрементируется каждый "тик") совпадёт с OCR1A.

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


Ссылка на сообщение
Поделиться на других сайтах
2.фактически это алгоритм автомобильного тахометра. скажем до 8000 оборотов. 8000 * 4 цилиндра = 32кГц. пока это будет максимумом.

Уважаемый Юрец, я не перестаю удивляться.. Это к тому, что 8000 об/мин коленчатого вала двигателя не есть 8000 Гц практически

никогда, а уж тем более 32кГц и ни на какое кол-во цилиндров умножать не нужно!!!

Правильная постановка задачи уже содержит половину ответов:) Поэтому начнем с приведения данных в систему.

Вот моё видение постановки задачи: есть вращающийся вал, датчик для измерения кол-ва оборотов в сек. - самое простое контактная

пара, оптодатчик и т.д. Допустим оптодатчик (светодиод-фототранзистор), на валу диск с одним отверстием, тогда оборот вала дает

1 импульс, если отверстия 2 - тогда 1 оборот - 2 импульса и т.д. Допустим отверстие одно - тогда частота в 1 Гц будет соответствовать

частоте вращения 60 об/мин.

После небольших преобразований 8000 об/мин / 60 сек = 133,33.. Гц.

Кстати можно реализовать программный пересчет Гц в об/мин.

Теперь о частотомере. Сам написал аж 3 варианта программы частотомера, пока не получил хорошие показатели по точности.

Не буду заморачивать подсчетом фронтов и прочей не заслуживающей внимания ерундой... вот насчет внешних прерываний - не знаю,

не пользовал.

Самый надежный вариант, тактирование 2-хбайтного таймера от внешнего источника - настрой регистр TCCR1B, вот кусок даташита

CS12 CS11 CS10 Description

1 1 0 External clock source on T1 pin. Clock on falling edge.

1 1 1 External clock source on T1 pin. Clock on rising edge.

т.е. по срезу и фронту импульса. Забиваешь 6(0b110) или 7(0b111) в TCCR1B таймер запустится, ждешь фиксированное время

скажем 1сек - pause_ms(1000) - это в кодевижн, остановил таймер, вывел результат и по новой. Не нравится с паузами, запустил

второй таймер... Время берешь любое - хочешь 10 сек - для очень низкочастотных процессов или 0,01сек, а потом пересчет к одной

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

частоты ограничен по даташиту Fclk/2, рекомендуется Fclk/2,5 т.е. с кварцем 16 МГц сможешь мерять до 8-ми...

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


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

Если интересно, мой исходник тахометра из этой темы...

Точность можете оценить :) Модель там приложена. Среда разработки - AtmanAVR, компилятор GCC. Портируется элементарно...

tachomether.rar

Изменено пользователем Goodefine

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


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

Найдите миллионы труднодоступных

электронных компонентов

Zenner    1
верхний предел измеряемой

частоты ограничен по даташиту Fclk/2, рекомендуется Fclk/2,5 т.е. с кварцем 16 МГц сможешь мерять до 8-ми...

Поправлю: верхний предел по Вашему методу получится 65кгц, если мерить до единиц Гц. 650кгц - десятков Гц. 6.5мгц - сотен Гц.

Таки в два байта не впишешь пару Мгц с точностью 1гц...

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


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

Парни, учтите, что при одном импульсе на цилиндр, за 1 оборот коленвала с датчика поступают два импульса, т.к. срабатывают два цилиндра за 1 оборот. Не забудьте.

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


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

Да что вы прилипли к цилиндрам, вы меряете частоту вращения обычного вала, который вращается, частота его вращения ессно меняется в определенных пределах. К чему здесь цилиндры не воткну никак...

To Zenner:

Естественно точность такая, как ты сказал, но что такое 10Гц на пределе в 650кГц...

Максимальная погрешность тут будет на нижнем пределе диапазона 65кГц-650кГц и то примерно 0,015%

Я же не предлагаю мерять в данном случае единицы герц, правильно будет разбить на поддиапазоны и

в них мерять, что я и сделал. Повесил кнопки, переключаешь поддиапазоны.

Вопрос: есть решения измерения на пределе в несколько МГц с дискретностью отсчета 1Гц?

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


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

-> Вопрос: есть решения измерения на пределе в несколько МГц с дискретностью отсчета 1Гц?

На прошлой странице дали ссылку на мой проект LC-метра на меге, меряет 4мгц(гарантировано), может и больше, с точностью 1гц.

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


Ссылка на сообщение
Поделиться на других сайтах
Goodefine    95
Да что вы прилипли к цилиндрам, вы меряете частоту вращения обычного вала,..

А чего бы к ним не прилипнуть? Количество импульсов зажигания свечи жестко связано с оборотами коленчатого вала. И вместо использования сего факта, лепить оптопары или феррит к коленчатому валу просто глупо...

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


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

Ну тогда да, если коннектится к прерывателю-распределителю.

Ну в общем случае, можно не только к коленвалу...к распредвалу например,

или к любому валу связанному с коленчатым определенным передаточным отношением,

на худой конец даже ременной передачей - если космическая точность не нужна, мне

кажется в некоторых случаях это будет даже удобней... чем палить постоянно формирователь

импульсов, подлюченный к довольно нехилой индуктивности (в случае с классической батарейной

системой зажигания), 20 кВольтов все таки

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


Ссылка на сообщение
Поделиться на других сайтах
Goodefine    95
...чем палить постоянно формирователь

импульсов, подлюченный к довольно нехилой индуктивности (в случае с классической батарейной

системой зажигания), 20 кВольтов все таки

Почему палить? Сейчас почти везде (за исключением только самых древних систем зажигания) стоит электронный ключ (дребезжит меньше механического, но с ним даже немного сложнее - с механикой тоже проблем нет особых), замыкающий катушку на массу. Если подключится к отрицательной клемме катушки (конец первичной обмотки, замыкающийся на массу через ключ), то простой делитель 33к/1.2к + стабилитрон отлично решает все проблемы. По такой схеме подключаю прямо на лапу МК, даже без полноценного формирователя - не то что не горит, даже не глючит... Так что не надо искать проблемы там где их нет...

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


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

Ну если пробовал, тогда убедил ;) Вопросов по данной части больше не имею.

To Zenner:

А чего собсно такой вариант входной части частотомера, как у нее с чувством и входным сопротивлением?

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


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

А х его з. Что в голову пришло то и нарисовал. 0,5В чует точно. Входное сопротивление не менее 10кОм.

Кстати, С3 нужно увеличить до каких 100нф, чтоб 50гц и ниже пропускал.

И да, вся эта байда нужна чтоб сигнал произвольной формы привести в "нормальный" вид для МК. В данный момент уже приделал формирователь на логике.

И на днях скорее всего будет Update до 100мгц без потери точности.(всё теже +-1гц, по крайней мере постараюсь :) )

Изменено пользователем Zenner

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


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

В "Радио" видел нормальную входную часть, там чувак на пике частотомер сделал.

Только что специально распечатку нашел №7 2004г с.64 - чувство 75-150мВ, вход на полевике, что тоже есть гут.

Буду его делать.

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


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

Ага. Таймеры/счетчики PIC-ов - единственное их достоинство, в остальном проигрывают по всем параметрам.

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


Ссылка на сообщение
Поделиться на других сайтах
Юрец    9
Самый надежный вариант, тактирование 2-хбайтного таймера от внешнего источника - настрой регистр TCCR1B, вот кусок даташита

CS12 CS11 CS10 Description

1 1 0 External clock source on T1 pin. Clock on falling edge.

1 1 1 External clock source on T1 pin. Clock on rising edge.

т.е. по срезу и фронту импульса. Забиваешь 6(0b110) или 7(0b111) в TCCR1B таймер запустится, ждешь фиксированное время

скажем 1сек - pause_ms(1000) - это в кодевижн, остановил таймер, вывел результат и по новой. Не нравится с паузами, запустил

второй таймер...

это такой=же алгоритм, как и в программе от Zenner.

разбираюсь потихоньку.

спасибо.

Если интересно, мой исходник тахометра .

Точность можете оценить :) Модель там приложена.

спасибо и Вам за участие!

Парни, учтите, что при одном импульсе на цилиндр, за 1 оборот коленвала с датчика поступают два импульса, т.к. срабатывают два цилиндра за 1 оборот. Не забудьте.

учту! т.к. частоту буду брать с контакта катушки.

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


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

to Zenner : что-то я совсем запутался.

вот код:

/*****************************************************                        
Chip type           : ATmega16
Clock frequency     : 8,000000 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 256
*****************************************************/

#include <mega16.h>

// Alphanumeric LCD Module functions
#asm
  .equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>
#include <delay.h>
#include <stdio.h>

unsigned char buffer_dec [33];
volatile unsigned char c;        	//количество прерываний таймера2
volatile unsigned long int counter;    	//здесь хранятся пойманые импульсы


// Timer 1 overflow interrupt service routine   
interrupt [TIM1_OVF] void timer1_comp_isr(void) //прерывание по совпадению таймера1
{ 
counter++;        
}

interrupt [TIM2_COMP] void timer2_comp_isr(void)  //прерывание по совпадению таймера2
{
if(c<125){c++;}
else
{	
   TCCR1B = 0; TCNT1 = 0;  //останавливаем таймер1
   sprintf(buffer_dec,"F = %u.%u kHz",counter/10,counter%10);lcd_gotoxy(0,0);lcd_puts(buffer_dec);//выводим
   counter = 0;//очищаем переменную для счёта импульсов
   c=0;//очищаем количество прерываний таймера2
   TCCR1B=0x0F; //0b00001111 запускаем таймер1
   TCNT2 = 0;//обнуляем таймер2
}
}

void timerinit()            	//инициализируем таймеры
{
// Timer/Counter 2 initialization
ASSR=0x00;
TCCR2=0x0F;  //0b00001111 таймер2, тактируем от Fosc/1024, режим СТС
TCNT2=0x00;
OCR2=0x7C; //124

// Timer/Counter 1 initialization
TCCR1A=0x00;
TCCR1B=0x0F; //0b00001111  таймер1, режим СТС, внешнее тактирование по нарастающему фронту 
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;

OCR1AH=0x00; //OCR1A = 99
OCR1AL=0x63;

OCR1BH=0x00;
OCR1BL=0x00; 

TIMSK =0x90;//установить биты 7 и 4 OCIE2 и OCIE1A по даташиту меги16;
}
void main(void)
{
// Input/Output Ports initialization
PORTA=0x00;
DDRA=0x00;

PORTB=0x00;
DDRB=0x00;

PORTC=0x00;
DDRC=0x00;

PORTD=0x00;
DDRD=0x00;


// LCD module initialization
lcd_init(16); 
#asm("sei")

timerinit(); 

while (1)
     { 
     };
}
';

в итоге: на жк дисплей ничего не выводится. эмулирую в протеусе.

если тупо вставить sprintf(buffer_dec,"F = %u.%u kHz",counter/10,counter%10);lcd_gotoxy(0,0);lcd_puts(buffer_dec); в цикл while (1) , то показывает F = 0.0 kHz

в чем засада?

тут проект протеусаtaho.rar

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

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


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

А порт ещё жив? Ато он у вас DDRx = FF. Импульсы куда подавать то будем, если у нас всё выходы?

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


Ссылка на сообщение
Поделиться на других сайтах
Юрец    9
А порт ещё жив? Ато он у вас DDRx = FF. Импульсы куда подавать то будем, если у нас всё выходы?

да... косячек. исправил. результат такой-же. (сгореть-не сгорит. пока проверяю в протеусе).

в программе не происходит прерывание таймера1. импульсы на ногу Т1 поступают.

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


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

А никто не забыл, что для тахометра частоты довольно низкие? И данный метод (временные ворота организуются фиксированным интервалом) работает хорошо для высоких частот, а на низких - даже пропуск одного импульса (интервал закончился на серединке между импульсами) даст существенную погрешность. В подобных случаях, ворота организуют именно сигнальными импульсами, подсчитывая потом таймерные тики. В хороших частотомерах, эти два метода работают по отдельности, каждый в своем диапазоне. Граница диапазонов - там где погрешности двух методов уравниваются...

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


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

2 Юрец

Ну раз >>>в итоге: на жк дисплей ничего не выводится.<<<, то прерывание таймера2 тоже не работает.

Ошибка: не TIM1_OVF, а TIM1_COMPA - у нас ведь режим совпадения.

***добавлено***

хз. скомпилировал твой код в CVAVR - прерывания не происходят

скомпилировал в AVR-GCC - всё работает, пруфскрин прикрепляю к посту.

Так что с причудами CVAVR-а пускай его знатоки разбираются.

post-23328-1250239530_thumb.jpg

Изменено пользователем Zenner

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


Ссылка на сообщение
Поделиться на других сайтах
Юрец    9
Ошибка: не TIM1_OVF, а TIM1_COMPA - у нас ведь режим совпадения.

точно! исправил. не работает.

пошел по старому пути. только таймер использовал 16-ти битный. х.з. в чем дело, но заработало:

post-14455-1250314934_thumb.jpg

всем СПАСИБО!

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

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


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

И всё же мне было интересно где собака зарылась...Переписал во всевозможных вариантах - не работает и всё тут.

Поменял камень - работает, обратно мег16 - нет!

Вобщем, в CVAVR кривой хидер mega16.h, чтоб исправить - копируем в него дефайны из mega32.h и радуемся.

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


Ссылка на сообщение
Поделиться на других сайтах
Юрец    9
Вобщем, в CVAVR кривой хидер mega16.h, чтоб исправить - копируем в него дефайны из mega32.h и радуемся.

спасибо за помощь! попробую обязательно!

хочу перейти с cvcar на avr studio. скачал winawr, avr studio 4.16. многое непонятно (начиная с того, как на пруфскрине увидел работу avr studio с proteus). пытаюсь вникнуть. (большая разница в синтаксисе, в регистрах...).

что можете порекомендовать для лучшего понимания работы в этой связке?

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

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


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

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

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

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

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

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

Войти

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

Войти сейчас


  • Сообщения

    • Да, они занижены. Ночью в мой кипящий мозг пришла мысль, что они занижены ровно в два раза, поэтому и метки выставляются. Сегодня пришлось ехать на дачу, поэтому не занимался им.
    • Для этой цели давно использую цифровой фотоапарат - фоткаю плату с разных углов и ракурсов на макросъемке (для тех, кто не знает - специальный режим для съемки с очень близкого расстояния) и увеличиваю на компьютере до читабельного размера. Программные регуляторы гаммы, яркости и контраста помогут разглядеть даже мелкие пылинки на плате. Очень удобный метод и для рассматривания элементов и срисовывания схем.    
    • Может быть такое что китайцы палево просто покарявят что бы выглядело б.у.шым и шлют шлак? 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 порт компьютера), а источник опорного напряжения, который я на схеме обозначил как "Объект измерения"  от другого БП. Земли не объединил! В итоге получил неустойчивые показания, но сравнимые с показаниями контрольного мультиметра. Сейчас уже поздно, завтра попробую запитать коннтроллер от нормального блока питания. Возможно с компьютера прёт всякая хрень по питанию. Но в связи с этим вопрос. А может и не надо объединять земли питания АЦП и измеряемую цепь?