Верига за измерване на променливо напрежение на Arduino. Таен волтметър в Arduino - измерване на напрежението на батерията с помощта на микроконтролер

Ако сте много притеснени от консумацията на електрическа енергия и наистина искате да разберете виновника, това е вашият ден. Ще сглобим сензор за ток и ще напишем проста логика за обработка на входните стойности за преобразуване на стойностите в киловати/час.

За сглобяване използвах дъска Ардуино нано(никой не ви спира да използвате един и същ код за ESP или STM платки), екран на LCD екрана, резистор 56 Ohm, резистори 100 kOhm, кондензатор 10 uF, сензор за CT ток - Talema AC103 (с номинално измерване 30A и максимум от 75A).

Какво е токов сензор?


Сензорът за ток е магнитна верига с междина и компенсационна намотка, както и вграден датчик на Хол и контролна платка. Сензорът на Хол се поставя в междината на магнитната верига и реагира на магнитното поле, създадено от намотката. Колкото по-силно е напрежението магнитно поле, толкова по-силен е датчикът на Хол, който произвежда сигнал, който се усилва от контролната платка.
Налични са сензори за ток за измерване променлив токИ постоянен ток. Нашите - CT-Talema AC103 - за редуване.

Нека сглобим нашето устройство според диаграмата:


LCD щитът вече има щифтове за свързване на нашите аналогови портове за измерване на сигнала - и това е удобно.
Единственият фазов входен кабел трябва да бъде прекаран през сензора за ток, защото Често не цялото напрежение достига неутралния проводник - някои може да избягат през заземяване.


Не забравяйте, че трябва да калибрираме товарния резистор R3. Формула за изчисление R = V / I - R = 2,5 / 0,042 = 59,5 ома, където 2,5 е референтното напрежение на платката, а 42 mA е консумацията на платката. Следователно приемаме най-близкия резистор по номинална стойност - 56 ома.
За да разделите главното захранващо напрежение на еталонното 5/2, ще трябва да инсталирате два еднакви резистора R1 и R2.

Всичко, което остава, е да качите примерния код в Arduino:

//Майкъл Клементс //The DIY Life //27 октомври 2014 г. #include int currentPin = 1; //Присвояване на CT вход към пин 1 двойни килограми = 0; int peakPower = 0; LiquidCrystal lcd (8, 9, 4, 5, 6, 7); //Присвояване на щифтове на LCD екрана, според изискванията за LCD щит void setup() ( lcd.begin(16,2); // колони, редове. използвайте 16,2 за 16x2 LCD и т.н. lcd.clear(); lcd .setCursor(0,0); // задаване на курсора на колона 0, ред 0 (първият ред) lcd.print("Running" ) void loop() ( int current = 0; int maxCurrent = 0; int minCurrent = 1000 ; за (int i=0 ; i<=200 ; i++) //Monitors and logs the current input for 200 cycles to determine max and min current { current = analogRead(currentPin); //Reads current input and records maximum and minimum current if(current >= maxCurrent) maxCurrent = ток; иначе ако (текущ<= minCurrent) minCurrent = current; } if (maxCurrent <= 517) { maxCurrent = 516; } double RMSCurrent = ((maxCurrent - 516)*0.707)/11.8337; //Calculates RMS current based on maximum value int RMSPower = 220*RMSCurrent; //Calculates RMS Power Assuming Voltage 220VAC, change to 110VAC accordingly if (RMSPower >peakPower) ( peakPower = RMSPower; ) килограми = килограми + (RMSPower * (2,05/60/60/1000)); //Изчисляване на използваното закъснение в киловатчаса (2000); lcd.clear(); lcd.setCursor(0,0); // Показва всички текущи данни lcd.print(RMSCurrent); lcd.print("A"); lcd.setCursor(10,0); lcd.print(RMSPower); lcd.print("W"); lcd.setCursor(0,1); lcd.print (килограми); lcd.print("kWh"); lcd.setCursor(10,1); lcd.print(peakPower); lcd.print("W"); )

Последният щрих на нашата инсталация ще бъде калибрирането. Най-добре е да го изпълните с включен референтен товар с известна мощност. Мощните лампи с нажежаема жичка са подходящи за това. Да вземем лампа от 100 вата. Включваме дъската и изчисляваме коефициента на корекция:
Двоен RMSCurrent = ((maxCurrent - 516) * 0,707) /11,8337, където 11,8337 е избраният коефициент за компенсиране на несъответствията в измерванията.

Схема на домашно устройство, базирано на Arduino Uno, което е проектирано да измерва честота и напрежение в гнездо и да показва резултатите на дисплей 1602A. Устройството е много лесно за производство, благодарение на използването на готов модул ARDUINO UNO.

Схематична диаграма

Индикаторът е LCD дисплей тип 1602A, стандартен е, базиран на контролера HD44780. Означението 1602A всъщност означава, че е на два реда по 16 знака на ред.

Основата на устройството е ARDUINO UNO, това е сравнително евтин готов модул - малка печатна платка, на която е разположен микроконтролерът ATMEGA328, както и всичките му „тръби“, необходими за работата му, включително USB програматор и захранване.

Уредът се захранва от електрическата мрежа и измерва горните параметри. Източникът на захранване едновременно служи като сензор за получаване на данни за честотата и напрежението в електрическата мрежа. Източникът на захранване е направен на базата на готов трансформатор с ниска мощност Т1, който има две еднакви намотки с променливо напрежение 9V всяка.

Ориз. 1. Принципна схема на измервател на честота и напрежение в електрическа мрежа, използвани са Arduino Uno и 1602A.

Една намотка служи за получаване на захранващо напрежение. Променливото напрежение от него се подава към токоизправителния мост с помощта на диоди VD1-VD4. Кондензаторът C3 изглажда пулсациите на коригираното напрежение.

C3 получава постоянно напрежение от около 12V, което се подава към конектора за захранване на платката ARDUINO UNO, към входа на регулатора на напрежение 5V на тази платка, който захранва цялата платка и индикатора H1.

Другата вторична намотка на трансформатора служи като датчик за измерване на параметрите на електрическата мрежа. Променливото напрежение от него през R1 се подава към импулсен формировач на мрежовата честота, направен на транзистор VT1 съгласно превключваща верига. Тези импулси се изпращат към цифровия порт D10 на платката ARDUINO UNO.

Променливото напрежение на мрежата се измерва с помощта на токоизправител, използващ диод VD5 и кондензатор C2. Големината на променливото напрежение в мрежата се определя от големината на директното напрежение на този кондензатор и чрез регулируем делител на резистори R4 и R5 се подава към аналоговия вход A1 на платката ARDUINO UNO.

програма

Програмата на C++ с подробни коментари е дадена в таблица 1. За измерване на честотата използвайте функцията pulseln, която измерва в микросекунди продължителността на положителния или отрицателния фронт на входния импулс.

Маса 1.

Ориз. 2. Изходен код на програмата за измерване на честотата и стойността на напрежението в електрическата мрежа.

И така, за да разберете периода, трябва да добавите продължителността на положителните и отрицателните полупериоди, а за да разберете честотата в херца, трябва да разделите 1 000 000 на изчисления период.

Измерването на продължителността на период се състои от две части, първо, продължителността на положителните и отрицателните полувълни се измерва в линиите:

Htime=pulseln(10,HIGH);

Ltime=pulseln(10,LOW);

След това пълният период се изчислява в реда:

Ttime=Htime+Ltime ;

И след това, изчисляване на честотата в реда:

честота=1000000/Ttime;

Действието на програмата за измерване на напрежението се основава на четене на данни от аналоговия вход и изчисляване на резултата от измерването. Изходът на аналоговия порт се преобразува в цифрова форма от ADC на микроконтролера. За да получите резултата във волтове, трябва да го умножите по 5 (по референтното напрежение, тоест по захранващото напрежение на микроконтролера) и да го разделите на 1024.

За да можете да измервате напрежения, по-големи от 5V, или по-скоро, по-големи от захранващото напрежение на микроконтролера, тъй като действителното напрежение на изхода на 5-волтовия стабилизатор на платката ARDUINO UNO може да се различава от 5V и обикновено a малко по-ниско, трябва да използвате конвенционални резистивни разделители на входа. Тук това е делител на напрежение между резистори R5 и R4.

В допълнение, използването на трансформатор играе роля, както и разликата между стойността на постоянно напрежение и променливо напрежение. Следователно се добавя първоначалният коефициент на деление от 0,016. Четенето на данни от аналоговия порт се извършва в реда:

vout=analogRead(analogInput);

След това действителното напрежение се изчислява, като се вземе предвид съотношението на разделяне на делителя на входното напрежение:

волт=vout*5.0/1024.0/0.016;

В този ред числото 5.0 е напрежението на изхода на стабилизатора на платката ARDUINO UNO. В идеалния случай трябва да е 5V, но за да работи волтметърът точно, първо трябва да се измери това напрежение.

Свържете източник на захранване от 12 V и измерете напрежението +5 V на конектора POWER на платката с доста точен волтметър. Какво се случва, след това въведете в този ред вместо 5.0, например, ако има 4.85V, редът ще изглежда така:

волт=vout*4,85/1024,0/0,016;

След това резултатите от измерването се показват на LCD дисплея. В първия ред на дисплея се въвежда напрежението, а във втория - честотата. Мерните единици са обозначени като "V" и "Hz". Що се отнася до измерването на честотата, изобщо не се изисква настройка. Но за да измерите напрежението, трябва да калибрирате устройството според стандарта, като регулирате резистора R5.

Каравкин В. РК-10-17.

  • Урок

Въведение

Здравейте всички! След завършване на цикъла на сензорите имаше различни въпроси относно измерването на параметрите на потреблението на домакински и не много електрически уреди. Кой колко консумира, как да върже какво да мери, какви тънкости има и т.н. Време е да разкриете всички карти в тази област.
В тази поредица от статии ще разгледаме темата за измерване на параметрите на електроенергията. Всъщност има много голям брой от тези параметри, за които ще се опитам постепенно да говоря в малки серии.
Засега са планирани три серии:
  • Измерване на електроенергия.
  • Качество на захранването.
  • Уреди за измерване на параметри на електроенергия.
По време на процеса на анализ ние ще решаваме определени практически проблеми на микроконтролерите до постигане на резултата. Разбира се, по-голямата част от тази серия ще бъде посветена на измерване на променливото напрежение и може да бъде полезна за всички, които обичат да управляват електрическите уреди в своя интелигентен дом.
Въз основа на резултатите от целия цикъл ще произведем някакъв вид интелигентен електромер с достъп до интернет. Напълно заклетите фенове на управлението на електрическите уреди на своя интелигентен дом могат да осигурят цялата възможна помощ при внедряването на комуникационната част на база, например MajorDomo. Нека направим OpenSource по-добър умен дом, така да се каже.
В тази серия от две части ще проучим следните въпроси:
  • Свързване на датчици за ток и напрежение в DC устройства, както и монофазни и трифазни AC вериги;
  • Измерване на ефективните стойности на тока и напрежението;
  • Измерване на фактора на мощността;
  • Обща, активна и реактивна мощност;
  • Консумация на електроенергия;
Щраквайки по-долу, ще намерите отговорите на първите два въпроса от този списък. Съзнателно не засягам въпросите за точността на измерване на индикаторите и от тази серия съм доволен само от резултатите, получени с точност плюс или минус обувка. Определено ще посветя отделна статия на този въпрос в третата серия.

1. Свързване на сензори


В последната серия за сензори за напрежение и ток говорих за видовете сензори, но не говорих за това как да ги използвате и къде да ги поставите. Време е да го поправим
Свързване на DC сензори
Ясно е, че цялата серия ще бъде посветена на променливотокови системи, но нека бързо да преминем към постоянните вериги, тъй като това може да ни бъде полезно при разработването на постоянни захранвания. Вземете за пример класически PWM конвертор:


Фигура 1. ШИМ преобразувател
Нашата задача е да осигурим стабилизирано изходно напрежение. Освен това, въз основа на информация от датчика за ток, е възможно да се контролира режимът на работа на индуктора L1, предотвратявайки неговото насищане, както и да се реализира токова защита на преобразувателя. И за да бъда честен, всъщност няма никакви опции за инсталиране на сензори.
На изхода на преобразувателя е монтиран сензор за напрежение под формата на резистивен делител R1-R2, който е единственият способен да работи при постоянен ток. По правило микросхемата на специализиран преобразувател има вход за обратна връзка и полага всички усилия, за да гарантира, че този вход (3) има определено ниво на напрежение, посочено в документацията за микросхемата. Например 1.25V. Ако нашето изходно напрежение съвпада с това ниво, всичко е наред - ние директно прилагаме изходното напрежение към този вход. Ако не, тогава задайте разделителя. Ако трябва да осигурим изходно напрежение от 5V, тогава делителят трябва да осигури коефициент на разделяне 4, т.е. например R1 = 30k, R2 = 10k.
Сензорът за ток обикновено се инсталира между захранването и преобразувателя и върху чипа. Въз основа на потенциалната разлика между точки 1 и 2 и с известно съпротивление на резистори Rs е възможно да се определи текущата стойност на тока на нашия индуктор. Инсталирането на токов сензор между източниците и товара не е добра идея, тъй като филтърният кондензатор ще бъде отрязан от резистор от консуматорите на импулсен ток. Инсталирането на резистор в пролуката на общия проводник също не предвещава нищо добро - ще има две нива на земята, с които ще бъде удоволствие да се занимавате.
Проблемите с падането на напрежението могат да бъдат избегнати чрез използване на безконтактни сензори за ток - като сензори на Хол:


Фигура 2. Безконтактен сензор за ток
Има обаче по-хитър начин за измерване на тока. В края на краищата напрежението пада през транзистора по абсолютно същия начин и през него протича същият ток като индуктивността. Следователно текущата стойност на тока може да се определи и от спада на напрежението върху него. Честно казано, ако погледнете вътрешната структура на конверторните чипове, например от Texas Instruments, тогава този метод е толкова често срещан, колкото и предишните. Точността на този метод, разбира се, не е най-високата, но това е напълно достатъчно, за да работи текущото прекъсване.


Фигура 3. Транзистор като токов сензор
Ние правим същото в други схеми на подобни преобразуватели, независимо дали са усилващи или инвертиращи.
Необходимо е обаче отделно да се споменат трансформаторните преобразуватели напред и обратно.


Фигура 4. Свързване на токови сензори в обратноходови преобразуватели
Те също могат да използват или външно съпротивление, или транзистор в неговата роля.
Това е мястото, където приключихме със свързването на сензори към DC преобразуватели. Ако имате предложения за други варианти, ще се радвам да допълня статията с тях.
1.2 Свързване на сензори към еднофазни AC вериги
В AC вериги имаме много по-голям избор от възможни сензори. Нека разгледаме няколко варианта.
Най-простият е да използвате резистивен делител на напрежение и токов шунт.


Фигура 5. Свързване на резисторни сензори
Той обаче има няколко съществени недостатъка:
Първо, ние или ще осигурим значителна амплитуда на сигнала от текущия шунт, като разпределим голямо количество мощност към него, или ще се задоволим с малка амплитуда на сигнала и впоследствие ще го усилим. И второ, резисторът създава потенциална разлика между неутралата на мрежата и неутралата на устройството. Ако устройството е изолирано, това няма значение, но ако устройството има заземителна клема, рискуваме да останем без сигнал от датчика за ток, тъй като ще го съединим на късо. Може би си струва да опитате сензори, които работят на други принципи.
Например ще използваме токови и напреженови трансформатори или токов сензор с ефект на Хол и напреженов трансформатор. Има много повече възможности за работа с оборудване, тъй като нулевият проводник няма загуби и най-важното е, че и в двата случая има галванична изолация на измервателното оборудване, което често може да бъде полезно. Необходимо е обаче да се има предвид, че сензорите за ток и напрежение на трансформатора имат ограничена честотна характеристика и ако искаме да измерим хармоничния състав на изкривяванията, тогава не е факт, че ще работи.


Фигура 6. Свързване на трансформатор и безконтактни сензори за ток и напрежение
1.3 Свързване на сензори към многофазни AC вериги
В многофазните мрежи способността ни да свързваме сензори за ток е малко по-малка. Това се дължи на факта, че изобщо няма да е възможно да се използва токов шунт, тъй като потенциалната разлика между фазовите шунтове ще варира в рамките на стотици волта и не знам за контролер с общо предназначение, чиито аналогови входове могат да издържат такава злоупотреба.
Разбира се, има един начин да използвате токови шунтове - за всеки канал трябва да направите галванично изолиран аналогов вход. Но е много по-лесно и по-надеждно да се използват други сензори.
В моя анализатор на качеството използвам резистивни делители на напрежение и дистанционни сензори за ток с ефект на Хол.

Фигура 7. Сензори за ток в трифазна мрежа
Както можете да видите от фигурата, използваме четирипроводна връзка. Разбира се, вместо сензори за ток с ефект на Хол, можете да използвате токови трансформатори или вериги на Роговски.
Вместо резистивни делители могат да се използват трансформатори на напрежение, както за четирипроводни, така и за трипроводни системи.
В последния случай първичните намотки на напреженовите трансформатори са свързани с триъгълник, а вторичните намотки със звезда, чиято обща точка е общата точка на измервателната верига


Фигура 8. Използване на напреженови трансформатори в трифазна мрежа

2 Средноквадратична стойност на тока и напрежението


Време е да решим проблема с измерването на нашите сигнали. От практическо значение за нас е преди всичко ефективната стойност на тока и напрежението.
Нека ви напомня за оборудването от серията сензори. Използвайки ADC на нашия микроконтролер, ние ще записваме моментната стойност на напрежението на редовни интервали. Така през периода на измерване ще имаме масив от данни за нивото на моментната стойност на напрежението (за тока всичко е подобно).


Фигура 9. Серия от моментни стойности на напрежението
Нашата задача е да изчислим ефективната стойност. Първо, нека използваме интегралната формула:
(1)
В една цифрова система трябва да се ограничим до определен период от време, така че преминаваме към сумата:
(2)
Къде е периодът на семплиране на нашия сигнал и е броят на семплирането по време на периода на измерване. Тук някъде във видеото започвам да говоря глупости за равенството на площите. Трябваше да поспя този ден. =)
В микроконтролерите MSP430FE4252, които се използват в монофазни електромери Mercury, се правят 4096 отброявания за период на измерване от 1, 2 или 4 секунди. Ще разчитаме на T=1c и N=4096 в това, което следва. Освен това 4096 точки в секунда ще ни позволят да използваме алгоритми за бързо преобразуване на Фурие, за да определим хармоничния спектър до 40-та хармоника, както се изисква от GOST. Но повече за това в следващия епизод.
Нека скицираме алгоритъм за нашата програма. Трябва да осигурим стабилно стартиране на ADC на всеки 1/8192 секунди, тъй като имаме два канала и ще измерваме тези данни последователно. За да направите това, настройте таймер и сигналът за прекъсване автоматично ще рестартира ADC. Всички ADC могат да направят това.
Ще напишем бъдещата програма на arduino, тъй като много хора я имат под ръка. Засега нашият интерес е чисто академичен.
Имайки системна кварцова честота от 16 MHz и 8-битов таймер (така че животът да не изглежда като мед), трябва да гарантираме, че всяко прекъсване на таймера работи на честота от 8192 Hz.
Тъжни сме, че 16 MHz не са разделени толкова, колкото ни е необходимо и крайната работна честота на таймера е 8198 Hz. Затваряме си очите за грешката от 0,04% и все още четем 4096 проби на канал.
Тъжни сме, че прекъсването при препълване в arduino е заето с изчисляване на времето (отговорно за милиси и забавяне, така че ще спре да работи нормално), така че използваме прекъсването за сравнение.
И изведнъж осъзнаваме, че сигналът, който идва към нас, е биполярен и че msp430fe4252 се справя перфектно с него. Ние се задоволяваме с еднополюсен ADC, така че сглобяваме прост преобразувател на биполярен към еднополярен сигнал с помощта на операционен усилвател:


Фигура 10. Конвертор на биполярен към еднополярен сигнал
Освен това, нашата задача е да гарантираме, че нашата синусоида осцилира спрямо половината от референтното напрежение - тогава или ще извадим половината от диапазона, или ще активираме опцията в настройките на ADC и ще получим стойности със знак.
Arduino има 10-битов ADC, така че ще извадим половината от резултата без знак в диапазона 0-1023 и ще получим -512-511.
Проверяваме модела, сглобен в LTSpiceIV, и се уверяваме, че всичко работи както трябва. Във видео материала допълнително проверяваме това експериментално.


Фигура 11. Резултат от симулацията. Зеленото е източникът на сигнал, синьото е изходният сигнал.

Скица за Arduino за един канал

void setup() ( autoadcsetup(); DDRD |=(1<

Програмата е написана в Arduino IDE за микроконтролера ATmega1280. На моята платка за отстраняване на грешки първите 8 канала са маршрутизирани за вътрешните нужди на платката, така че се използва каналът ADC8. Възможно е да използвате тази скица за платка с ATmega168, но трябва да изберете правилния канал.
Вътре в прекъсванията изкривяваме няколко сервизни пина, за да видим ясно работната честота на цифровизация.
Няколко думи за това откъде идва коефициентът 102. При първото стартиране от генератора се подава сигнал с различни амплитуди, от осцилоскопа се отчита ефективната стойност на напрежението и от конзолата се взема изчислената стойност в абсолютни единици ADC. .

Умакс, В Урмс, Б Преброено
3 2,08 212
2,5 1,73 176
2 1,38 141
1,5 1,03 106
1 0,684 71
0,5 0,358 36
0,25 0,179 19

Разделяйки стойностите на третата колона на стойностите на втората, получаваме средно 102. Това ще бъде нашият коефициент на „калибриране“. Можете обаче да забележите, че с намаляването на напрежението точността рязко пада. Това се дължи на ниската чувствителност на нашия ADC. Всъщност 10 цифри за точни изчисления са катастрофално малко и ако е напълно възможно да се измери напрежението в контакта по този начин, тогава използването на 10-битов ADC за измерване на тока, консумиран от товара, ще бъде престъпление срещу метрологията .

В този момент ще направим почивка. В следващата част ще разгледаме останалите три въпроса от тази серия и плавно ще преминем към създаването на самото устройство.

Ще намерите представения фърмуер, както и друг фърмуер за тази серия (тъй като снимам видео материали по-бързо, отколкото подготвям статии) в хранилището на GitHub.

Както знаете, ATmega може да се захранва от широк диапазон от напрежения, така че може да остане „в експлоатация“ дори в случай на постепенно разреждане на батерията, изразяващо се в намаляване на напрежението. Тази ситуация в роботиката е повече от стандартна; не е нужно да търсите далеч за пример: нека вземем проекта Voyager. Това е роботизиран космически кораб, изстрелян извън Слънчевата система и следователно лишенивъзможност за хранене от слънчеви панели. Оборудван е с радиоизотопни топлинни генератори (ядрени батерии), които към момента на пускане произвеждат 30V / 470W, но всяка година губят 0,78% от мощността си. Съответно към момента са останали около 60% от оригинала и е необходимо подсистемите за изследване да се включват една по една, за да не се претоварват генераторите.

В Arduino не можете просто да свържете Vcc към аналоговия щифт директно - по подразбиране AREF е свързан към Vcc и винаги ще получавате максимална стойност от 1023, независимо от какво напрежение се захранвате. Свързването към AREF на източник на напрежение с предварително известно, стабилно напрежение помага, но това е допълнителен елемент във веригата.

Можете също да свържете Vcc към AREF чрез диод: Падът на напрежението на диода е известен предварително, така че изчисляването на Vcc не е трудно. Въпреки това, с такава верига през диод токът тече постоянно, съкращавайки живота на батерията, което също не е много добре.

Как да излезем от ситуацията, без да добавяме нови елементи към веригата и без да намаляваме живота на батерията? Оказва се, че има изход и вътрешният източник на референтно напрежение 1.1V в ATmega ще ни помогне (в документацията се нарича референтен bandgap), който не зависи от Vcc. Това води до следната формула:

V_BAT=(1.1*1024)/analogRead(14);

където V_BAT е напрежението Vcc във волтове, а analogRead(14) е резултатът от директното четене на ADC от канал 14.

Arduino позволява четене само от канали 0-7 (не се изненадвайте, ако намерите само Diecimila или Duemilanove 0-5 , вземете например Seeeduino ;)

За да направите възможно изпращането на данни към други канали, включително 14, трябва да промените маската в основната библиотека на Arduino. За да направите това, отворете файла hardware\cores\arduino\wiring_analog.c и намерете реда там:

ADMUX = (аналогова_референция

заменете го с:

ADMUX = (аналогова_референция

След това можете да напишете тази скица:

uint16_t raw_bandgap = 0; // вътрешна стойност на обхвата
float volt_battery = 0.0;

невалиден настройвам (){
Serial.begin(57600);
}

невалиден цикъл (){
// Прочетете напрежението на батерията
analogReference(ПО ПОДРАЗБИРАНЕ); // използвайте Vcc като AREF
// неактивно четене след промяна на AREF (вижте 23.5.2 в ръководството)
raw_bandgap = analogRead(14); // измерваме стойността на вътрешната ширина на лентата
volt_battery = (1,1 * 1024) / raw_bandgap; // изчисляване на Vcc
Сериен .print(volt_battery);
Serial.println("v_bat");
забавяне (1000);
}

Тези, които искат да знаят напрежението на батерията, трябва да имат предвид това с регулатор(тип L7805CV), ние ще измерим напрежение Voutрегулатор и ако има такъв входен диод- трябва да вземем предвид напрежението, което пада върху него.

Ето как изглеждат изчислените стойности в Seeeduino, в момента на превключване от 5V към 3.3V захранване:

Моят волтметър обаче показва по-ниски стойности. Но въпреки това скицата работи ;)

UPD: Намерих примери, в които се използва 1.05 вместо константата 1.1. Резултатът е много по-близо до показанията на волтметъра, търся теоретична основа, която може да обясни този факт...

  • Урок

Въведение

Здравейте всички! След завършване на цикъла на сензорите имаше различни въпроси относно измерването на параметрите на потреблението на домакински и не много електрически уреди. Кой колко консумира, как да върже какво да мери, какви тънкости има и т.н. Време е да разкриете всички карти в тази област.
В тази поредица от статии ще разгледаме темата за измерване на параметрите на електроенергията. Всъщност има много голям брой от тези параметри, за които ще се опитам постепенно да говоря в малки серии.
Засега са планирани три серии:
  • Измерване на електроенергия.
  • Качество на захранването.
  • Уреди за измерване на параметри на електроенергия.
По време на процеса на анализ ние ще решаваме определени практически проблеми на микроконтролерите до постигане на резултата. Разбира се, по-голямата част от тази серия ще бъде посветена на измерване на променливото напрежение и може да бъде полезна за всички, които обичат да управляват електрическите уреди в своя интелигентен дом.
Въз основа на резултатите от целия цикъл ще произведем някакъв вид интелигентен електромер с достъп до интернет. Напълно заклетите фенове на управлението на електрическите уреди на своя интелигентен дом могат да осигурят цялата възможна помощ при внедряването на комуникационната част на база, например MajorDomo. Нека направим OpenSource по-добър умен дом, така да се каже.
В тази серия от две части ще проучим следните въпроси:
  • Свързване на датчици за ток и напрежение в DC устройства, както и монофазни и трифазни AC вериги;
  • Измерване на ефективните стойности на тока и напрежението;
  • Измерване на фактора на мощността;
  • Обща, активна и реактивна мощност;
  • Консумация на електроенергия;
Щраквайки по-долу, ще намерите отговорите на първите два въпроса от този списък. Съзнателно не засягам въпросите за точността на измерване на индикаторите и от тази серия съм доволен само от резултатите, получени с точност плюс или минус обувка. Определено ще посветя отделна статия на този въпрос в третата серия.

1. Свързване на сензори


В последната серия за сензори за напрежение и ток говорих за видовете сензори, но не говорих за това как да ги използвате и къде да ги поставите. Време е да го поправим
Свързване на DC сензори
Ясно е, че цялата серия ще бъде посветена на променливотокови системи, но нека бързо да преминем към постоянните вериги, тъй като това може да ни бъде полезно при разработването на постоянни захранвания. Вземете за пример класически PWM конвертор:


Фигура 1. ШИМ преобразувател
Нашата задача е да осигурим стабилизирано изходно напрежение. Освен това, въз основа на информация от датчика за ток, е възможно да се контролира режимът на работа на индуктора L1, предотвратявайки неговото насищане, както и да се реализира токова защита на преобразувателя. И за да бъда честен, всъщност няма никакви опции за инсталиране на сензори.
На изхода на преобразувателя е монтиран сензор за напрежение под формата на резистивен делител R1-R2, който е единственият способен да работи при постоянен ток. По правило микросхемата на специализиран преобразувател има вход за обратна връзка и полага всички усилия, за да гарантира, че този вход (3) има определено ниво на напрежение, посочено в документацията за микросхемата. Например 1.25V. Ако нашето изходно напрежение съвпада с това ниво, всичко е наред - ние директно прилагаме изходното напрежение към този вход. Ако не, тогава задайте разделителя. Ако трябва да осигурим изходно напрежение от 5V, тогава делителят трябва да осигури коефициент на разделяне 4, т.е. например R1 = 30k, R2 = 10k.
Сензорът за ток обикновено се инсталира между захранването и преобразувателя и върху чипа. Въз основа на потенциалната разлика между точки 1 и 2 и с известно съпротивление на резистори Rs е възможно да се определи текущата стойност на тока на нашия индуктор. Инсталирането на токов сензор между източниците и товара не е добра идея, тъй като филтърният кондензатор ще бъде отрязан от резистор от консуматорите на импулсен ток. Инсталирането на резистор в пролуката на общия проводник също не предвещава нищо добро - ще има две нива на земята, с които ще бъде удоволствие да се занимавате.
Проблемите с падането на напрежението могат да бъдат избегнати чрез използване на безконтактни сензори за ток - като сензори на Хол:


Фигура 2. Безконтактен сензор за ток
Има обаче по-хитър начин за измерване на тока. В края на краищата напрежението пада през транзистора по абсолютно същия начин и през него протича същият ток като индуктивността. Следователно текущата стойност на тока може да се определи и от спада на напрежението върху него. Честно казано, ако погледнете вътрешната структура на конверторните чипове, например от Texas Instruments, тогава този метод е толкова често срещан, колкото и предишните. Точността на този метод, разбира се, не е най-високата, но това е напълно достатъчно, за да работи текущото прекъсване.


Фигура 3. Транзистор като токов сензор
Ние правим същото в други схеми на подобни преобразуватели, независимо дали са усилващи или инвертиращи.
Необходимо е обаче отделно да се споменат трансформаторните преобразуватели напред и обратно.


Фигура 4. Свързване на токови сензори в обратноходови преобразуватели
Те също могат да използват или външно съпротивление, или транзистор в неговата роля.
Това е мястото, където приключихме със свързването на сензори към DC преобразуватели. Ако имате предложения за други варианти, ще се радвам да допълня статията с тях.
1.2 Свързване на сензори към еднофазни AC вериги
В AC вериги имаме много по-голям избор от възможни сензори. Нека разгледаме няколко варианта.
Най-простият е да използвате резистивен делител на напрежение и токов шунт.


Фигура 5. Свързване на резисторни сензори
Той обаче има няколко съществени недостатъка:
Първо, ние или ще осигурим значителна амплитуда на сигнала от текущия шунт, като разпределим голямо количество мощност към него, или ще се задоволим с малка амплитуда на сигнала и впоследствие ще го усилим. И второ, резисторът създава потенциална разлика между неутралата на мрежата и неутралата на устройството. Ако устройството е изолирано, това няма значение, но ако устройството има заземителна клема, рискуваме да останем без сигнал от датчика за ток, тъй като ще го съединим на късо. Може би си струва да опитате сензори, които работят на други принципи.
Например ще използваме токови и напреженови трансформатори или токов сензор с ефект на Хол и напреженов трансформатор. Има много повече възможности за работа с оборудване, тъй като нулевият проводник няма загуби и най-важното е, че и в двата случая има галванична изолация на измервателното оборудване, което често може да бъде полезно. Необходимо е обаче да се има предвид, че сензорите за ток и напрежение на трансформатора имат ограничена честотна характеристика и ако искаме да измерим хармоничния състав на изкривяванията, тогава не е факт, че ще работи.


Фигура 6. Свързване на трансформатор и безконтактни сензори за ток и напрежение
1.3 Свързване на сензори към многофазни AC вериги
В многофазните мрежи способността ни да свързваме сензори за ток е малко по-малка. Това се дължи на факта, че изобщо няма да е възможно да се използва токов шунт, тъй като потенциалната разлика между фазовите шунтове ще варира в рамките на стотици волта и не знам за контролер с общо предназначение, чиито аналогови входове могат да издържат такава злоупотреба.
Разбира се, има един начин да използвате токови шунтове - за всеки канал трябва да направите галванично изолиран аналогов вход. Но е много по-лесно и по-надеждно да се използват други сензори.
В моя анализатор на качеството използвам резистивни делители на напрежение и дистанционни сензори за ток с ефект на Хол.

Фигура 7. Сензори за ток в трифазна мрежа
Както можете да видите от фигурата, използваме четирипроводна връзка. Разбира се, вместо сензори за ток с ефект на Хол, можете да използвате токови трансформатори или вериги на Роговски.
Вместо резистивни делители могат да се използват трансформатори на напрежение, както за четирипроводни, така и за трипроводни системи.
В последния случай първичните намотки на напреженовите трансформатори са свързани с триъгълник, а вторичните намотки със звезда, чиято обща точка е общата точка на измервателната верига


Фигура 8. Използване на напреженови трансформатори в трифазна мрежа

2 Средноквадратична стойност на тока и напрежението


Време е да решим проблема с измерването на нашите сигнали. От практическо значение за нас е преди всичко ефективната стойност на тока и напрежението.
Нека ви напомня за оборудването от серията сензори. Използвайки ADC на нашия микроконтролер, ние ще записваме моментната стойност на напрежението на редовни интервали. Така през периода на измерване ще имаме масив от данни за нивото на моментната стойност на напрежението (за тока всичко е подобно).


Фигура 9. Серия от моментни стойности на напрежението
Нашата задача е да изчислим ефективната стойност. Първо, нека използваме интегралната формула:
(1)
В една цифрова система трябва да се ограничим до определен период от време, така че преминаваме към сумата:
(2)
Къде е периодът на семплиране на нашия сигнал и е броят на семплирането по време на периода на измерване. Тук някъде във видеото започвам да говоря глупости за равенството на площите. Трябваше да поспя този ден. =)
В микроконтролерите MSP430FE4252, които се използват в монофазни електромери Mercury, се правят 4096 отброявания за период на измерване от 1, 2 или 4 секунди. Ще разчитаме на T=1c и N=4096 в това, което следва. Освен това 4096 точки в секунда ще ни позволят да използваме алгоритми за бързо преобразуване на Фурие, за да определим хармоничния спектър до 40-та хармоника, както се изисква от GOST. Но повече за това в следващия епизод.
Нека скицираме алгоритъм за нашата програма. Трябва да осигурим стабилно стартиране на ADC на всеки 1/8192 секунди, тъй като имаме два канала и ще измерваме тези данни последователно. За да направите това, настройте таймер и сигналът за прекъсване автоматично ще рестартира ADC. Всички ADC могат да направят това.
Ще напишем бъдещата програма на arduino, тъй като много хора я имат под ръка. Засега нашият интерес е чисто академичен.
Имайки системна кварцова честота от 16 MHz и 8-битов таймер (така че животът да не изглежда като мед), трябва да гарантираме, че всяко прекъсване на таймера работи на честота от 8192 Hz.
Тъжни сме, че 16 MHz не са разделени толкова, колкото ни е необходимо и крайната работна честота на таймера е 8198 Hz. Затваряме си очите за грешката от 0,04% и все още четем 4096 проби на канал.
Тъжни сме, че прекъсването при препълване в arduino е заето с изчисляване на времето (отговорно за милиси и забавяне, така че ще спре да работи нормално), така че използваме прекъсването за сравнение.
И изведнъж осъзнаваме, че сигналът, който идва към нас, е биполярен и че msp430fe4252 се справя перфектно с него. Ние се задоволяваме с еднополюсен ADC, така че сглобяваме прост преобразувател на биполярен към еднополярен сигнал с помощта на операционен усилвател:


Фигура 10. Конвертор на биполярен към еднополярен сигнал
Освен това, нашата задача е да гарантираме, че нашата синусоида осцилира спрямо половината от референтното напрежение - тогава или ще извадим половината от диапазона, или ще активираме опцията в настройките на ADC и ще получим стойности със знак.
Arduino има 10-битов ADC, така че ще извадим половината от резултата без знак в диапазона 0-1023 и ще получим -512-511.
Проверяваме модела, сглобен в LTSpiceIV, и се уверяваме, че всичко работи както трябва. Във видео материала допълнително проверяваме това експериментално.


Фигура 11. Резултат от симулацията. Зеленото е източникът на сигнал, синьото е изходният сигнал.

Скица за Arduino за един канал

void setup() ( autoadcsetup(); DDRD |=(1<

Програмата е написана в Arduino IDE за микроконтролера ATmega1280. На моята платка за отстраняване на грешки първите 8 канала са маршрутизирани за вътрешните нужди на платката, така че се използва каналът ADC8. Възможно е да използвате тази скица за платка с ATmega168, но трябва да изберете правилния канал.
Вътре в прекъсванията изкривяваме няколко сервизни пина, за да видим ясно работната честота на цифровизация.
Няколко думи за това откъде идва коефициентът 102. При първото стартиране от генератора се подава сигнал с различни амплитуди, от осцилоскопа се отчита ефективната стойност на напрежението и от конзолата се взема изчислената стойност в абсолютни единици ADC. .

Умакс, В Урмс, Б Преброено
3 2,08 212
2,5 1,73 176
2 1,38 141
1,5 1,03 106
1 0,684 71
0,5 0,358 36
0,25 0,179 19

Разделяйки стойностите на третата колона на стойностите на втората, получаваме средно 102. Това ще бъде нашият коефициент на „калибриране“. Можете обаче да забележите, че с намаляването на напрежението точността рязко пада. Това се дължи на ниската чувствителност на нашия ADC. Всъщност 10 цифри за точни изчисления са катастрофално малко и ако е напълно възможно да се измери напрежението в контакта по този начин, тогава използването на 10-битов ADC за измерване на тока, консумиран от товара, ще бъде престъпление срещу метрологията .

В този момент ще направим почивка. В следващата част ще разгледаме останалите три въпроса от тази серия и плавно ще преминем към създаването на самото устройство.

Ще намерите представения фърмуер, както и друг фърмуер за тази серия (тъй като снимам видео материали по-бързо, отколкото подготвям статии) в хранилището на GitHub.