Например TDA7294

РадиоКот > Чердак

Измеритель сетевого напряжения, тока и частоты

Автор: Димон Безпарольный, dshabroff@mail.ru
Опубликовано 30.10.2014.
Создано при помощи КотоРед.

Цифровой вольамперметр на микроконтроллере ляжет в основу менеджера нагрузок. Предыстория такова - во многих дачных домах ограничено потребление электричества. У меня ограничение - 2.2КВт. При этом в хозяйстве куча водонагревательных приборов и электроинструмента. Идея такова - отключать по протоколу X32 нагрузки с низким приоритетом в пиках потребления. Например, включили чайник 2КВт - отключился автоматически водонагреватель душа. И подключился вновь после отключения чайника.

Для работы такого менеджера необходимо измерять ток нагрузки. Заодно хотелось бы измерять напряжение, частоту и фазу, вычислять COS F.

Пока реализованы измерения напряжения и частоты. Ток предполагается измерять недорогим токовым трансформатором AC - 1020. Хотя говорят что ТТ весьма нелинейны. Прибор измеряет действующее значение напряжения по двум каналам по формуле:

Метод измерения, описываемый формулой - сумма квадратов выборок за период сетевого напряжения. Такой метод дает наибольшую точность при измерении сетевого напряжения искаженной формы. Некоторые авторы в своих статьях измеряют напряжение, стробируя при помощи таймера. Полагая что частота сети всегда равна 50Гц. Такой метод дает дополнительную погрешность. В приборе применен другой метод - отслеживание напряжения в канале. При этом отбрасывается нулевая зона, в начале и конце периода. Именно в этой зоне присутствует максимум помех из - за работы тиристорных приборов, переключающих нагрузку при переходе через нуль.

Измеренное значение усредняется при помощи метода скользящего среднего из 8 выборок измеренного и вычисленного напряжения V(формула).

Схема

Аналоговая часть. Схема в архиве. PCAD2006. Опорное напряжение - 3В, получаемое от ADR395 через повторитель на ОУ. Все аналоговые каналы (3) подключены к процессору через повторители на ОУ. На ОУ заведена средняя точка (1.5В). Относительно этой опоры заводятся два напряжения. В проекте применены Rail to Rail ОУ AD8628, в конечном продукте планируется применить счетверенные AD8643. Прибор питается от одного маломощного трансформатора через один выпрямительный диод (ток потребления 110ма). Это же напряжение подано на измерительные каналы. Поэтму на осциллограмах всегда срезана положительная полуволна напряжения.

Цифровая часть пока не приводится. Процессор AT91SAM7s128. Если будет интерес - приведу, но там все стандартно. В проекте применяется четырехстрочный символьный дисплей PC2004LRSCNH. Стандартный на HD44780. UART c внешним миром общается через FT232.

О программе. Программа построена с максимальным использованием прерываний. Ядро и периферия работают на частоте 48МГц. Опорный кварц 16МГц. Можно применять любой кварц - PLL имеет множитель и делитель, позволяющие довольно гибко оперировать частотами. В крайнем случае потребуется изменить множитель UART(который имеет и дробную часть). Частота работы остальной переферии и ядра некритична и должна быть меньше 50МГц.

UART

В проекте применен кольцевой буфер UART отдельно на прием и передачу. Прием и передача в порт осуществляется через соответствующие прерывания. Парсер команд обрабатывает пока только команды BEEP и Reset. Добавить что - то свое довольно просто. UART настроен стандартно 8n1 115200 (48 000 000/16/26 = 115385).

PWM

В проекте имеется пищалка с использованием одного канала PWM.

АЦП

АЦП в проекте работает также через прерывание. Используются три канала - для измерения опоры операционных усилителей (1.5В), канал 5 - напряжение, канал 6 - ток. На момент написания статьи оба канала измеряют одно и то же напряжение. Канал 5 усредняется, а канал 6 выведен без усреднения. Стробирование осуществляется с последовательным переключением канала5 и канала6. Таким образом, эффективная частота выборки для каждого канала вдвое ниже (число выборок – 183 на период). Квадраты выборок накапливаются в прерывании в стартстопном режиме за один период:

if ((Start6>1)&&(Start6<4)) {   //От начала первой положительной до начала второй положительной полуволны
*PIO_SODR = (1<<19);           //Маркер UP
Summ6 = Summ6 + (signADC * signADC); Samples6++; }//Сумма квадратов за период и число выборок
else {*PIO_CODR = (1<<19);} //Маркер DOWN

АЦП работает на частоте 375КГц:

*ADC_MR = (16<<24)| //Sample & Hold Time = (SHTIM+1) / ADCClock Стр 481
                (1<<16)|   //Start5up Time(16-20) = (StartUP+1) * 8 / ADCClock
                (63<<8);   //Prescaler Rate Selection ADCClock = MCK / ( (PRESCAL+1) * 2 )

Можно увеличить тактовую частоту АЦП, но никакого эффекта это не дает. Выше частоты 2МГц основной процесс начинает тормозить. Больше никакой разницы не заметил. Поскольку измерения асинхронны по отношению к измеряемому напряжению, при начале измерения приходится отбрасывать неполный полупериод:

//Отслеживание периода
if ((signADC <-10)&&(Start6==0)){Start6=1;}//Отбрасываем неполный полупериод
if ((signADC >10)&&(Start6==1)) {Start6=2; *TC1_CCR = 0x5;}//Первая положительная полуволна
if ((signADC <-10)&&(Start6==2)){Start6=3;}//Первая отрицательная полуволна
if ((signADC >10)&&(Start6==3)) {Start6=4; *TC1_CCR = 0x6;}//Вторая положительная полуволна

Зона нечувствительности – 20 отсчетов АЦП. Остальная обработка - в основной части программы. Работу каналов измерения можно проверить двухлучевым осциллографом через маркеры - выводы PA18(канал5) и PA19(канал6). На осциллограме видно как измерения накапливаются раз в секунду за один период сетевого напряжения:

В основном цикле происходит дальнейшая обработка, усреднение и подсчет частоты:

Volt = sqrt(Summ6/Samples6);               //40мкс
AverVolt6 = (AverVolt6*15)/16 + Volt/16;//30мкс
Freq6fl = (float)*TC1_CV/600;               //Вычислить частоту в герцах

Хочу заметить, что даже вычисление квадратного корня на тактовой частоте 48МГц занимает всего лишь 40мкс. Усреднение делается по 8 выборкам. Можно увеличить число выборок, но учитывая что результат считывается и обрабатывается раз в секунду, при включении прибора, напряжение очень медленно нарастает. Как будто напряжение выпрямили и подключили к очень большому конденсатору. В качестве теста, вывод значения напряжения канала 5 осуществляется через усреднение, а канала 6 – без.

Как видно на рисунке:

Канал 5 нарастает весьма медленно. На терминал и индикатор выводится канал опорного напряжения ОУ, напряжение обоих каналов, частота и число выборок. В установвшемся режиме получим:

 

Должен сказать что при хорошем (без помех) напряжении усреднение вроде как и не нужно.

Измерение частоты.

Измерение частоты выполнено на двух 16-битных таймерах для двух каналов. Частота тактирования таймеров выбрана MCK/32, т.е. 1.5МГц:

*TC0_CCR = 0x6;        //Для канала 5. Запретить счет.
*TC0_CMR =1<<15|2;  //WAVE:Waveform mode. TCCLKS: MCK/32
*TC1_CCR = 0x6;        //Для канала 6. Запретить счет.
*TC1_CMR =1<<15|2;  //WAVE:Waveform mode. TCCLKS: MCK/32

За 20мс таймер насчитает 30 000 отсчетов. Таймер стартует и останавливается вместе с подсчетом суммы квадратов. Усреднение не производится.

Индикатор

Вывод значений на индикатор осуществляется стандартным способом:

sprintf (buffer, "U5=%1.1f %1.1f %in",AverVolt5,Freq5fl,Samples5);//100мкс
PrintBuf(0x94); //1000мкс

Значение 0x94 – третья строка индикатора. Другие значения:

0x80 – первая строка

0xС0 – вторая строка

0xD4 – четвертая строка

Можно выводить не с начала строки, написав PrintBuf(0x80 + 7); - седьмая позиция первой строки. Русские символы также поддерживаются.

Проект не доделан до конца. На данный момент ломаю голову как сделать фазометр. Не то чтобы я не знаю как :). Просто в нерешительности – сделать на компараторах и завести на внешнее прерывание, или банально на таймере.

Литература:

Аналого – цифровое измерение переменного напряжения

http://www.kit-e.ru/articles/circuit/2010_07_144.php

Метод измерения действующего значения напряжения с применением МК

http://habrahabr.ru/post/193022/

Многофункциональный ваттметр с гальванической развязкой

http://radiokomp.ucoz.ru/load/skhemy_na_mikrokontrollerakh/mnogofunkcionalnyj_vattmetr_s_galvanicheskoj_razvjazkoj/2-1-0-50

Цифровой ваттметр на МК.

http://radiokot.ru/circuit/digital/measure/23/

Учет электроэнергии, считывание информации со счетчика Меркурий 230, протокол счетчика

http://www.ab-log.ru/smart-house/mercury-230

 


Файлы:
Индикатор
Проект под Keil uVision4


Все вопросы в Форум.


ID: 2018

Как вам эта статья?

 Нравится
 Так себе
 Не нравится

Заработало ли это устройство у вас?

 Заработало сразу
 Заработало после плясок с бубном
 Не заработало совсем

2 1 8