|
Измерение частоты через АЦП, Как сделать? |
|
|
|
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
Эскизы прикрепленных изображений
--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса. (с) Мария Эдуарда
|
|
|
|
|
 |
Ответов
(15 - 29)
|
Oct 28 2011, 06:19
|

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

|
Цитата(Павлик @ Oct 27 2011, 23:07)  Поставить РС814 на переменку, транзистор оптопары на подтяжку +5 питания меги, заводи на прерывание меги и считай. Я об этом думал ... По сути тот же компаратор. Но у меня все замеры по 3-м каналам АЦП делаются в прерывании таймера (1 мс). Сам АЦП работет по опросу, без прерываний. Т.е. это прерывание "долгоиграющее". Поэтому существует вероятность, что INT от оптопары или компаратора будет пропущено. В доке я что-то ничего про этот момент не нашёл  , может плохо искал.... Если есть, ткните носом плиз. Менять алгоритм не хотелось бы (уже всё отлажено), поэтому у меня и потекли мысли в сторону 2-го камня, который спокойно посчитает эту частоту, а потом легко отдаст её основному процу по какому-нибудь SPI (жаль только, что у тини нету железного SPI, эмулировать придётся ...). Когда цикл измерений закончен и "измеряющий" таймер выключен. Тинька даже дешевле отдельных счётчика и компаратора. По крайней мере, по местным ценам. А если ещё задуматься о способе считывания этого счётчика, 3-стаб. буферы, там тем более 2-й проц и дешевле и удобнее.
Сообщение отредактировал hd44780 - Oct 28 2011, 06:28
--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса. (с) Мария Эдуарда
|
|
|
|
|
Oct 28 2011, 06:34
|

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

|
QUOTE (hd44780 @ Oct 28 2011, 10:19)  Поэтому существует вероятность, что INT от оптопары или компаратора будет пропущено. В доке я что-то ничего про этот момент не нашёл  , может плохо искал.... Если есть, ткните носом плиз. Прерывания INTX старшие прерывания AVR и если уж они вкл. то проц их никогда не пропустит. Какая разрядность АЦП? Вы можете посчитать сколько time уходит на одно преобразование  Если укладываетесь в 20ms , то у Вас вполне остается время переключить входы и посчитать все значения на одном АЦП
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Oct 30 2011, 07:01
|

Профессионал
    
Группа: Свой
Сообщений: 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 Гц Единствнное, что приходит в голову, это то, что переменные pulses и ms наверняка меняются, пока расчитывается частота. Когда-то я уже натыкался на это. Попробую ввести переменные-защёлки для них и кратковременный запрет прерываний.
Сообщение отредактировал hd44780 - Oct 30 2011, 07:06
--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса. (с) Мария Эдуарда
|
|
|
|
|
Oct 30 2011, 15:14
|
Участник

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

|
Вам же Палыч на первой странице показал алгоритм, а вы делаете всё наоборот.
|
|
|
|
|
Oct 30 2011, 15:47
|

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

|
woroba, не валите всё в одну кучу. Замечания Палыча касаются измерения тока и напряжения. К измерению частоты через компаратор они не относятся, хотя бы потому, что аналогового компаратора тогда не было.
Кстати - проверил внутренний компаратор основному алгоритму не мешает. Так что, К554СА3, наверное, не нужен.
Сообщение отредактировал hd44780 - Oct 31 2011, 07:12
--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса. (с) Мария Эдуарда
|
|
|
|
|
Oct 31 2011, 07:09
|

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

|
Цитата(DrGluck @ Oct 31 2011, 09:44)  А попробуйте пересчитать полученную погрешность измерения в свете используемого кварца на проце. У Вас же там не атомные часы подключены ? Наверняка что-нибудь из области 60 ppm ... А как пересчитать? Сделать генератор и померять прибором сколько Гц он выдаст? Кварц хрен знает какой, родом из радиобазара  ... На нём написано - MC 8.000 MHz. Кстати, его корпус заземлять надо? Иногда в схемах с такое видел... У меня пока незаземлён. Всё, что приходит в голову - ввести калибровочную константу и отнимать/прибавлять её (или делить/умножать - пока не знаю), как это делается с током и напряжением.
Сообщение отредактировал hd44780 - Oct 31 2011, 07:15
--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса. (с) Мария Эдуарда
|
|
|
|
|
Oct 31 2011, 07:39
|

Местный
  
Группа: Участник
Сообщений: 340
Регистрация: 25-11-05
Из: Россия
Пользователь №: 11 361

|
Цитата Кварц хрен знает какой, родом из радиобазара ... На нём написано - MC 8.000 MHz. ... без комментариев  P.S. "Пересчитать" - подразумевалось как эквивалент "А что Вас собственно удивляет ?" ...
Сообщение отредактировал DrGluck - Oct 31 2011, 07:41
--------------------
"... Ищущий вечно, однажды найдя, то, что искал бесконечно, мимо прошёл, совершенно беспечно, с кем-то о вечном шутя ..."
|
|
|
|
|
Oct 31 2011, 11:15
|

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

|
Ну и что? Про излучение цезия-133 ( http://metrologyia.ru/?page_id=103 ) я и так знаю  А как мне это может помочь  ?
Сообщение отредактировал hd44780 - Oct 31 2011, 11:15
--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса. (с) Мария Эдуарда
|
|
|
|
|
Oct 31 2011, 11:54
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(hd44780 @ Oct 30 2011, 18:47)  Замечания Палыча касаются измерения тока и напряжения. Нет. Мои замечания выше касались именно подсчета частоты. Что видно "невооруженным" глазом: 1. Запуск таймера не "привязан" к началу цикла (сброс в ноль переменной ms - это очень грубо!), поэтому таймер, скорее всего, насчитает "немного" меньше (частота получится "немного" больше). 2. ТС говорит выше о измерении за Х мс. За это время может быть зафиксиворанно только целое число периодов. "Нецелая" часть периода в расчете не участвует. Поскольку тики таймера гораздо меньше N периодов, то лучше (точнее) расчет будет за целое число периодов измеряемой величины. Т.е. окончанием измерения должно быть фиксация N периодов. Цитата(hd44780 @ Oct 31 2011, 10:09)  На нём написано - MC 8.000 MHz. Кстати, посмотрите в справочной литературе: чем отличаются кварцы, на которых написано "8.000 MHz", от тех, где написано "8000 kHz"
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|