|
Частотомер на Atmega8 (CVAVR) |
|
|
|
Jun 9 2010, 17:23
|
Местный
  
Группа: Свой
Сообщений: 300
Регистрация: 15-03-06
Из: Москва
Пользователь №: 15 284

|
Делаю (пытаюсь сделать) частотомер по методу предложеному =GM= тут: http://electronix.ru/forum/index.php?showtopic=29796. Но вот что то не получается. Верней получается но не совсем. Во первых если я меняю задержку между началом и концом измерения то получаю существенно разные варианты. Но в то же время, если задержка ровно 1 сек (delay_ms(1000)  то результат выводится либо равный расчетному либо чуть больше. Причем как будто бы не хватает одного переполнения таймера 1 т.е. Perepol_Timer1++; и число N1 получается на 65536 меньше. Из за чего результат чуть больше. Но куда оно может пропасть? код вообще то взят в основном отсюда http://pro-radio.ru/controllers/5978/(с комментариями) но там не работает регистрация поэтому спрашиваю тут. Код char gate; static float Fx; unsigned long int N, N0, M, M0, N1, M1; unsigned int Perepol_Timer0=0, Perepol_Timer1=0, count_T1, count_T0,Perepol_Timer1_real;
//Прерывание по переполнению Timer/Counter 0 interrupt [TIM0_OVF] void timer0_ovf_isr(void){ Perepol_Timer0++;//Увеличение переменной на 1 }
//Прерывание по переполнению Timer/Counter 1 interrupt [TIM1_OVF] void timer1_ovf_isr(void){ if (gate){ Perepol_Timer1++;//Увеличение переменной на 1 } }
//Прерывание по захвату Timer/Counter 1 interrupt [TIM1_CAPT] void timer1_capt_isr(void){ count_T1=ICR1;//Значение регистра ICR1 переписывается в переменную count_T0=TCNT0;//Значение регистра TCNT0 переписывается в переменную TIMSK&=0xDF;//Запрет прерывания по захвату if (TIFR&0b00000100==1){ Perepol_Timer1++; TIFR&=0b00000100; } }
while (1){//Бесконечный цикл #asm("cli") gate=0; Perepol_Timer1=0;//Обнуление переменной Perepol_Timer0=0;//Обнуление переменной #asm("sei")//Разрешения прерываний TIMSK|=0x20;//Разрешили захват gate=1; while ((TIFR&0x20)==0x20){}//Ожидание прерывания по захвату Perepol_Timer1_real = Perepol_Timer1; N0=(((unsigned long int)(Perepol_Timer1_real))<<16)+count_T1; //Расчет общего количества тиков системной частоты M0=(((unsigned long int)(Perepol_Timer0))<<8)+count_T0;//Расчет общего количества тиков входной частоты //sprintf(lcd_buffer, "PT1=%u;CT1=%u;PT0=%u;CT0=%u;\r", Perepol_Timer1_real, count_T1, Perepol_Timer0, count_T0); //puts(lcd_buffer); delay_ms(1000);//Задержка на 1 с TIMSK|=0x20;//Разрешили захват gate=0; while ((TIFR&0x20)==0x20){}//Ожидание прерывания по захвату Perepol_Timer1_real = Perepol_Timer1; N1=(((unsigned long int)(Perepol_Timer1_real))<<16)+count_T1; //Расчет общего количества тиков системной частоты M1=(((unsigned long int)(Perepol_Timer0))<<8)+count_T0;//Расчет общего количества тиков входной частоты sprintf(lcd_buffer, "PT1=%u;CT1=%u;PT0=%u;CT0=%u;\r", Perepol_Timer1_real, count_T1, Perepol_Timer0, count_T0); puts(lcd_buffer); N=(N1-N0);//Расчет количества тиков системной частоты за время измерения M=(M1-M0);//Расчет количества тиков входной частоты за время измерения
Fx=12000000.0*(float)M/(float)N;//Вычисление частоты входного сигнала putchar('c'); sprintf(lcd_buffer, "F=%0.6fHz", Fx); lcd_clear(); lcd_puts(lcd_buffer); puts(lcd_buffer); putchar(13); } }
|
|
|
|
|
 |
Ответов
(30 - 44)
|
Jun 25 2010, 10:27
|
Местный
  
Группа: Свой
Сообщений: 300
Регистрация: 15-03-06
Из: Москва
Пользователь №: 15 284

|
Работает прекрасно  +/- 0.0001 мкС Большущее спасибо!
|
|
|
|
|
Jun 25 2010, 11:19
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
На здоровье.
Но 0,0001 мкс - это 0,1 нс, вы не ошиблись?
Меня ваш проект заинтересовал постольку, поскольку он написан на си (который я местами недолюбливаю :-), а на форуме было много вопросов, как реализовать мой алгоритм именно на си, но что-то все кодеры пропадали, не дойдя до конечного результата. Теперь одна из реализаций налицо, буду на неё ссылаться при случае :-).
Ещё, интересно было бы выяснить, какую максимальную частоту вы сможете измерить без переделки программы? С небольшими изменениями вы можете мерить до половины тактовой, в вашем случае до 6 МГц.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Jun 25 2010, 12:00
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(=GM= @ Jun 25 2010, 15:19)  На здоровье. Простите, что вклиниваюсь, но возникает у меня вопросик. А что будет с прибором, когда частота очень низкая или её нет вовсе? Может я что не понял, но в коде есть "бесконечные" циклы, ожидающие события от периферии...
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Jun 25 2010, 13:06
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(demiurg_spb @ Jun 25 2010, 11:00)  Простите, что вклиниваюсь, но возникает у меня вопросик. А что будет с прибором, когда частота очень низкая или её нет вовсе? Может я что не понял, но в коде есть "бесконечные" циклы, ожидающие события от периферии... Я уж испугался, что будет вопросик про Балеру или, того хуже, про прачечную :-). Это у вас с переездом связано, что ли? 1) У автора стоит автогенератор, вырабатывающий частоты в диапазоне 2-10 кГц, так что частота должна быть. 2) С другой стороны, если нет частоты, то вроде бы нечего отображать. 3) Однако, вы абсолютно правы в том, что данная программа имеет некоторые ограничения (как и всё в этом мире, впрочем). В программе нет модуля оценки входной частоты, просто в данном топике задача была не представить полностью коммерческий продукт, а немного другая, именно - написать программу на си для измерения частоты с минимальной погрешностью. Код программы открыт, так что, кому надо могут модифицировать его под себя. Задача в основном достигнута, 1000 Гц измеряются с СЕМЬЮ верными цифрами. Кстати, методом ворот можно достичь только ТРИ значащие цифры.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Jun 26 2010, 09:13
|
Местный
  
Группа: Свой
Сообщений: 300
Регистрация: 15-03-06
Из: Москва
Пользователь №: 15 284

|
Цитата(=GM= @ Jun 25 2010, 15:19)  Но 0,0001 мкс - это 0,1 нс, вы не ошиблись? Наверное ошибся. +/-0.0001 Гц было точно при частоте ~1018 гц Цитата(=GM= @ Jun 25 2010, 15:19)  Ещё, интересно было бы выяснить, какую максимальную частоту вы сможете измерить без переделки программы? С небольшими изменениями вы можете мерить до половины тактовой, в вашем случае до 6 МГц. Завтра попробую.
|
|
|
|
|
Jun 27 2010, 19:19
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(=GM= @ Jun 25 2010, 17:06)  Я уж испугался, что будет вопросик про Балеру или, того хуже, про прачечную :-). Это у вас с переездом связано, что ли? Да нет:-) Разработчики пока на старом месте останутся. Цитата 1) У автора стоит автогенератор, вырабатывающий частоты в диапазоне 2-10 кГц, так что частота должна быть. 2) С другой стороны, если нет частоты, то вроде бы нечего отображать. 3) Однако, вы абсолютно правы в том, что данная программа имеет некоторые ограничения (как и всё в этом мире, впрочем). В программе нет модуля оценки входной частоты, просто в данном топике задача была не представить полностью коммерческий продукт, а немного другая, именно - написать программу на си для измерения частоты с минимальной погрешностью. Код программы открыт, так что, кому надо могут модифицировать его под себя.
Задача в основном достигнута, 1000 Гц измеряются с СЕМЬЮ верными цифрами. Кстати, методом ворот можно достичь только ТРИ значащие цифры. Понятно. Но я вижу лёгкое неудобство в том что надо детектировать наличие частоты. Я в своём тахометре работаю по двум алгоритмам и когда надо перехожу с одного на другой. Но как всегда есть одно но. Хочется повысить быстродействие измерительного канала и при этом не потерять в точности, вот я и приглядываюсь к Вашему методу. Пока лишь смотрю, т.к. сразу не вижу простого и красивого способа его применить.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Jun 28 2010, 11:34
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
1) В чём конкретно вы видите лёгкое неудобство от детектирования?
2) Так всё таинственно, ну расскажите, что за алгоритмы...
3) Не знаю, что вы понимаете под красиво и легко, но посмотрел вполглаза на паспорт вашего тахометра, и увидел, что ваша "детская" погрешность в 1 Гц для 1000 Гц моим методом может быть легко превышена за время измерения 0,001 с (с погрешностью не более +-0,1 Гц).
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Jun 28 2010, 17:34
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(=GM= @ Jun 28 2010, 15:34)  1) В чём конкретно вы видите лёгкое неудобство от детектирования? Теряется единообразие для быстрых и медленных частот (у меня же от 0,001Гц индикация работает). Да и со свободными таймерами могут быть напряги. Надо попробовать т.к это лишь предположения:-) Цитата 2) Так всё таинственно, ну расскажите, что за алгоритмы... Считаю либо кол-во импульсов за секунду, либо интервалы между импульсами, а переключаюсь по условию наименьшей погрешности измерения. Цитата 3) Не знаю, что вы понимаете под красиво и легко, но посмотрел вполглаза на паспорт вашего тахометра, и увидел, что ваша "детская" погрешность в 1 Гц для 1000 Гц моим методом может быть легко превышена за время измерения 0,001 с (с погрешностью не более +-0,1 Гц). При этом имеем динамическую индикацию и клавиатуру, modbus до 921.6КБод, DAC, счётчик импульсов и счётчик времени наработки, внешние логические входы-выходы и ещё всякого разного функционала немало наберётся, да и бутлоадер отъедает часть флеша. Я не спорю, что можно лучше, я даже уверен в этом. Но ресурсов контроллера уже особо не хватает на сильный импрувмент:-( Приборчик то старенький уже, сейчас бы на кортексе делал а не на 16 (162)-ой меге. Вот я и примеряюсь, обдумываю неспешно, т.к. текущий проект много сил требует... Как вспомню, сколько нервов истратил на его сертификацию в Морском регистре, уууу.... то дисплей им с регулировкой яркости подавай, то корпус горючий, то питание =24В с нехилым гистерезисом и все эти требования постепенно выдают ведь собаки такие:-)
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Jun 28 2010, 21:56
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(demiurg_spb @ Jun 28 2010, 16:34)  Теряется единообразие для быстрых и медленных частот (у меня же от 0,001Гц индикация работает) Ну, это вы ещё не прочувствовали мой алгоритм, в этом плане он универсальный. Можно или задаться числом периодов M=1, когда измеряете период длинного импульса, близкого к интервалу наблюдения, или целое число периодов М>1, также близкого к интервалу наблюдения, когда измеряете более короткие импульсы. Вся прелесть метода в том, что погрешность измерения минимальна всегда, невзирая на номинал входной частоты, поэтому не надо переключаться с одного алгоритма на другой, полное "единообразие" по-вашему.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Nov 3 2010, 16:19
|
Частый гость
 
Группа: Свой
Сообщений: 127
Регистрация: 4-04-07
Из: Ижевск
Пользователь №: 26 773

|
В mega8 есть аналоговый компаратор, имеющий доступ к модулю CAPT таймера1 и непосредственно вход ICP1. Переключаясь программно между двумя режимами работы таймера, можно измерить обе частоты. Цитата(=GM= @ Jun 29 2010, 01:56)  ...Можно или задаться числом периодов M=1, когда измеряете период длинного импульса, близкого к интервалу наблюдения, или целое число периодов М>1, также близкого к интервалу наблюдения, когда измеряете более короткие импульсы. Вся прелесть метода в том, что ... Задаваться числом М можно, но ведь заранее неизвестно, какой сигнал придет, а вот подсчитать целые числа M и N за выбранный примерно интервал измерения - запросто.
|
|
|
|
|
Nov 3 2010, 18:15
|
Местный
  
Группа: Свой
Сообщений: 300
Регистрация: 15-03-06
Из: Москва
Пользователь №: 15 284

|
Цитата(akl @ Nov 3 2010, 20:19)  В mega8 есть аналоговый компаратор, имеющий доступ к модулю CAPT таймера1 и непосредственно вход ICP1. Переключаясь программно между двумя режимами работы таймера, можно измерить обе частоты. Мне тут умные люди подсказали что при измерении двух струн собственно измерения должны проводиться одновременно. В таком случае может использовать T0 и T1 входы таймеров а подключать их программно через транзистор? без ICP... А на входе поставить внешний компаратор, например lm339n. ps. А вот и GM!
|
|
|
|
|
Nov 3 2010, 18:39
|
Частый гость
 
Группа: Свой
Сообщений: 127
Регистрация: 4-04-07
Из: Ижевск
Пользователь №: 26 773

|
Цитата(ps1x @ Nov 3 2010, 15:50)  Судя по всему нужно подключать датчики и считать по очереди. Я исходил из этого. По новой вводной можно сказать -если две струны это составляющие одного преобразователя -если они возбуждаются индивидуальными автогенераторами, причем исключена возможность их взаимосинхронизации -если будут учтены различия в работе Т0 и Т1, то, наверно, можно. ИМХО, я бы, в таком случае, поставил две ATtiny2313 с тактированием от одного кварцевого генератора.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|