Цифровой вольамперметр - менеджер нагрузок в будущем

Блоки питания, преобразователи напряжения, UPS'ы - это здесь :)
Ответить
Димон Безпарольный
Встал на лапы
Сообщения: 101
Зарегистрирован: Пн мар 08, 2010 20:48:51

Цифровой вольамперметр - менеджер нагрузок в будущем

Сообщение Димон Безпарольный »

Цифровой вольамперметр на микроконтроллере ляжет в основу менеджера нагрузок. Предыстория такова - во многих в дачных домах ограничено потребление электричества. У меня ограничение - 2.2КВт. При этом в хозяйстве куча водонагревательных приборов и электроинструмента. Идея такова - отключать по протоколу X10 нагрузки с низким приоритетом в пиках потребления. Например, включили чайник 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.

О программе.



Проект сделан под Keil Uv4. Программа построена с максимальным использованием прерываний. Ядро и периферия работают на частоте 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)&&(Start5==0)){Start5=1;}//Отбрасываем неполный полупериод
if ((signADC >10)&&(Start5==1)) {Start5=2;}//Первая положительная полуволна
if ((signADC <-10)&&(Start5==2)){Start5=3;}//Первая отрицательная полуволна
if ((signADC >10)&&(Start5==3)) {Start5=4;}//Вторая положительная полуволна

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

В основном цикле происходит дальнейшая обработка и усреднение:
Volt = sqrt(Summ5/Samples5); //40мкс
AverVolt5 = (AverVolt5*7)/8 + Volt/8; //30мкс

Хочу заметить, что даже вычисление квадратного корня на тактовой частоте 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\t%i\n",AverVolt5,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 ... j/2-1-0-50

Цифровой ваттметр на МК.
http://radiokot.ru/circuit/digital/measure/23/

Учет электроэнергии, считывание информации со счетчика Меркурий 230, протокол счетчика
http://www.ab-log.ru/smart-house/mercury-230
Вложения
PowerMeter.7z
(51.32 КБ) 145 скачиваний
Реклама
Аватара пользователя
neon
Поставщик валерьянки для Кота
Сообщения: 2318
Зарегистрирован: Пн июн 04, 2012 17:44:22
Откуда: Казань

Re: Цифровой вольамперметр - менеджер нагрузок в будущем

Сообщение neon »

Димон Безпарольный писал(а):Идея такова - отключать по протоколу X10 нагрузки с низким приоритетом в пиках потребления. Например, включили чайник 2КВт - отключился автоматически водонагреватель душа. И подключился вновь после отключения чайника. Для работы такого менеджера необходимо измерять ток нагрузки. Заодно хотелось бы измерять напряжение, частоту и фазу, вычислять COS F.
у вас чайник меняет меняет потребляемую мощность? Хватить контроля состояния прибора (включен или выключен) и на выходе обычный дискретный сигнал.

Вы перечислили активные нагрузки, которые потребляют только активную мощность и нет необходимости в контроле остальных параметров.
"То, что я понял, - прекрасно, из этого я заключаю, что остальное, что я не понял, - тоже прекрасно". Сократ.
Реклама
Димон Безпарольный
Встал на лапы
Сообщения: 101
Зарегистрирован: Пн мар 08, 2010 20:48:51

Re: Цифровой вольамперметр - менеджер нагрузок в будущем

Сообщение Димон Безпарольный »

Потребители находятся по всему участку в разных постройках. Тянуть от каждого провода неправильно и нелогично. К тому же я плохо представляю как вывести сигнал о включении от чайника, где термореле находится в съёмной части.

Нагрузки в 90% случаев действительно активные. Это водонагреватели и калориферы.

К тому же этот прибор я хочу приспособить для включения освещения. Опять же через протокол Х10.
Аватара пользователя
neon
Поставщик валерьянки для Кота
Сообщения: 2318
Зарегистрирован: Пн июн 04, 2012 17:44:22
Откуда: Казань

Re: Цифровой вольамперметр - менеджер нагрузок в будущем

Сообщение neon »

Димон Безпарольный писал(а):Тянуть от каждого провода неправильно и нелогично. К тому же я плохо представляю как вывести сигнал о включении от чайника, где термореле находится в съёмной части.
так что сложного? Датчик состояния может быть на базе логического датчика Холла, который располагается рядом с проводником питания. Вот вам и гальваническая развязка. При использовании линейного датчика Холла он может играть роль датчика тока. Можно использовать готовые датчики тока на основе эффекта Холла. Остаётся только реализовать идентификацию и коммутацию.

У меня был один похожий проект, когда на вилке монтируется пассивная RFID-метка для идентификации, а в розетке стоит RFID-приёмник, схема контроля состояния, твердотельное реле и беспроводной приёмопередатчик ZigBee. Можно на базе X10 реализовать.

Для стационарных потребителей хватит только передавать состояние (включен или выключен).
"То, что я понял, - прекрасно, из этого я заключаю, что остальное, что я не понял, - тоже прекрасно". Сократ.
Реклама
Эиком - электронные компоненты и радиодетали
Димон Безпарольный
Встал на лапы
Сообщения: 101
Зарегистрирован: Пн мар 08, 2010 20:48:51

Re: Цифровой вольамперметр - менеджер нагрузок в будущем

Сообщение Димон Безпарольный »

Датчик Холла, RFID-метка, RFID-приемник плюс устройство коммутации, ZigBee. Не слишком сложно? Я же предлагаю централизованно измерять ток и отключать нагрузки по X10 с низким приоритетом. Всего то нужно измерять ток в одной точке, один передатчик и приемники X10 с твердотельными реле. Причем приемники могут быть промышленными. Не такие уж они дорогие. Особенно на освещение.
Реклама
Аватара пользователя
neon
Поставщик валерьянки для Кота
Сообщения: 2318
Зарегистрирован: Пн июн 04, 2012 17:44:22
Откуда: Казань

Re: Цифровой вольамперметр - менеджер нагрузок в будущем

Сообщение neon »

всё это будет работать при стационарно подключенных потребителях. Если вы чайник включите в другую розетку, там где раньше был подключен потребитель с более высоким приоритетом, то система не выключит его. Со стационарными проще. Ставится несколько реле с отводящими линиями и на каждой стоит датчик состояния. Вот и всё. Система знает что включено и когда отключать. При этом нет необходимости в приёмниках X10 для некоторых нагрузок.
"То, что я понял, - прекрасно, из этого я заключаю, что остальное, что я не понял, - тоже прекрасно". Сократ.
Реклама
Димон Безпарольный
Встал на лапы
Сообщения: 101
Зарегистрирован: Пн мар 08, 2010 20:48:51

Re: Цифровой вольамперметр - менеджер нагрузок в будущем

Сообщение Димон Безпарольный »

В том то и дело, что стационарные потребители (нагреватели воды в основном) и являются потребителями с низким приоритетом. А чайник никто не собирается отключать, куда бы он ни был включен. То же самое касается калориферов.

Немного слукавил, при норме 2.2КВт, 20А я отбирать все - таки могу.
Аватара пользователя
neon
Поставщик валерьянки для Кота
Сообщения: 2318
Зарегистрирован: Пн июн 04, 2012 17:44:22
Откуда: Казань

Re: Цифровой вольамперметр - менеджер нагрузок в будущем

Сообщение neon »

Димон Безпарольный писал(а):Немного слукавил, при норме 2.2КВт, 20А я отбирать все - таки могу.
при таком токе это уже 4,6 кВт.
"То, что я понял, - прекрасно, из этого я заключаю, что остальное, что я не понял, - тоже прекрасно". Сократ.
Димон Безпарольный
Встал на лапы
Сообщения: 101
Зарегистрирован: Пн мар 08, 2010 20:48:51

Re: Цифровой вольамперметр - менеджер нагрузок в будущем

Сообщение Димон Безпарольный »

И вот продолжение. Протокол X10. Долго мучался, но оказалось что DRS516 стал по каким - то причинам глухим. Купил новый, подключил - заработало!

Схема передающей части. Изображение
Трансформатор от какой - то вч-шняги. Это некритично. Индуктивность 1мГн.

Zero_Cross Изображение
Работает на 2 внешних прерывания AT91sam7s 256. Дело в том, что процессор должен реагировать на оба фронта сигнала, а настроить можно только один. В итоге удалось вытянуть Zero_Cross из DRS - 516 и сравнить осциллографом.
Изображение


Вот что получилось:
Изображение

В разработках я опирался на AN236 от Микрочип. Софт делал строго по протоколу. Помог осциллограф DSO-5200A. У него буфер 1M, что позволило записать всю передаваемую от DRS - 516 посылку и ее проанализировать. Если отойти от протокола, прграмму можно сильно упростить.

Софт. Настраиваем внешние прерывания:

Код: Выделить всё

//Внешнее прерывание
	*AIC_SMR30	=	(1 << 5) |(1 << 6)| 7;		//Задний фронт(5), передний фронт (5,6)
	*AIC_SVR30	=	(unsigned long) EXT0_int;	//7-й уровень пиоритета (IRQ0) Стр.165.	PA20, P3.4
	*AIC_SMR31	=	(1 << 5) | 6;				//Задний фронт(5), передний фронт (5,6)
	*AIC_SVR31	=	(unsigned long) EXT1_int;	//7-й уровень пиоритета (IRQ1) Стр.165. PA30, P2.6
	*AIC_IECR	=	0xC0000000;					//Разрешить внешнее прерывание
И пишем их код:

Код: Выделить всё

__irq void EXT0_int(void) {			//Внешнее прерывание. Начало и остановка измерений АЦП
	ZeroCross = 1;					//
__irq void EXT1_int(void) {ZeroCross = 1; *AIC_EOICR = 1;}
Сам обработчик X10:

Код: Выделить всё

extern int ZeroCross;

//Функции X10
void Pulse1ms(void);					//Передача импульса в сеть
void Pulse1ms1(void);					//Генератор импульса 120КГц 1мс
void Pause1ms(void);					//Генератор паузы 1мс
void WaitZC	(void);						//Ожидание события - перехода синосоиды 50Гц через 0.
void SendStart(void);					//Передача старт - условия: три единичные посылки 1мс и пауза 1мс
void Trnsfer (unsigned char DATA, int Bits); //Педача данных длиной Bits в сеть

void SendX10Command (int House, int Unit, int Command){//Педача команды в сеть 
		SendStart();	  	//Передаем посылку 1110
		Trnsfer(House,4);	//House. 0110 = A
		Trnsfer(Unit,5);  	//Unit Addresses = 00110 = 1
 		SendStart();	  	//Передаем посылку 1110
		Trnsfer(House,4);	//House. 0110 = A
		Trnsfer(Unit,5);  	//Unit Addresses = 00110 = 1
		WaitZC();			//Пропускаем 6 переходов 
		WaitZC();			//через 0.
		WaitZC();			//
 		WaitZC();			//
		WaitZC();			//
		WaitZC();			//
 		SendStart();	  	//Первый раз
		Trnsfer(House,4);  	//House. 0110 = A
		Trnsfer(Command,5);	//On = 10100
 		SendStart();		//Второй раз.
		Trnsfer(House,4);  	//House. 0110 = A
		Trnsfer(Command,5);	//On = 10100
						}
//Для DRS-16 достаточно такого алгоритма:
/*		SendStart();		//
		Trnsfer(6,4);	  	//House
		Trnsfer(0x1c,5);  	//Unit / Function. Function = On
*/
//--------------------------------------------------------------------------------------------------------------------
void Trnsfer (unsigned char DATA, int Bits){//Педача данных длиной Bits	в сеть
    unsigned char i;                    //
    unsigned char mask;             	//
    for(i=0; i<Bits; i++) {             //
        mask = (1 << i);     			//Выделение передаваемого бита
		WaitZC();						//Ожидание перехода через 0 перед передачей бит - интервала
        if((DATA&mask) == 0)           	//Передача 0:
            {Pause1ms();				//
			WaitZC();					//Ожидание перехода через 0 между полубитным интервалом
			Pulse1ms();}              	//
        else                            //Передача 1:
            {Pulse1ms();				//1
			WaitZC();					//Ожидание перехода через 0 между полубитным интервалом
			Pause1ms();}              	//
        }                 				//for(i=0; i<Bits; i++)
		}								//void Trnsfer (unsigned char DATA, int Bits)
//--------------------------------------------------------------------------------------------------------------------
void WaitZC(void) {						//Ожидание события - перехода синосоиды 50Гц через 0.
	ZeroCross = 0;						//
	while(!ZeroCross) {}				//
	}									//
//--------------------------------------------------------------------------------------------------------------------
void SendStart(void){					//Передача старт - условия: три единичные посылки 1мс и пауза 1мс
	WaitZC();							//Ожидание перехода через 0
   	Pulse1ms();							//
	WaitZC();							//Ожидание перехода через 0
   	Pulse1ms();							//
	WaitZC();							//Ожидание перехода через 0
   	Pulse1ms();							//
	WaitZC();							//Ожидание перехода через 0
	Pause1ms();							//Передача паузы необязательна
	}
//--------------------------------------------------------------------------------------------------------------------
void Pulse1ms (void){              		//Передача импульса. Импульс передается 3 раза
	 Pulse1ms1();						//со слвигом 120градусов для трех разных фаз. Фаза A
	 Pause1ms();						//
	 Pause1ms();						//
	 Pulse1ms1();						//Фаза B
	 Pause1ms();						//
	 Pause1ms();						//
	 Pulse1ms1();}						//Фаза C
//Хотя для DRS516 фазы B и С не нужны. И так работает. Достаточен вызов только Pulse1ms1()!
//--------------------------------------------------------------------------------------------------------------------
//Передача единичной посылки длительностью 1мс с помощью ШИМ. Частота заполнения 120КГц.
//Длительность посылки задается с помощью таймера TC1.
//Таймер запрограммирован на останов по совпадению с RC. Загружаем RC нужной величиной
//и ждем бита совпадения таймера TC1_CV с RC(бит CPCS, поз4, стр 414). При совпадении
//таймер автоматически останавливается.
void Pulse1ms1 (void){					//Генератор импульсов 120КГц 1мс
	*TC1_RC = 28000;					//28000
	*PWM_ENA = 1;						//Разрешить работу канала PWM1 (CHID0), P0.3, 120КГц. 
	*TC1_CCR = 0x5;						//Запустить таймер 1 + SWTRG=1
	while (!(*TC1_SR&(1<<4))) {}		//Ждать 1мс до совпадения регистра таймера TC1_CV с RC
	*PWM_DIS = 1;						//120КГц. Запретить работу канала PWM1 (CHID0), P0.3
	*TC1_CCR = 0x6;}					//Остановить таймер
//--------------------------------------------------------------------------------------------------------------------
void Pause1ms (void){					//Генератор паузы 1мс
	*TC1_RC = 25000;					//25000
	*TC1_CCR = 0x5;						//Запустить таймер 1 + SWTRG=1
	while (!(*TC1_SR&(1<<4))) {}		//Ждать 1мс до совпадения регистра таймера TC1_CV с RC
	*TC1_CCR = 0x6;}					//Остановить таймер
//DRS516 срабатывает при значениях TC1_RC от 1000 до 800 000
И его вызов:

Код: Выделить всё

	if (Knob) {							//
		int House = 0xc;				//House = K
		int Unit = 5;					//
		int Command;					//OFF = 0x1c, ON = 0x14, All Units Off = 0x10, All Units On = 0x18
		if (Knob<3) {Command = 0x14;}
		else {Command = 0x1c;}
		SendX10Command(House, Unit, Command);
		Knob = 0;						//
		}
DRS-516 удалось запрограммировать на новый House и Unit код.
Димон Безпарольный
Встал на лапы
Сообщения: 101
Зарегистрирован: Пн мар 08, 2010 20:48:51

Re: Цифровой вольамперметр - менеджер нагрузок в будущем

Сообщение Димон Безпарольный »

Изменился узел передатчика.

Изображение

Передатчик работает исправно. Проверен с модулями LM15, AM12, MRS516. В AM12 адрес выставляется переключателями, обучение LM12, MRS516 прошло успешно.
Для MRS51 два раза передаем посылку после нажатия на кнопку в течении 30с.
Для LM15 в течении 30с после включения надо три раза передать посылку с кодом включения.

Модули работают исправно. Приятно удивил трансформатор тока. Необычно линеен в диапазоне от 30ма до 20А. Показания тока сравнивались со счетчиком Меркурий 230, у которого есть режим индикации тока. Разность в показаниях составила не более 1.5%!

Добавил трехцветный светодиод. В режиме до 100ма он горит синим, 100ма-1А - зеленым, более 1А - красным.

Резисторы R8, R9 - для биполярных транзисторов. R9 = 0, R8 нет.

Заказана печатная плата, которая имеет на борту DS1307, компаратор датчика освещенности, FT232. Добавлена функция передачи кода в сеть через RS232.
Ответить

Вернуться в «Питание»