|
Измерение частоты через АЦП, Как сделать? |
|
|
|
Oct 27 2011, 07:57
|

Профессионал
    
Группа: Свой
Сообщений: 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  .... Освободить могу, переведя дисплей в 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 сервер лицензионный. Обновляется регулярно. Оперу и пр. альтернативы не предлагать, у нас на работе запрещено  .
Сообщение отредактировал hd44780 - Oct 27 2011, 08:09
Эскизы прикрепленных изображений
--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса. (с) Мария Эдуарда
|
|
|
|
|
Oct 27 2011, 08:38
|
Участник

Группа: Участник
Сообщений: 17
Регистрация: 18-07-05
Пользователь №: 6 871

|
Так у Вас зазор 1mS, вот показания и плюшут. Попробуйте чаще запускать преобразования. А вообще лучше всего для этих целей использовать внешнее прерывание+таймер.
|
|
|
|
|
Oct 27 2011, 15:39
|
Гуру
     
Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954

|
Так как частота примерно известна, то Можно Герцелем посчитать амплитуды спектра на трех чатотах в районе 50Гц. получим три точки (x1,y1), (x2,y2), (x3,y3), где х1,х2,х3 частоты, напрмер 49, 50, 51 Гц, а y1,y2,y3-амплитуды спектра на этой частоте через них можно провести параболу y=a*x^2 + b*x + c. и соответственно найти коэффициенты a,b,c Mathematica подсказывает что это будет: LinearSolve[{{x1^2, x1, 1}, {x2^2, x2, 1}, {x3^2, x3, 1}}, {y1, y2,y3}] a = (x2 y1 - x3 y1 - x1 y2 + x3 y2 + x1 y3 - x2 y3)/((x1 - x2) (x1 - x3) (x2 - x3)), b = (-x2^2 y1 + x3^2 y1 + x1^2 y2 - x3^2 y2 - x1^2 y3 + x2^2 y3)/((x1 - x2) (x1 - x3) (x2 - x3)), c = (x2^2 x3 y1 - x2 x3^2 y1 - x1^2 x3 y2 + x1 x3^2 y2 + x1^2 x2 y3 - x1 x2^2 y3)/((x2 - x3) (x1^2 - x1 x2 - x1 x3 + x2 x3)) а если параболу y=a*x^2+b*x+c продиффернцировать, и приравнять нулю, то можно выяснить, что максимум у параболы находится в точке x0=-b/2a. то есть x0 = -(-x2^2*y1 + x3^2*y1 + x1^2*y2 - x3^2*y2 - x1^2*y3 + x2^2*y3)/(x2*y1 - x3*y1 - x1*y2 + x3*y2 + x1*y3 - x2*y3)/2 или, если немного упростить, то искомая частота будет: x0= -((y1*(x3^2-x2^2) + y2*(x1^2-x3^2) + y3*(x2^2-x1^2))/(y1*(x2-x3)+y2*(x3-x1)+y3*(x1-x2))/2 вычислений не сильно много: Герцель - 3 умножения на отсчет для каждой частоты, т.е. 9, да тут 6 умножений, деление и сдвиг. AVR поди справится. Тем более что последние вычисления частоты так можно вообще раз в секунду делать.
|
|
|
|
|
Oct 27 2011, 16:32
|

Профессионал
    
Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339

|
QUOTE (_pv @ Oct 27 2011, 19:39)  Можно Герцелем посчитать амплитуды спектра на трех чатотах в районе 50Гц. Т.е три фильтра? QUOTE (_pv @ Oct 27 2011, 19:39)  да тут 6 умножений, деление и сдвиг. AVR поди справится. Тем более что последние вычисления частоты так можно вообще раз в секунду делать Справится , только вот зачем.
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Oct 27 2011, 16:48
|
Гуру
     
Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954

|
Цитата(ILYAUL @ Oct 27 2011, 23:32)  Т.е три фильтра? не совсем. я предлагаю посчитать спектр, но не полностью через Фурье потому что долго, а только в трех точках. и по этих трем точкам найти максимум на спектре. Цитата(ILYAUL @ Oct 27 2011, 23:32)  Справится , только вот зачем. Капитан Очевидность подсказывает: чтобы измерить частоту.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|