Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Электроника - это просто Теоретические и практические вопросы для начинающих электронщиков.

 
Опции темы
Непрочитано 11.07.2012, 15:08  
deeman30rus
Частый гость
 
Регистрация: 02.04.2009
Сообщений: 42
Сказал спасибо: 4
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
deeman30rus на пути к лучшему
По умолчанию Частотомер 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 вне форума  
Сказали "Спасибо" deeman30rus
warel (29.06.2019)
Непрочитано 11.07.2012, 15:11  
Easyrider83
Гуру портала
 
Аватар для Easyrider83
 
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 918
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию Re: Частотомер Atmega 128

На малых частотах измеряют длительность одного импульса много раз, затем усредняют результат. На больших измеряют количество импульсов за период времени. Велосипед!!!
Easyrider83 вне форума  
Сказали "Спасибо" Easyrider83
warel (29.06.2019)
Непрочитано 11.07.2012, 15:23  
Yurkin2007
Заблокирован
 
Регистрация: 27.03.2007
Сообщений: 1,328
Сказал спасибо: 12
Сказали Спасибо 576 раз(а) в 460 сообщении(ях)
Yurkin2007 на пути к лучшему
По умолчанию 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 вне форума  
Сказали "Спасибо" Yurkin2007
warel (29.06.2019)
Непрочитано 11.07.2012, 15:26  
_guardianangel
Почётный гражданин KAZUS.RU
 
Регистрация: 01.04.2009
Адрес: Рязань
Сообщений: 1,140
Сказал спасибо: 21
Сказали Спасибо 635 раз(а) в 344 сообщении(ях)
_guardianangel на пути к лучшему
По умолчанию Re: Частотомер Atmega 128

Сообщение от Easyrider83 Посмотреть сообщение
На малых частотах измеряют длительность одного импульса много раз, затем усредняют результат.
Не длительность, а период. Сигнал то на входе могет иметь абсолютно любую скважность.
_guardianangel вне форума  
Сказали "Спасибо" _guardianangel
warel (29.06.2019)
Непрочитано 11.07.2012, 19:29  
Halex07
Супер-модератор
 
Аватар для Halex07
 
Регистрация: 03.05.2007
Сообщений: 2,695
Сказал спасибо: 28
Сказали Спасибо 4,508 раз(а) в 956 сообщении(ях)
Halex07 на пути к лучшему
По умолчанию Re: Частотомер Atmega 128

Сообщение от deeman30rus Посмотреть сообщение
диапазон частот - 20 -200 Гц, время измерения ‹ 1с
На таких частотах идеально Capture. Вот навскидку:
http://http://chipenable.ru/index.ph...-timer-t1.html
http://electronix.ru/forum/index.php...29796&st=0
Ну или ищите сами про измерение временных интервалов с помощью захвата таймера.
Halex07 вне форума  
Сказали "Спасибо" Halex07
warel (29.06.2019)
Непрочитано 15.07.2012, 14:25  
Godzilla82
Почётный гражданин KAZUS.RU
 
Регистрация: 29.10.2006
Сообщений: 1,447
Сказал спасибо: 96
Сказали Спасибо 318 раз(а) в 233 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение Re: Частотомер Atmega 128

Во всех приложениях, критичных к точности временных интервалов, надо использовать режим CTC таймера.
Godzilla82 вне форума  
Сказали "Спасибо" Godzilla82
warel (29.06.2019)
Непрочитано 24.07.2012, 07:43  
deeman30rus
Частый гость
 
Регистрация: 02.04.2009
Сообщений: 42
Сказал спасибо: 4
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
deeman30rus на пути к лучшему
По умолчанию 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 вне форума  
Сказали "Спасибо" deeman30rus
warel (29.06.2019)
Непрочитано 24.07.2012, 23:57  
Halex07
Супер-модератор
 
Аватар для Halex07
 
Регистрация: 03.05.2007
Сообщений: 2,695
Сказал спасибо: 28
Сказали Спасибо 4,508 раз(а) в 956 сообщении(ях)
Halex07 на пути к лучшему
По умолчанию Re: Частотомер Atmega 128

Сообщение от deeman30rus Посмотреть сообщение
получается что при выводе в UASRT в функции printf, я не могу выводить числа с плавающей точкой, ставлю printf("%f", n) он вместо неё выводит пустую строку,
Может все-таки разрешить сначала выводить float в UART? А в самой функции не мешало бы и формат указать... Утренняя зарядка по картинкам: делай раз, делай два.
Миниатюры:
Нажмите на изображение для увеличения
Название: 2012-07-24_235018.gif
Просмотров: 91
Размер:	19.9 Кб
ID:	37094   Нажмите на изображение для увеличения
Название: 2012-07-24_235334.gif
Просмотров: 96
Размер:	24.3 Кб
ID:	37095  
Halex07 вне форума  
Эти 2 пользователя(ей) сказали Спасибо Halex07 за это сообщение:
deeman30rus (25.07.2012), warel (29.06.2019)
Непрочитано 25.07.2012, 07:29  
deeman30rus
Частый гость
 
Регистрация: 02.04.2009
Сообщений: 42
Сказал спасибо: 4
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
deeman30rus на пути к лучшему
По умолчанию Re: Частотомер Atmega 128

muchas gracias señor
deeman30rus вне форума  
Сказали "Спасибо" deeman30rus
warel (29.06.2019)
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
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, время: 10:02.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot