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

 
 
> Измерение частоты через АЦП, Как сделать?
hd44780
сообщение Oct 27 2011, 07:57
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980



Сделал прибор на ATMega16 - показывает напряжение, ток нагрузки, мощности разновсякие.... Сеть бытовая, 50 Гц.
Тут всё нормально работает. Спасибо участникам форума, которые ранее отвечали на мои вопросы.

Схема входного каскада - рис.

Вопрос - как можно померить частоту имея на входе АЦП поднятое на 2.5в напряжение сети 50 Гц.
Вообще-то оно совершенно не капает, ну так, интересно просто. Для полноты функционала так сказать ...

Сейчас я сделал так:
АЦП цифрует 20 раз за период (таймер 1khz = 1ms).
В обработчике прерывания написал:

// Миллисекунды
ms++;

// Проверка перехода через 0 (- -> +)
if (adcU>3)
{ // Положительная полуволна
if (isUNegative==1)
{ // Была отрицательная - переход
pulses++;

isUNegative = 0;
} // if
} // if
else // отрицательная полуволна
isUNegative = 1;

adcU - код со входа ADC1 за вычетом смещения ср. точки ADC0.
isUNegative - просто флаг, отслеживает переход синусоиды через 0.
pulses - кол-во переходов синусоиды вверх через 0.

Цикл измерений длится 0.5 сек (10 периодов).
Потом идёт обсчёт, в т.ч. и частоты:

// Частота
frequency = pulses*1000.0;
frequency/=ms;

frequency - частота в Гц, float.

pulses и ms считают постоянно, никогда не обнуляясь.

Проблема в том, что частота в итоге "плавает" где-то в интервале 49-51 Гц, хотя частотомер из осциллографа-мультиметра UT-81B показывает ровно 50 Гц. Да и сам я понимаю, что реально частота не может так гулять, она жёстко контролируется.

Читал соседнюю тему про частоту, например, эту - http://electronix.ru/forum/index.php?showt...=29796&st=0 , но у меня порт В, где все входы таймеров T0, T1 занят, там ШД дисплея HD44780 crying.gif .... Освободить могу, переведя дисплей в 4 бит режим работы с перебросом его целиком на PORTC, но я терпеть не могу 4 бит режим работы, глючный он какой-то. У меня так метеостанция работает (деваться было некуда), так там вечно на дисплее какая-то байда лезет. Библиотека для LCD там не самодельная, а стандартная, из CvAVR. Думал дисплей коцнутый, но на 8 бит работает идеально...
Отвлёкся я ...

PC6, PC7 свободны, но я не знаю, может ли TC2 считать внешние импульсы или он только под кварц часовой заточен ...

Можно, конечно, налепить внешний компаратор, счётчик, но это усложние схемы, доп. корпуса и пр....
Да и делает тот компаратор то же самое, что и мой программный счётчик...

Спасибо.

PS
Админам:
Кнопка CODEBOX не фурычит, валится ошибка -

Сообщение: Недопустимый аргумент.
Строка: 1225
Символ: 3
Код: 0
URI-код: http://electronix.ru/forum/jscripts/ips_text_editor.js

Смайлики вставляются нормально.
Браузер - IE8 со всеми обновлениями.
Винда - 2003 SP2 сервер лицензионный. Обновляется регулярно.
Оперу и пр. альтернативы не предлагать, у нас на работе запрещено biggrin.gif .

Сообщение отредактировал hd44780 - Oct 27 2011, 08:09
Эскизы прикрепленных изображений
Прикрепленное изображение
 


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
hd44780
сообщение Oct 30 2011, 07:01
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980



Перепаял слегка схему, освободил 5 младших ног PORTB.
Задействовал встроенный в Mega16 компаратор - AIN- - ср. точка (она же ADC0), AIN+ - вх. сигнал напряжения (ADC1), включил прерывание компаратора по нарастанию сигнала, параллельно TC2 считает миллисекунды.

Куски кода:

// Timer 2 overflow interrupt service routine
// -- Частота прерываний 1 kHz = 1 мс - 20 раз за период 50 Гц (20мс)
// -- 1000 раз в секунду
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
// Reinitialize Timer 2 value
TCNT2=0x83;

// Миллисекунды
ms++;
} // timer2_ovf_isr

// Analog Comparator interrupt service routine
// Переход синусоиды вверх через 0
interrupt [ANA_COMP] void ana_comp_isr(void)
{
pulses++;
} // ana_comp_isr

Расчёт частоты:

////////////////////////////////////////////////
// Частота
frequency = pulses*1000.0;
frequency/=ms;

ms, pulses - dword, frequency - float.
ms, pulses обнуляются только при первичной инициализации по включении питания.

"Измеряющий" таймер TC0 и АЦП пока выключены, т.е. прибор меряет только частоту.
Получил результаты 50.10 ... 50.30 Гц - бегает. Заводской прибор показывает 49.98-48.99 Гц rolleyes.gif

Единствнное, что приходит в голову, это то, что переменные pulses и ms наверняка меняются, пока расчитывается частота. Когда-то я уже натыкался на это. Попробую ввести переменные-защёлки для них и кратковременный запрет прерываний.

Сообщение отредактировал hd44780 - Oct 30 2011, 07:06


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- hd44780   Измерение частоты через АЦП   Oct 27 2011, 07:57
- - woroba   Так у Вас зазор 1mS, вот показания и плюшут. Попр...   Oct 27 2011, 08:38
- - hd44780   Чаще запускать пытался, там другие проблемы были. ...   Oct 27 2011, 08:59
|- - ILYAUL   QUOTE (hd44780 @ Oct 27 2011, 12:59) Чаще...   Oct 27 2011, 09:03
|- - hd44780   Цитата(ILYAUL @ Oct 27 2011, 12:03) A род...   Oct 27 2011, 09:16
- - ILYAUL   QUOTE В наличии есль К554СА3 Ну тогда его выход на...   Oct 27 2011, 09:26
|- - hd44780   Цитата(ILYAUL @ Oct 27 2011, 12:26) Ну то...   Oct 27 2011, 10:09
- - Палыч   Цитата(hd44780 @ Oct 27 2011, 11:57) Цикл...   Oct 27 2011, 10:19
- - _pv   Так как частота примерно известна, то Можно Герцел...   Oct 27 2011, 15:39
|- - ILYAUL   QUOTE (_pv @ Oct 27 2011, 19:39) Можно Ге...   Oct 27 2011, 16:32
|- - _pv   Цитата(ILYAUL @ Oct 27 2011, 23:32) Т.е т...   Oct 27 2011, 16:48
|- - ILYAUL   QUOTE (_pv @ Oct 27 2011, 20:48) Капитан ...   Oct 27 2011, 17:21
- - hd44780   Во, чего я придумал - поставить туда ещё один МК -...   Oct 27 2011, 16:33
|- - ILYAUL   QUOTE (hd44780 @ Oct 27 2011, 20:33) Во, ...   Oct 27 2011, 16:35
- - hd44780   Во, точно, у меня AtTiny2313 валяется ...   Oct 27 2011, 16:56
- - maksimp   Если один отсчёт АЦП например больше нуля, а следу...   Oct 27 2011, 19:07
- - Павлик   Поставить РС814 на переменку, транзистор оптопары ...   Oct 27 2011, 20:07
|- - hd44780   Цитата(Павлик @ Oct 27 2011, 23:07) Поста...   Oct 28 2011, 06:19
|- - ILYAUL   QUOTE (hd44780 @ Oct 28 2011, 10:19) Поэт...   Oct 28 2011, 06:34
- - hd44780   Переменные-защёлки не помогли. Стабильно показывае...   Oct 30 2011, 09:10
- - woroba   Вам же Палыч на первой странице показал алгоритм, ...   Oct 30 2011, 15:14
- - hd44780   woroba, не валите всё в одну кучу. Замечания Палыч...   Oct 30 2011, 15:47
|- - Палыч   Цитата(hd44780 @ Oct 30 2011, 18:47) Заме...   Oct 31 2011, 11:54
|- - rx3apf   Цитата(Палыч @ Oct 31 2011, 15:54) Кстати...   Oct 31 2011, 12:14
- - DrGluck   А попробуйте пересчитать полученную погрешность из...   Oct 31 2011, 06:44
|- - hd44780   Цитата(DrGluck @ Oct 31 2011, 09:44) А по...   Oct 31 2011, 07:09
- - DrGluck   ЦитатаКварц хрен знает какой, родом из радиобазара...   Oct 31 2011, 07:39
- - hd44780   Наверное, введу константу. Не будешь же делать тес...   Oct 31 2011, 08:35
- - DrGluck   http://metrologyia.ru/   Oct 31 2011, 08:57
- - hd44780   Ну и что? Про излучение цезия-133 ( http://metrolo...   Oct 31 2011, 11:15
- - hd44780   Сделал так для отладки: компаратор по приходу импу...   Nov 5 2011, 10:24
|- - _pv   Цитата(hd44780 @ Nov 5 2011, 17:24) Резул...   Nov 5 2011, 11:07
- - hd44780   Спасибо большое всем, получилось. По ходу ещё 1 в...   Nov 6 2011, 11:05
|- - Палыч   Цитата(hd44780 @ Nov 6 2011, 15:05) Интер...   Nov 6 2011, 12:53
- - hd44780   500 периодов пока не делал, это всё-таки 10 сек......   Nov 7 2011, 07:30


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

 


RSS Текстовая версия Сейчас: 24th June 2025 - 07:11
Рейтинг@Mail.ru


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