asis-kbr.ru

автоматические системы и системы безопасности
Текущее время: 18 июн 2018, 13:18

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
СообщениеДобавлено: 23 мар 2016, 13:37 
Не в сети

Зарегистрирован: 06 ноя 2013, 15:06
Сообщения: 15
Добрый день, Сергей! У меня такой вопрос, Вам не приходилось писать измеритель частоты для какого-нибудь проекта. У меня есть задача измерять частоту от 150 гц до 10кГц, с точностью 1гц в одном проекте. Нужно использовать пин модуля захвата ICP, это обязательно, так как нет возможности поменять схему, туда приходит входной сигнал. У меня есть код, который довольно таки точно измеряет частоту, но там есть глюк, который я никак не могу найти, иногда значение измеренной частоты оказывается примерно в два раза больше или меньше, чем реальное значение частоты, поданное на вход. Не могли бы Вы, если не сложно, конечно, посмотреть код или, если есть наработки, предложить свой вариант измерения частоты с помощью модуля захвата. Я прикрепил проект для AVR Studio 4 контроллер ATMEGA328. Там просто измерение частоты и вывод значения в UART. Заранее большое спасибо!


Вложения:
FreqMeasure.zip [36.09 КБ]
Скачиваний: 145
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 02 апр 2016, 03:08 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 19 янв 2012, 12:52
Сообщения: 575
Откуда: KBR
Вроде помог перенос этой строчки, почти в самый конец функции...
Цитата:
TIFR1 = (1<<ICF1)|(1<<TOV1); // clear flags so we don't get a bogus interrupt
поставил перед последней командой sei ();




Получилось так:
Код:
void prepareForInterrupts ()
{
   cli();  // protected code
   first = true;
   triggered = false;  // re-arm for next time
   // reset Timer 1
   TCCR1A = 0;
   TCCR1B = 0;

   TCNT1 = 0;          // Counter to zero
   overflowCount = 0;  // Therefore no overflows yet

   // Timer 1 - counts clock pulses
   TIMSK1 = (1<<TOIE1)|(1<<ICIE1);   // interrupt on Timer 1 overflow and input capture
   // start Timer 1, no prescaler
   TCCR1B =  (1<<CS10)|(1<<ICES1)|(1<<ICNC1);  // plus Input Capture Edge Select (rising on D8)

   TIFR1 = (1<<ICF1)|(1<<TOV1);  // clear flags so we don't get a bogus interrupt
   sei();
}


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 02 апр 2016, 21:36 
Не в сети

Зарегистрирован: 06 ноя 2013, 15:06
Сообщения: 15
Работает отлично! Спасибо огромное за помощь!


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


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

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB