Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.87/68: Рейтинг темы: голосов - 68, средняя оценка - 4.87
ps1x
0 / 0 / 0
Регистрация: 31.05.2010
Сообщений: 7
1

Частотомер.

03.06.2010, 20:59. Просмотров 12299. Ответов 13
Метки нет (Все метки)

Делаю частотомер для струнного датчика с автогенератором, сигнал на выходе 0,3 В прямоугольный от 2 до 10 кГц.
Подключаю автогенератор на отриц. вывод компаратора Atmega8. Положительный вывод между землей и +5В для настройки.
Компаратор Меги настроен на Input capture Таймера 1. Подсчитываю кол-во тиков таймера между фронтами входного сигнала. Т.о. подсчитываю частоту.

Проверяю частотомер выходом генератора осциллографа С1-117 но получаю не 1000 Гц а 972,40 Гц и около того. Вот мой код:
Код
ftoot result;
char buff[16], tim, numizm=2, state=0;

// Timer 1 overflow interrupt service routine
interrupt [TYM1_OVF] void timer1_ovf_isr(void)
{
tim++; // увеличиваем счетчик переполнений.
}

// Timer 1 input capture interrupt service routine
interrupt [TYM1_CAPT] void timer1_capt_isr(void)
{
if (state==0){  // первый фронт сигнала
tim=0;  // обнуляем переменные и таймер
TCNT1=0;
}
state++; // прибавляем счетчик
if (state == numizm){ // если счетчик и кол-во измерений равны, то вычисляем частоту
result = 12000000 / ((ftoot)tim*65535+ICR1); // вычисляем "частоту"
result *= (int)numizm; // и умножаем на кол-во измерений, получая действительную частоту

numizm = 255; //выставляем число измерений
if (numizm < result){ // если оно меньше полученой частоты то ставим ее равной частоте ( т.о. измерение будет длиться меньше секунды)
numizm = result;
}
sprymtf(buff,"F = %0.3f Гц",result); // выводим на экран и в UART
puts(buff);
putchar(13);
lcd_clear();
lcd_puts(buff);
state = 0; // Обнуляем состояние
}
}
Профи, посмотрите пожалуйста, может что то не так увидите?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.06.2010, 20:59
Ответы с готовыми решениями:

частотомер
форумчани подскажите пожалуйста, разрабатываю вот этот частотомер...

Частотомер на Tiny12L
Всем привет! Не могу побороть программу-частотомер, прошу помощи. Код перепроверил вдоль и поперёк,...

Частотомер и atmega16
Собираюсь сделать тахометр для мотоцикла на индукционном датчике(катушке собственного изготовления)...

частотомер на atmega8
всем доброго времени. Ох... вот и я пришел со своей проблемой. Обычно помощи просят у меня, но...

Частотомер. Добавить делитель.
Приветствую. Делаю устройство, для использования на мопеде. Пафоса ради повесил большой экран...

13
Kosym
0 / 0 / 0
Регистрация: 26.04.2010
Сообщений: 801
03.06.2010, 21:23 2
Я бы не стал размещать в обработчике прерывания вывод на экран. Да и деление ftoot тоже снаружи сделал бы.
0
ps1x
0 / 0 / 0
Регистрация: 31.05.2010
Сообщений: 7
03.06.2010, 22:01 3
Цитата Сообщение от Kosym
Я бы не стал размещать в обработчике прерывания вывод на экран. Да и деление ftoot тоже снаружи сделал бы.
Я согласен, но ведь на подсчет это не должно влиять? Ведь вывод на экран, в UART и деление ftoot происходит не во время подсчета, а проверка state == numism не так длительна?
0
Kosym
0 / 0 / 0
Регистрация: 26.04.2010
Сообщений: 801
03.06.2010, 22:19 4
хотя если бы был пропуск прерывания переполнения, то измеренная частота стала бы больше. Может быть тут схема подавления шумов погрешности вносит?
0
03.06.2010, 22:19
ps1x
0 / 0 / 0
Регистрация: 31.05.2010
Сообщений: 7
03.06.2010, 22:32 5
Цитата Сообщение от Kosym
хотя если бы был пропуск прерывания переполнения, то измеренная частота стала бы больше. Может быть тут схема подавления шумов погрешности вносит?
Noise canceler выключен. Да и там погрешность во-первых 4 такта (а это 4/12000000 сек.) а во-вторых, эти же 4 такта применяются и при следующем срабатывании, так что период один хрен тот же :)
0
mokmum16
0 / 0 / 0
Регистрация: 25.02.2010
Сообщений: 402
03.06.2010, 22:36 6
Интересно, зачем Вы в строчке result *= (int)numizm; преобразуете numizm в int?
0
ps1x
0 / 0 / 0
Регистрация: 31.05.2010
Сообщений: 7
03.06.2010, 22:50 7
Цитата Сообщение от mokmum16
Интересно, зачем Вы в строчке result *= (int)numizm; преобразуете numizm в int?
Вообще это осталось от тестирования результата result *= (int)numism +1 и компилер вполне логично ругался что может быть переполнение chara. Ну а вообще на результат ведь не влияет? :)
0
mokmum16
0 / 0 / 0
Регистрация: 25.02.2010
Сообщений: 402
04.06.2010, 00:16 8
Не влияет, просто интересно было.
0
Kosym
0 / 0 / 0
Регистрация: 26.04.2010
Сообщений: 801
04.06.2010, 10:45 9
недавно делал проект с кучей вычислений, тоже не с первой попытки всё получалось. чтобы отладить на бумажке посчитал как всё должно происходить, а потом в трассировщике каждый шаг просматривал и наблюдая что происходит с переменными понял в чем проблема. Просто как мычание и эффективно
0
drvtos
1 / 1 / 0
Регистрация: 25.05.2010
Сообщений: 3,610
04.06.2010, 12:36 10
Цитата Сообщение от ps1x
Проверяю частотомер выходом генератора осциллографа С1-117 но получаю не 1000 Гц а 972,40 Гц и около того. Вот
А с какой точностью ты знаешь частоту генератора?
0
ps1x
0 / 0 / 0
Регистрация: 31.05.2010
Сообщений: 7
04.06.2010, 12:39 11
Цитата Сообщение от Kosym
недавно делал проект с кучей вычислений, тоже не с первой попытки всё получалось. чтобы отладить на бумажке посчитал как всё должно происходить, а потом в трассировщике каждый шаг просматривал и наблюдая что происходит с переменными понял в чем проблема. Просто как мычание и эффективно
А как в студии прицепить к ноге компаратора источник сигнала?
Цитата Сообщение от drvtos
А с какой точностью ты знаешь частоту генератора?
Я измерял осциллографом длительность сигнала (у осцилла есть метки) и поэтому склонен ему доверять. Плюс мне его дали в институте, не так давно и по словам преподавателя осциллограф вполне рабочий..
0
drvtos
1 / 1 / 0
Регистрация: 25.05.2010
Сообщений: 3,610
04.06.2010, 18:58 12
Цитата Сообщение от ps1x
Я измерял осциллографом длительность сигнала (у осцилла есть метки) и поэтому склонен ему доверять. Плюс мне его дали в институте, не так давно и по словам преподавателя осциллограф вполне рабочий..
Речь идет о непонятке размером 2,76%. У тебя источники погрешности:

1) погрешность развертки осциллографа по оси Х. Даже в поверенном осциллографе это не лучше 1-2%. Из института... Я работал в Политехнике 15 лет на кафедре автоматизации экспериментальных исследований. Все оборудование, которое не хотели поверять каждый год, обзывалось учебным и спокойно старело безо всякого контроля. Не думаю, что ситуация улучшилась за последние 30 лет :)

2) погрешность, с которой ты фиксируешь фронты сигнала. Возьми размер экрана по горизонтали и хоть на глазок оцени, сколько может набежать. Думаю, там тоже 1% легко появится.

Поэтому искать ошибки в алгоритме - преждевременно. Грубо говоря, заявка о несовпадении 1000 и 972,4 не есть надежной. Возьми частотомер и сравнивай.
0
ps1x
0 / 0 / 0
Регистрация: 31.05.2010
Сообщений: 7
06.06.2010, 21:05 13
Цитата Сообщение от drvtos
Речь идет о непонятке размером 2,76%. У тебя источники погрешности:
.....
И все таки что то не так с алгоритмом. Собрал генератор на тиньке26. Выводит меиндр с частотой ~1030 Гц (расчетно и измерено осциллографом). Мой "измеритель" выводит что то с потолка. Логически подумав, я пришел к выводу что алгоритм верный, видимо дело в реализации на МК. Чую надо чтото где то сбрасывать и т.п. но сколько не думал - так и не придумал.
0
okt
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 222
07.06.2010, 08:48 14
Здравствуйте. Этот метод, при ваших условиях, позволяет измерять частоту с погрешностью
P255=Fx/Fo*Tизм=10000/12000000*255*10^-4~0,03Гц( при измерении 255 периодов Fx=10кГц)
P1=Fx/Fo*Tизм=10000/12000000*1*10^-4~8,3Гц( при измерении 1 периода Fx=10кГц)
Надежда на повышение точности при усреднении 255 неточных результатов маленькая
Может поможет эта веточка. Правда, все на ассемблере и применительно к тахометру.
http://rodyokot.ru/forum/viewtopys.php?f=20&t=24703

Комментарий к статье "MSP430. Начало. MSP-FET через LPT порт"


0
07.06.2010, 08:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.06.2010, 08:48

Частотомер с шагом 0.1гц
Здравствуйте Может кто подскажет, как на AVR создать частотомер с шагом 0.1гц (диапазон 0 -...

Частотомер-Тахометр на Atmega8
Доброго времени суток дорогие посетители форума ! Возникла идея сделать электронное управление...

Частотомер
Привет всем, есть программа таймера ( частотомера) написана на ассемблере, в протеусе проверил сам...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru