реклама на сайте
подробности

 
 
> Частотомер на Atmega8 (CVAVR)
ps1x
сообщение Jun 9 2010, 17:23
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 300
Регистрация: 15-03-06
Из: Москва
Пользователь №: 15 284



Делаю (пытаюсь сделать) частотомер по методу предложеному =GM= тут: http://electronix.ru/forum/index.php?showtopic=29796. Но вот что то не получается. Верней получается но не совсем. Во первых если я меняю задержку между началом и концом измерения то получаю существенно разные варианты. Но в то же время, если задержка ровно 1 сек (delay_ms(1000)wink.gif то результат выводится либо равный расчетному либо чуть больше. Причем как будто бы не хватает одного переполнения таймера 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);
} }
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ps1x
сообщение Nov 3 2010, 20:50
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 300
Регистрация: 15-03-06
Из: Москва
Пользователь №: 15 284



Но ведь вроде T0 и T1 асинхронные, и считают независимо от исполнения других комманд? Сейчас автогенератор работает в режиме перевозбуждения (что не есть гуд и приводит к нелинейности), вообще планируется выходной сигнал через прецезионный выпрямитель пустить на АЦП и таким образом завести ООС, чтобы датчик был с линейной характеристикой. Поскольку частоты не велики, нет ну правда, всего-то два сигнала 10кГц каждый, думается можно вполне все успевать.

Цитата(=GM= @ Nov 4 2010, 00:40) *
2) Взять один МК с двумя схемами захвата, программа будет посложнее, но тоже реализуема в обозримое

Т.е. все таки без двух захватов не обойтись? А если программно отключать входы?
Мне сверх высокая точность не нужна, достаточно двух знаков после запятой, дальше все равно уже шумы, вибрации, и т.п.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Nov 3 2010, 22:55
Сообщение #3


Ambidexter
*****

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



Ну, вот вам ещё вариант: берёте МК с тремя таймерами и одним захватом. Входные сигналы на таймер0 и таймер2, и их же подаёте через коммутатор на схему захвата. Дальше, думаю, не надо объяснять.

Вообще, для оценки частоты с двумя знаками после запятой, вам достаточно взять время измерения 10 мс. Предположим, что время интеграции вашей системы будет больше, т.е. вы измеряете постоянную величину. Исходя из этого, вот вам ещё вариант - измеряете частоты последовательно: F1, F2, F1, F2, F1,... Измерения затем можно статистически обработать. Стандартная девиация - очень важный параметр для оценки качества, не пренебрегайте.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- ps1x   Частотомер на Atmega8 (CVAVR)   Jun 9 2010, 17:23
- - Сергей Борщ   Вы учитываете остаток в регистре таймера на момент...   Jun 10 2010, 06:02
|- - ps1x   Цитата(Сергей Борщ @ Jun 10 2010, 10:02) ...   Jun 10 2010, 09:01
- - =GM=   У вас ошибка: второе прерывание TOV1 никогда не да...   Jun 10 2010, 21:36
|- - ps1x   Цитата(=GM= @ Jun 11 2010, 01:36) У вас о...   Jun 11 2010, 08:54
|- - =GM=   Структура вашей программы в некотором смысле эклек...   Jun 11 2010, 21:28
|- - ps1x   Цитата(=GM= @ Jun 12 2010, 01:28) Структу...   Jun 12 2010, 11:43
|- - =GM=   Для вашего случая погрешность измерения приблизите...   Jun 12 2010, 12:51
|- - ps1x   Цитата(=GM= @ Jun 12 2010, 16:51) Как вы ...   Jun 12 2010, 21:51
|- - =GM=   Цитата(ps1x @ Jun 12 2010, 20:51) можно л...   Jun 13 2010, 22:22
|- - ps1x   Цитата(=GM= @ Jun 14 2010, 02:22) В принц...   Jun 14 2010, 18:46
|- - =GM=   1) Оффсет влияет на начало фронта, многое зависит ...   Jun 15 2010, 09:11
- - ps1x   CODE#include <mega8.h> //Подключение #incl...   Jun 15 2010, 09:38
|- - =GM=   1) Для начала неплохо. Каков был номинал входной ч...   Jun 15 2010, 10:34
|- - ps1x   Входная частота 1019.02173 Гц. Расчетная. По осцил...   Jun 15 2010, 11:36
|- - =GM=   Разница М2-М1 всё время где-то 1033-1034, это прие...   Jun 15 2010, 12:03
- - ps1x   Кодreset aN1=65536 M1=98 ntick1=0 ntick2=1 N2=125...   Jun 15 2010, 12:50
|- - =GM=   Теперь мне не нравится, что ntick1 всё время равен...   Jun 15 2010, 14:05
|- - ps1x   Цитата(=GM= @ Jun 15 2010, 18:05) Признав...   Jun 15 2010, 14:58
|- - =GM=   Цитата(ps1x @ Jun 15 2010, 13:58) Входной...   Jun 15 2010, 15:35
- - ps1x   А DDR соответствующих ножек влияет? Подтяжка? Сейч...   Jun 15 2010, 16:02
|- - =GM=   Да, надо соединить Т0 и ICP с генератором меандра....   Jun 15 2010, 16:23
- - ps1x   Появилась стабильность Значения 1018.8184 - 1018....   Jun 15 2010, 19:22
|- - =GM=   Ну, я рад за вас. Выбросы происходят из-за того са...   Jun 15 2010, 19:36
- - ps1x   Автогенератор в институте, и схемы от него нет, да...   Jun 15 2010, 20:21
|- - =GM=   Цитата(ps1x @ Jun 15 2010, 19:21) Может б...   Jun 16 2010, 10:10
|- - ps1x   Цитата(=GM= @ Jun 16 2010, 14:10) 4) Пров...   Jun 16 2010, 13:31
|- - =GM=   Не понял, по-подробнее можно?   Jun 16 2010, 14:33
|- - ps1x   Ваш пост из того топика.   Jun 16 2010, 14:51
|- - =GM=   Ну что, ps1x, есть подвижки? В принципе, я нашёл р...   Jun 21 2010, 15:31
|- - ps1x   Цитата(=GM= @ Jun 21 2010, 19:31) Ну что,...   Jun 23 2010, 18:37
|- - =GM=   Попробуйте следующий код, для ваших целей должен п...   Jun 24 2010, 21:56
|- - ps1x   Работает прекрасно +/- 0.0001 мкС Большущее спаси...   Jun 25 2010, 10:27
|- - =GM=   На здоровье. Но 0,0001 мкс - это 0,1 нс, вы не ош...   Jun 25 2010, 11:19
|- - demiurg_spb   Цитата(=GM= @ Jun 25 2010, 15:19) На здор...   Jun 25 2010, 12:00
||- - =GM=   Цитата(demiurg_spb @ Jun 25 2010, 11:00) ...   Jun 25 2010, 13:06
||- - demiurg_spb   Цитата(=GM= @ Jun 25 2010, 17:06) Я уж ис...   Jun 27 2010, 19:19
||- - =GM=   1) В чём конкретно вы видите лёгкое неудобство от ...   Jun 28 2010, 11:34
||- - demiurg_spb   Цитата(=GM= @ Jun 28 2010, 15:34) 1) В чё...   Jun 28 2010, 17:34
||- - =GM=   Цитата(demiurg_spb @ Jun 28 2010, 16:34) ...   Jun 28 2010, 21:56
|- - ps1x   Цитата(=GM= @ Jun 25 2010, 15:19) Но 0,00...   Jun 26 2010, 09:13
- - ps1x   Пожалуй, подниму тему из глубин форума. Встала зад...   Nov 3 2010, 11:50
- - akl   В mega8 есть аналоговый компаратор, имеющий доступ...   Nov 3 2010, 16:19
|- - ps1x   Цитата(akl @ Nov 3 2010, 20:19) В mega8 е...   Nov 3 2010, 18:15
- - akl   Цитата(ps1x @ Nov 3 2010, 15:50) Судя по ...   Nov 3 2010, 18:39
|- - =GM=   Если измерять частоты надо одновременно, то вот ва...   Nov 3 2010, 20:40
- - horoc   =GM= Заинтересовался Вашим способом, давно хотел с...   Nov 7 2010, 13:54
|- - =GM=   Ну, трудно обьяснить, попробую. Цикл do ... whil...   Nov 7 2010, 18:52
- - horoc   Я поэкспериментировал немного, сделал вот так. К...   Nov 7 2010, 19:16
- - horoc   Вот еще на танцевал с бубном =GM= благодарю...   Nov 7 2010, 21:06
- - Pikt   Приветствую. Я плохо разбираюсь пока что в микроко...   Jun 19 2011, 11:32
- - =GM=   Пойдёт. Выходной сигнал - двоичное число в операт...   Jun 20 2011, 13:05


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 16:13
Рейтинг@Mail.ru


Страница сгенерированна за 0.01486 секунд с 7
ELECTRONIX ©2004-2016