Электроника - это просто Теоретические и практические вопросы для начинающих электронщиков. |
11.07.2012, 15:08
|
|
Частый гость
Регистрация: 02.04.2009
Сообщений: 42
Сказал спасибо: 4
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
Частотомер Atmega 128
Доброго времени суток.
Появилась у меня задача. сделать частотомер на atmega 128, с точностью до 0,1 Гц. диапазон частот - 20 -200 Гц, время измерения ‹ 1с, у меня пока получилось считать целые значения, частоты, а вот с десятыми долями - уже проблема из-за того что измеряемые частоты низкие,
контроллер atmega 128 с кварцем 8 МГц.
я пользую 8ми разрядный таймер 2. его конфигурация
TCCR2=0x02;
TCNT2=0xF7;
OCR2=0x00;
я пытаюсь посчитать период а потом из него вывести частоту
long int tick = 0;
int prev_cond = 0;
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
long int p = 0;
// Reinitialize Timer2 value
TCNT2=0xF7;
// Place your code here
++tick;
if(PINB.4 != prev_cond && !prev_cond) // смотрим восходящий ли фронт
{
p = 1000000 / (40 * tick);
printf("f = %dl t = %d", p, tick);
putchar(0x0D);
tick = 0;
}
PORTD.0 = 1 - PORTD.0;
prev_cond = PINB.4;
}
после такой настройки таймера по идее прерывания будут возникать с частотой 100 кГц (поправьте меня если я ошибаюсь), но получается очень большая погрешность. Поэтому обращаюсь к знающим людям, поправьте ошибку или предложите другой способ (желательно с подробным описанием, либо ссылкой на урок, статью, тему и т.д.)
|
|
|
Сказали "Спасибо" deeman30rus
|
|
|
11.07.2012, 15:11
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Частотомер Atmega 128
На малых частотах измеряют длительность одного импульса много раз, затем усредняют результат. На больших измеряют количество импульсов за период времени. Велосипед!!!
|
|
|
Сказали "Спасибо" Easyrider83
|
|
|
11.07.2012, 15:23
|
|
Заблокирован
Регистрация: 27.03.2007
Сообщений: 1,328
Сказал спасибо: 12
Сказали Спасибо 576 раз(а) в 460 сообщении(ях)
|
Re: Частотомер Atmega 128
Вам нужно убрать из обработчика прерывания все вычисления и поместить их в основную процедуру main().
Типа этого
Код:
|
long int p = 0;
long int result_tick=10000;
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
// Reinitialize Timer2 value
TCNT2=0xF7;
// Place your code here
++tick;
if(PINB.4 != prev_cond && !prev_cond) // смотрим восходящий ли фронт
{
result_tick=tick;
tick = 0;
}
main()
{
while(1)
{
p = 1000000 / (40 * result_tick);
printf("f = %dl t = %d", p, result_tick);
putchar(0x0D);
}
} |
Последний раз редактировалось Yurkin2007; 11.07.2012 в 15:26.
|
|
|
Сказали "Спасибо" Yurkin2007
|
|
|
11.07.2012, 15:26
|
|
Почётный гражданин KAZUS.RU
Регистрация: 01.04.2009
Адрес: Рязань
Сообщений: 1,140
Сказал спасибо: 21
Сказали Спасибо 635 раз(а) в 344 сообщении(ях)
|
Re: Частотомер Atmega 128
Сообщение от Easyrider83
|
На малых частотах измеряют длительность одного импульса много раз, затем усредняют результат.
|
Не длительность, а период. Сигнал то на входе могет иметь абсолютно любую скважность.
|
|
|
Сказали "Спасибо" _guardianangel
|
|
|
15.07.2012, 14:25
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,446
Сказал спасибо: 99
Сказали Спасибо 317 раз(а) в 233 сообщении(ях)
|
Re: Частотомер Atmega 128
Во всех приложениях, критичных к точности временных интервалов, надо использовать режим CTC таймера.
|
|
|
Сказали "Спасибо" Godzilla82
|
|
|
24.07.2012, 07:43
|
|
Частый гость
Регистрация: 02.04.2009
Сообщений: 42
Сказал спасибо: 4
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
Re: Частотомер Atmega 128
Спасибо тем кто откликнулся, я сделал, использовал Capture и мерил длину импульса при 1000 кГц стабильно работает от 17 Гц,
режим таймера выставлял Normal ибо в СТС он не заходил в прерывания, а прерывание поставил по верхнему фронту, так и получилось, что он мерил длительность каждого второго импульса !
кстати, у меня такой вопрос, я использую Cvavr для программирования и Proteus для моделирования, но получается что при выводе в UASRT в функции printf, я не могу выводить числа с плавающей точкой, ставлю printf("%f", n) он вместо неё выводит пустую строку, думал гонит протеус, оказывается нет, если зашить контроллер и потестить каким-нибудь TESTCOM там действительно вылазит пустая строка, кто-нибудь знает почему ?
upd, порылся в инете есть подозрение что codevision пользует урезанную библиотеку, как можно посмотреть её версию ?
Последний раз редактировалось deeman30rus; 24.07.2012 в 10:09.
Причина: upd
|
|
|
Сказали "Спасибо" deeman30rus
|
|
|
24.07.2012, 23:57
|
|
Супер-модератор
Регистрация: 03.05.2007
Сообщений: 2,695
Сказал спасибо: 28
Сказали Спасибо 4,509 раз(а) в 956 сообщении(ях)
|
Re: Частотомер Atmega 128
Сообщение от deeman30rus
|
получается что при выводе в UASRT в функции printf, я не могу выводить числа с плавающей точкой, ставлю printf("%f", n) он вместо неё выводит пустую строку,
|
Может все-таки разрешить сначала выводить float в UART? А в самой функции не мешало бы и формат указать... Утренняя зарядка по картинкам: делай раз, делай два.
|
|
|
Эти 2 пользователя(ей) сказали Спасибо Halex07 за это сообщение:
|
|
|
25.07.2012, 07:29
|
|
Частый гость
Регистрация: 02.04.2009
Сообщений: 42
Сказал спасибо: 4
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
Re: Частотомер Atmega 128
muchas gracias señor
|
|
|
Сказали "Спасибо" deeman30rus
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
ATmega 128 . Пытаюсь запустить таймер Т2...
|
home2010 |
Микроконтроллеры, АЦП, память и т.д |
7 |
31.03.2010 07:47 |
Применение LCD 128 х 64
|
KOKAinOFF |
Микроконтроллеры, АЦП, память и т.д |
3 |
10.08.2007 11:31 |
AT90CAN 32/64/128 в PROTEUS
|
moyaproba |
Микроконтроллеры, АЦП, память и т.д |
0 |
02.03.2007 10:36 |
4-битный режим LCD при работе с Atmega 128
|
Hellka |
Микроконтроллеры, АЦП, память и т.д |
1 |
02.10.2006 14:23 |
AVRSTUDIO ATmega 48 \128\ 88
|
Tcom |
Микроконтроллеры, АЦП, память и т.д |
1 |
13.10.2005 16:12 |
Часовой пояс GMT +4, время: 07:00.
|
|