Krets för mätning av växelspänning på Arduino. Hemlig voltmeter i Arduino - mäter batterispänning med hjälp av en mikrokontroller

Om du är mycket orolig för förbrukningen av elektrisk energi och verkligen vill lista ut den skyldige, är det här din dag. Vi kommer att montera en strömsensor och skriva enkel logik för att bearbeta ingångsvärdena för att omvandla värdena till kilowatt/timme.

För montering använde jag en bräda Arduino nano(ingen hindrar dig från att använda samma kod för ESP- eller STM-kort), LCD-skärm, 56 Ohm motstånd, 100 kOhm motstånd, 10 uF kondensator, CT-strömsensor - Talema AC103 (med ett nominellt mått på 30A och max. av 75A).

Vad är en strömsensor?


Strömgivaren är en magnetisk krets med ett gap och en kompensationslindning, samt en inbyggd Hall-givare och styrkort. Hall-sensorn placeras i mellanrummet i den magnetiska kretsen och reagerar på magnetfältet som skapas av spolen. Ju starkare spänningen magnetiskt fält, ju starkare Hall-sensorn producerar en signal, som förstärks av styrkortet.
Strömsensorer finns tillgängliga för mätning växelström Och likström. Vår - CT-Talema AC103 - för alternerande.

Låt oss montera vår enhet enligt diagrammet:


LCD-skärmen har redan stift för att ansluta våra analoga portar för signalmätning - och det är bekvämt.
Den enda fasingångskabeln måste föras genom strömsensorn pga Ofta når inte all spänning den neutrala ledningen - en del kan gå igenom jordning.


Glöm inte att vi behöver kalibrera belastningsmotståndet R3. Beräkningsformel R = V / I - R = 2,5 / 0,042 = 59,5 Ohm där 2,5 är referensspänningen på kortet, och 42mA är kortets förbrukning. Därför accepterar vi det närmaste motståndet i nominellt värde - 56 Ohm.
För att dela nätspänningen till referensen 5/2 måste du installera två identiska motstånd R1 och R2.

Allt som återstår är att ladda upp exempelkoden till Arduino:

//Michael Klements //The DIY Life //27 oktober 2014 #inkludera int currentPin = 1; //Tilldela CT-ingång till stift 1 dubbelkilo = 0; int peakPower = 0; LiquidCrystal lcd(8, 9, 4, 5, 6, 7); //Tilldela LCD-skärmstift, enligt kraven på LCD-skärmen void setup() ( lcd.begin(16,2); // kolumner, rader. använd 16,2 för en 16x2 LCD, etc. lcd.clear(); lcd .setCursor(0,0); // ställ in markören på kolumn 0, rad 0 (den första raden) lcd.print("Kör" ) void loop() ( int ström = 0; int maxström = 0; int minström = 1000 ; för (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 >= maxström) maxström = ström; annat om (aktuell<= 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; ) kilos = kilos + (RMSPower * (2.05/60/60/1000)); //Beräkna använda kilowattimmar fördröjning (2000); lcd.clear(); lcd.setCursor(0,0); // Visar all aktuell data lcd.print(RMSCurrent); lcd.print("A"); lcd.setCursor(10,0); lcd.print(RMSPower); lcd.print("W"); lcd.setCursor(0,1); lcd.print(kilos); lcd.print("kWh"); lcd.setCursor(10,1); lcd.print(peakPower); lcd.print("W"); )

Den sista touchen av vår installation kommer att vara kalibrering. Det är bäst att utföra det med en referensbelastning med känd ström påslagen. Kraftfulla glödlampor är väl lämpade för detta. Låt oss ta en 100 Watt lampa. Vi slår på tavlan och beräknar korrektionsfaktorn:
Dubbel RMSCurrent = ((maxCurrent - 516) * 0,707) /11,8337 där 11,8337 är den valda koefficienten för att kompensera för avvikelser i mätningar.

Kretsschema över en hemmagjord enhet baserad på Arduino Uno, som är designad för att mäta frekvens och spänning i ett uttag och visa resultaten på en 1602A-skärm. Enheten är mycket enkel att tillverka, tack vare användningen av en färdig ARDUINO UNO-modul.

Schematiskt diagram

Indikatorn är en 1602A typ LCD-skärm, den är standard, baserad på HD44780-kontrollern. Beteckningen 1602A betyder egentligen att den står på två rader med 16 tecken per rad.

Grunden för enheten är ARDUINO UNO, detta är en relativt billig färdig modul - ett litet tryckt kretskort på vilket mikrokontrollern ATMEGA328 är placerad, såväl som all dess "rörledning" som är nödvändig för dess drift, inklusive en USB-programmerare och strömförsörjning.

Enheten drivs från elnätet och mäter ovanstående parametrar. Strömkällan fungerar samtidigt som en sensor för att få data om frekvens och spänning i det elektriska nätverket. Strömkällan är gjord på basis av en lågeffekt färdig transformator T1, som har två identiska lindningar med 9V växelspänning vardera.

Ris. 1. Schematiskt diagram över en frekvens- och spänningsmätare i ett elnät, Arduino Uno och 1602A används.

En lindning tjänar till att ta emot matningsspänning. Växelspänningen från den matas till likriktarbryggan med hjälp av dioderna VD1-VD4. Kondensator C3 jämnar ut krusningarna i den likriktade spänningen.

C3 får en konstant spänning på ca 12V, som tillförs kontakten för att mata ström till ARDUINO UNO-kortet, till ingången på 5V-spänningsregulatorn på detta kort, som driver hela kortet och H1-indikatorn.

Transformatorns andra sekundärlindning fungerar som en sensor för mätning av kraftnätsparametrar. Växelspänningen från den genom R1 tillförs en pulsformare vid nätfrekvensen, gjord på transistor VT1 enligt en switchkrets. Dessa pulser skickas till digital port D10 på ARDUINO UNO-kortet.

Nätverkets växelspänning mäts med hjälp av en likriktare som använder diod VD5 och kondensator C2. Storleken på växelspänningen i nätverket bestäms av storleken på likspänningen på denna kondensator och, via en justerbar delare på motstånden R4 och R5, tillförs den analoga ingången A1 på ARDUINO UNO-kortet.

Program

C++-programmet med detaljerade kommentarer ges i Tabell 1. För att mäta frekvensen, använd pulseln-funktionen, som mäter i mikrosekunder varaktigheten av den positiva eller negativa flanken av ingångspulsen.

Bord 1.

Ris. 2. Källkod för programmet för mätning av frekvens och spänningsvärde i elnätet.

Så för att ta reda på perioden måste du lägga till varaktigheten av de positiva och negativa halvcyklerna, och för att ta reda på frekvensen i hertz måste du dividera 1 000 000 med den beräknade perioden.

Att mäta varaktigheten av en period består av två delar, först mäts varaktigheterna för de positiva och negativa halvvågorna i linjerna:

Htime=pulseln(10,HIGH);

Ltime=pulseln(10,LOW);

Därefter beräknas hela perioden på raden:

Ttime=Htime+Ltime ;

Och sedan, beräkna frekvensen i raden:

frekvens=1000000/Ttid;

Spänningsmätprogrammets åtgärd är baserad på att läsa data från den analoga ingången och beräkna mätresultatet. Utgången från den analoga porten omvandlas till digital form av mikrokontrollerns ADC. För att få resultatet i voltenheter måste du multiplicera det med 5 (med referensspänningen, det vill säga med mikrokontrollerns matningsspänning) och dividera med 1024.

För att kunna mäta spänningar större än 5V, eller snarare, större än mikrokontrollerns matningsspänning, eftersom den faktiska spänningen vid utgången av 5-voltsstabilisatorn på ARDUINO UNO-kortet kan skilja sig från 5V, och vanligtvis en lite lägre måste du använda konventionella resistiva delare vid ingången. Här är det en spänningsdelare över motstånden R5 och R4.

Dessutom spelar användningen av en transformator en roll, liksom skillnaden mellan värdet på likspänning och växelspänning. Därför läggs den ursprungliga divisionsfaktorn på 0,016 till. Läsning av data från den analoga porten sker i raden:

vout=analogRead(analogInput);

Sedan beräknas den faktiska spänningen med hänsyn till divisionsförhållandet för inspänningsdelaren:

volt=vout*5,0/1024,0/0,016;

På denna rad är siffran 5.0 spänningen vid utgången av stabilisatorn på ARDUINO UNO-kortet. Helst ska det vara 5V, men för att voltmetern ska fungera korrekt måste denna spänning först mätas.

Anslut en 12V-strömkälla och mät +5V-spänningen vid POWER-kontakten på kortet med en ganska exakt voltmeter. Vad som händer, skriv sedan in på den här raden istället för 5.0, till exempel, om det finns 4.85V, kommer linjen att se ut så här:

volt=vout*4,85/1024,0/0,016;

Därefter visas mätresultaten på LCD-skärmen. Spänningen anges i den första raden på displayen och frekvensen i den andra. Måttenheterna indikeras som "V" och "Hz". När det gäller frekvensmätning krävs ingen justering alls. Men för att mäta spänningen måste du kalibrera enheten enligt standarden genom att justera motståndet R5.

Karavkin V. RK-10-17.

  • Handledning

Introduktion

Hej alla! Efter att ha slutfört cykeln på sensorer fanns det olika frågor om att mäta förbrukningsparametrarna för hushållsapparater och inte särskilt elektriska apparater. Vem konsumerar hur mycket, hur man kopplar vad man ska mäta, vilka finesser som finns osv. Det är dags att avslöja alla kort i detta område.
I den här artikelserien kommer vi att titta på ämnet att mäta elparametrar. Det finns faktiskt ett väldigt stort antal av dessa parametrar, som jag gradvis kommer att försöka prata om i små serier.
Hittills är det tre serier planerade:
  • Elmätning.
  • Strömkvalitet.
  • Apparater för mätning av elparametrar.
Under analysprocessen kommer vi att lösa vissa praktiska problem på mikrokontroller tills resultatet är uppnått. Naturligtvis kommer det mesta av den här serien att ägnas åt att mäta växelspänning och kan vara användbar för alla som gillar att styra de elektriska apparaterna i sitt smarta hem.
Utifrån resultatet av hela cykeln kommer vi att ta fram någon sorts smart elmätare med internetuppkoppling. Fullständiga fans av att styra de elektriska apparaterna i sitt smarta hem kan ge all möjlig hjälp med att implementera kommunikationsdelen på en bas, till exempel MajorDomo. Låt oss göra OpenSource till ett bättre smart hem så att säga.
I denna tvådelade serie kommer vi att utforska följande frågor:
  • Anslutning av ström- och spänningssensorer i DC-enheter, såväl som enfasiga och trefasiga AC-kretsar;
  • Mätning av effektiva ström- och spänningsvärden;
  • Effektfaktormätning;
  • Total, aktiv och reaktiv effekt;
  • Elförbrukning;
Genom att klicka nedan hittar du svaren på de två första frågorna i denna lista. Jag berör medvetet inte frågorna om noggrannhet vid mätning av indikatorer och från denna serie är jag bara nöjd med de resultat som erhållits med en noggrannhet på plus eller minus en bastsko. Jag kommer definitivt att ägna en separat artikel åt detta nummer i den tredje serien.

1. Anslutning av sensorer


I den senaste serien om spännings- och strömsensorer pratade jag om typerna av sensorer, men pratade inte om hur man använder dem och var man ska placera dem. Det är dags att fixa det
Anslutning av DC-sensorer
Det är klart att hela serien kommer att ägnas åt AC-system, men låt oss snabbt gå över DC-kretsar, eftersom detta kan vara användbart för oss när vi utvecklar DC-strömförsörjning. Ta till exempel en klassisk PWM buck-omvandlare:


Figur 1. PWM Buck Converter
Vår uppgift är att tillhandahålla en stabiliserad utspänning. Dessutom, baserat på information från strömsensorn, är det möjligt att styra driftsläget för induktor L1, förhindra dess mättnad, och även implementera strömskydd för omvandlaren. Och för att vara ärlig, det finns egentligen inga alternativ för att installera sensorer.
En spänningssensor i form av en resistiv delare R1-R2, som är den enda som kan arbeta med likström, är installerad vid omvandlarens utgång. Som regel har en specialiserad omvandlarmikrokrets en återkopplingsingång och gör allt för att säkerställa att denna ingång (3) har en viss spänningsnivå specificerad i dokumentationen för mikrokretsen. Till exempel 1,25V. Om vår utspänning matchar denna nivå är allt bra - vi applicerar direkt utspänningen på denna ingång. Om inte, ställ in avdelaren. Om vi ​​behöver tillhandahålla en utspänning på 5V, måste delaren ge en divisionsfaktor på 4, det vill säga till exempel R1 = 30k, R2 = 10k.
Strömgivaren är vanligtvis installerad mellan strömförsörjningen och omvandlaren och på chipet. Baserat på potentialskillnaden mellan punkterna 1 och 2, och med en känd resistans för motstånden Rs, är det möjligt att bestämma strömvärdet för strömmen i vår induktor. Att installera en strömsensor mellan källorna och lasten är inte en bra idé, eftersom filterkondensatorn kommer att stängas av av ett motstånd från pulsströmförbrukarna. Att installera ett motstånd i gapet på den gemensamma ledningen bådar inte heller gott - det kommer att finnas två marknivåer som det kommer att vara ett nöje att mixtra med.
Spänningsfallsproblem kan undvikas genom att använda beröringsfria strömsensorer - såsom hallsensorer:


Figur 2. Beröringsfri strömsensor
Det finns dock ett smartare sätt att mäta ström. När allt kommer omkring sjunker spänningen över transistorn på exakt samma sätt och samma ström flyter genom den som induktansen. Följaktligen kan strömvärdet för strömmen också bestämmas av spänningsfallet över den. Ärligt talat, om du tittar på den interna strukturen hos omvandlarchips, till exempel från Texas Instruments, så är den här metoden lika vanlig som de tidigare. Noggrannheten för denna metod är naturligtvis inte den högsta, men detta är tillräckligt för att strömbrytaren ska fungera.


Fig 3. Transistor som strömsensor
Vi gör samma sak i andra kretsar med liknande omvandlare, oavsett om det är boostande eller inverterande.
Det är dock nödvändigt att separat nämna transformatorns framåt- och tillbakagångsomvandlare.


Figur 4. Anslutning av strömsensorer i flyback-omvandlare
De kan också använda antingen ett externt motstånd eller en transistor i sin roll.
Det är här vi är klara med att koppla sensorer till DC-omvandlare. Har du förslag på andra alternativ kompletterar jag gärna artikeln med dem.
1.2 Anslutning av sensorer till enfas AC-kretsar
I AC-kretsar har vi ett mycket större urval av möjliga sensorer. Låt oss överväga flera alternativ.
Det enklaste är att använda en resistiv spänningsdelare och en strömshunt.


Figur 5. Anslutning av motståndssensorer
Det har dock ett par betydande nackdelar:
För det första kommer vi antingen att tillhandahålla en betydande amplitud av signalen från den aktuella shunten genom att allokera en stor mängd effekt till den, eller så kommer vi att nöja oss med en liten amplitud av signalen och därefter förstärka den. Och för det andra skapar motståndet en potentialskillnad mellan nätverksneutral och enhetsneutral. Om enheten är isolerad spelar det ingen roll, men om enheten har en jordningsterminal riskerar vi att lämnas utan en signal från den aktuella sensorn, eftersom vi kommer att kortsluta den. Det kan vara värt att prova sensorer som fungerar på andra principer.
Till exempel kommer vi att använda ström- och spänningstransformatorer, eller en Halleffektströmsensor och en spänningstransformator. Det finns mycket fler möjligheter att arbeta med utrustning, eftersom den neutrala ledningen inte har några förluster, och viktigast av allt, i båda fallen finns det galvanisk isolering av mätutrustningen, vilket ofta kan vara användbart. Det är dock nödvändigt att ta hänsyn till att transformatorström- och spänningssensorer har en begränsad frekvensgång och om vi vill mäta den harmoniska sammansättningen av distorsioner så är det inte ett faktum att det kommer att fungera.


Figur 6. Anslutning av transformator och beröringsfria ström- och spänningsgivare
1.3 Anslutning av sensorer till flerfas AC-kretsar
I flerfasnät är vår förmåga att ansluta strömsensorer något mindre. Detta beror på att det inte kommer att vara möjligt att använda en strömshunt alls, eftersom potentialskillnaden mellan fasshuntarna kommer att fluktuera inom hundratals volt och jag känner inte till någon generell styrenhet vars analoga ingångar kan motstå sådant övergrepp.
Naturligtvis finns det ett sätt att använda strömshuntar - för varje kanal behöver du göra en galvaniskt isolerad analog ingång. Men det är mycket lättare och mer pålitligt att använda andra sensorer.
I min kvalitetsanalysator använder jag resistiva spänningsdelare och fjärrstyrda halleffektströmsensorer.

Figur 7. Strömgivare i ett trefasnät
Som du kan se på bilden använder vi en fyrtrådsanslutning. Naturligtvis kan du istället för Hall-effektströmsensorer använda strömtransformatorer eller Rogowski-slingor.
Istället för resistiva delare kan spänningstransformatorer användas, både för fyrtrådiga och tretrådiga system.
I det senare fallet är spänningstransformatorernas primärlindningar anslutna med en triangel, och sekundärlindningarna med en stjärna, vars gemensamma punkt är den gemensamma punkten för mätkretsen


Figur 8.Användning av spänningstransformatorer i ett trefasnät

2 RMS-värde för ström och spänning


Det är dags att lösa problemet med att mäta våra signaler. Av praktisk betydelse för oss är först och främst det effektiva värdet av ström och spänning.
Låt mig påminna dig om utrustningen från cykeln på sensorer. Med hjälp av ADC på vår mikrokontroller kommer vi att registrera det momentana spänningsvärdet med jämna mellanrum. Under mätperioden kommer vi alltså att ha en rad data om nivån på det momentana spänningsvärdet (för ström är allt liknande).


Figur 9. Serie av momentana spänningsvärden
Vår uppgift är att beräkna det effektiva värdet. Låt oss först använda integralformeln:
(1)
I ett digitalt system måste vi begränsa oss till ett visst kvantum av tid, så vi går vidare till summan:
(2)
Var är samplingsperioden för vår signal, och är antalet sampel under mätperioden. Någonstans här i videon börjar jag prata strunt om områdens jämlikhet. Jag borde ha sovit lite den dagen. =)
I MSP430FE4252 mikrokontroller, som används i enfas Mercury elmätare, görs 4096 räkningar under en mätperiod på 1, 2 eller 4 sekunder. Vi kommer att förlita oss på T=1c och N=4096 i det följande. Dessutom kommer 4096 punkter per sekund att tillåta oss att använda snabba Fourier-transformationsalgoritmer för att bestämma övertonsspektrumet upp till den 40:e övertonen, som krävs av GOST. Men mer om det i nästa avsnitt.
Låt oss skissa på en algoritm för vårt program. Vi måste säkerställa en stabil lansering av ADC var 1/8192 sekund, eftersom vi har två kanaler och vi kommer att mäta dessa data omväxlande. För att göra detta, ställ in en timer och avbrottssignalen kommer automatiskt att starta om ADC:n. Alla ADC:er kan göra detta.
Vi kommer att skriva det framtida programmet på arduino, eftersom många har det till hands. För närvarande är vårt intresse rent akademiskt.
Med en systemkvartsfrekvens på 16 MHz och en 8-bitars timer (så att livet inte ser ut som honung), måste vi se till att alla timeravbrott fungerar med en frekvens på 8192 Hz.
Vi är ledsna över att 16 MHz inte delas så mycket som vi behöver och den slutliga arbetsfrekvensen för timern är 8198 Hz. Vi blundar för felet på 0,04 % och läser fortfarande 4096 prover per kanal.
Vi är ledsna att bräddavbrottet i arduino är upptaget med att beräkna tid (ansvarig för millis och fördröjning, så det kommer att sluta fungera normalt), så vi använder jämförelseavbrottet.
Och vi inser plötsligt att signalen som kommer till oss är bipolär och att msp430fe4252 klarar den perfekt. Vi nöjer oss med en unipolär ADC, så vi sätter ihop en enkel bipolär till unipolär signalomvandlare med hjälp av en operationsförstärkare:


Fig 10. Bipolär till unipolär signalomvandlare
Dessutom är vår uppgift att säkerställa att vår sinusform oscillerar i förhållande till halva referensspänningen - då kommer vi antingen subtrahera halva intervallet eller aktivera alternativet i ADC-inställningarna och få signerade värden.
Arduino har en 10-bitars ADC, så vi kommer att subtrahera hälften från det osignerade resultatet i intervallet 0-1023 och få -512-511.
Vi kontrollerar modellen monterad i LTSpiceIV och ser till att allt fungerar som det ska. I videomaterialet verifierar vi detta ytterligare experimentellt.


Figur 11. Simuleringsresultat. Grönt är källsignalen, blått är utsignalen.

Skiss för Arduino för en kanal

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

Programmet är skrivet i Arduino IDE för ATmega1280 mikrokontroller. På mitt felsökningskort dirigeras de första 8 kanalerna för kortets interna behov, så ADC8-kanalen används. Det är möjligt att använda den här skissen för en tavla med ATmega168, men du måste välja rätt kanal.
Inne i avbrotten förvränger vi ett par servicestift för att tydligt se den fungerande digitaliseringsfrekvensen.
Några ord om varifrån koefficienten 102 kom. Vid första starten tillfördes en signal med olika amplituder från generatorn, det effektiva spänningsvärdet avlästes från oscilloskopet och det beräknade värdet i absoluta ADC-enheter togs från konsolen. .

Umax, V Urms, B Räknat
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

Genom att dividera värdena i den tredje kolumnen med värdena för den andra får vi ett genomsnitt på 102. Detta kommer att vara vår "kalibrering" koefficient. Du kan dock märka att när spänningen minskar så sjunker noggrannheten kraftigt. Detta beror på den låga känsligheten hos vår ADC. Faktum är att 10 siffror för korrekta beräkningar är katastrofalt litet, och om det är fullt möjligt att mäta spänningen i ett uttag på detta sätt, så kommer det att vara ett brott mot metrologin att använda en 10-bitars ADC för att mäta strömmen som förbrukas av lasten .

Vid det här laget tar vi en paus. I nästa del kommer vi att överväga de andra tre frågorna i den här serien och kommer smidigt att gå vidare till att skapa själva enheten.

Du hittar den presenterade firmwaren, såväl som annan firmware för denna serie (eftersom jag filmar videomaterial snabbare än jag förbereder artiklar) i arkivet på GitHub.

Som du vet kan ATmega drivas från ett brett spektrum av spänningar, så det kan förbli "i drift" även i händelse av en gradvis batteriurladdning, uttryckt i en minskning av spänningen. Denna situation inom robotik är mer än standard, du behöver inte leta långt efter ett exempel: låt oss ta Voyager-projektet. Detta är en robotrymdfarkost som lanseras bortom solsystemet och därför berövad förmåga att mata från solpaneler. Den är utrustad med radioisotop termiska generatorer (kärnbatterier), som vid lanseringen producerade 30V / 470W, men varje år tappar de 0,78% av sin effekt. Följaktligen återstår för närvarande cirka 60% av originalet, och det är nödvändigt att slå på forskningsundersystemen en efter en för att inte överbelasta generatorerna.

I Arduino kan du inte bara koppla Vcc till det analoga stiftet direkt - som standard är AREF ansluten till Vcc och du kommer alltid att få ett maxvärde på 1023, oavsett vilken spänning du får ström från. Att ansluta till AREF en spänningskälla med en tidigare känd, stabil spänning hjälper, men detta är ett extra element i kretsen.

Du kan också ansluta Vcc till AREF via diod: Spänningsfallet över dioden är känt i förväg, så att beräkna Vcc är inte svårt. Men med en sådan krets genom en diod ström flyter konstant, förkortar batteritiden, vilket inte heller är särskilt bra.

Hur tar man sig ur situationen utan att lägga till nya element i kretsen och utan att minska batteritiden? Det visar sig att det finns en utgång, och den interna 1,1V referensspänningskällan i ATmega (i dokumentationen hänvisas till som en bandgap-referens), som inte är beroende av Vcc, kommer att hjälpa oss. Detta resulterar i följande formel:

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

där V_BAT är Vcc-spänningen i volt, och analogRead(14) är resultatet av ADC:n som läses direkt från kanal 14.

Arduino tillåter endast avläsningar från kanaler 0-7 (bli inte förvånad om du bara hittar Diecimila eller Duemilanove 0-5 , ta Seeeduino till exempel ;)

För att göra det möjligt att skicka data till andra kanaler, inklusive 14, måste du byta mask i Arduinos kärnbibliotek. För att göra detta, öppna filen hårdvara\cores\arduino\wiring_analog.c och hitta raden där:

ADMUX = (analog_referens

ersätt den med:

ADMUX = (analog_referens

Efter det kan du skriva följande skiss:

uint16_t raw_bandgap = 0; // internt bandgap värde
float volt_battery = 0,0;

tomhet uppstart (){
Serial.begin(57600);
}

tomhet slinga (){
// Läs av batterispänning
analogReference(DEFAULT); // använd Vcc som AREF
// tomgångsavläsning efter byte av AREF (se 23.5.2 i manualen)
raw_bandgap = analogRead(14); // mät det interna bandgapvärdet
volt_battery = (1,1 * 1024) / raw_bandgap; // beräkna Vcc
Seriell .print(volt_batteri);
Serial.println("v_bat");
fördröjning(1000);
}

Den som vill veta spänningen på batteriet bör tänka på det med en regulator(typ L7805CV), vi mäter spänning Vout regulator och om tillgänglig ingångsdiod– vi måste ta hänsyn till spänningen som faller över den.

Så här ser de beräknade värdena ut i Seeeduino, vid övergången från 5V till 3,3V:

Min voltmeter visar dock lägre värden. Men ändå fungerar skissen ;)

UPD: Jag hittade exempel där 1.05 används istället för konstanten 1.1. Resultatet är mycket närmare voltmeteravläsningarna, jag letar efter en teoretisk grund som kan förklara detta faktum...

  • Handledning

Introduktion

Hej alla! Efter att ha slutfört cykeln på sensorer fanns det olika frågor om att mäta förbrukningsparametrarna för hushållsapparater och inte särskilt elektriska apparater. Vem konsumerar hur mycket, hur man kopplar vad man ska mäta, vilka finesser som finns osv. Det är dags att avslöja alla kort i detta område.
I den här artikelserien kommer vi att titta på ämnet att mäta elparametrar. Det finns faktiskt ett väldigt stort antal av dessa parametrar, som jag gradvis kommer att försöka prata om i små serier.
Hittills är det tre serier planerade:
  • Elmätning.
  • Strömkvalitet.
  • Apparater för mätning av elparametrar.
Under analysprocessen kommer vi att lösa vissa praktiska problem på mikrokontroller tills resultatet är uppnått. Naturligtvis kommer det mesta av den här serien att ägnas åt att mäta växelspänning och kan vara användbar för alla som gillar att styra de elektriska apparaterna i sitt smarta hem.
Utifrån resultatet av hela cykeln kommer vi att ta fram någon sorts smart elmätare med internetuppkoppling. Fullständiga fans av att styra de elektriska apparaterna i sitt smarta hem kan ge all möjlig hjälp med att implementera kommunikationsdelen på en bas, till exempel MajorDomo. Låt oss göra OpenSource till ett bättre smart hem så att säga.
I denna tvådelade serie kommer vi att utforska följande frågor:
  • Anslutning av ström- och spänningssensorer i DC-enheter, såväl som enfasiga och trefasiga AC-kretsar;
  • Mätning av effektiva ström- och spänningsvärden;
  • Effektfaktormätning;
  • Total, aktiv och reaktiv effekt;
  • Elförbrukning;
Genom att klicka nedan hittar du svaren på de två första frågorna i denna lista. Jag berör medvetet inte frågorna om noggrannhet vid mätning av indikatorer och från denna serie är jag bara nöjd med de resultat som erhållits med en noggrannhet på plus eller minus en bastsko. Jag kommer definitivt att ägna en separat artikel åt detta nummer i den tredje serien.

1. Anslutning av sensorer


I den senaste serien om spännings- och strömsensorer pratade jag om typerna av sensorer, men pratade inte om hur man använder dem och var man ska placera dem. Det är dags att fixa det
Anslutning av DC-sensorer
Det är klart att hela serien kommer att ägnas åt AC-system, men låt oss snabbt gå över DC-kretsar, eftersom detta kan vara användbart för oss när vi utvecklar DC-strömförsörjning. Ta till exempel en klassisk PWM buck-omvandlare:


Figur 1. PWM Buck Converter
Vår uppgift är att tillhandahålla en stabiliserad utspänning. Dessutom, baserat på information från strömsensorn, är det möjligt att styra driftsläget för induktor L1, förhindra dess mättnad, och även implementera strömskydd för omvandlaren. Och för att vara ärlig, det finns egentligen inga alternativ för att installera sensorer.
En spänningssensor i form av en resistiv delare R1-R2, som är den enda som kan arbeta med likström, är installerad vid omvandlarens utgång. Som regel har en specialiserad omvandlarmikrokrets en återkopplingsingång och gör allt för att säkerställa att denna ingång (3) har en viss spänningsnivå specificerad i dokumentationen för mikrokretsen. Till exempel 1,25V. Om vår utspänning matchar denna nivå är allt bra - vi applicerar direkt utspänningen på denna ingång. Om inte, ställ in avdelaren. Om vi ​​behöver tillhandahålla en utspänning på 5V, måste delaren ge en divisionsfaktor på 4, det vill säga till exempel R1 = 30k, R2 = 10k.
Strömgivaren är vanligtvis installerad mellan strömförsörjningen och omvandlaren och på chipet. Baserat på potentialskillnaden mellan punkterna 1 och 2, och med en känd resistans för motstånden Rs, är det möjligt att bestämma strömvärdet för strömmen i vår induktor. Att installera en strömsensor mellan källorna och lasten är inte en bra idé, eftersom filterkondensatorn kommer att stängas av av ett motstånd från pulsströmförbrukarna. Att installera ett motstånd i gapet på den gemensamma ledningen bådar inte heller gott - det kommer att finnas två marknivåer som det kommer att vara ett nöje att mixtra med.
Spänningsfallsproblem kan undvikas genom att använda beröringsfria strömsensorer - såsom hallsensorer:


Figur 2. Beröringsfri strömsensor
Det finns dock ett smartare sätt att mäta ström. När allt kommer omkring sjunker spänningen över transistorn på exakt samma sätt och samma ström flyter genom den som induktansen. Följaktligen kan strömvärdet för strömmen också bestämmas av spänningsfallet över den. Ärligt talat, om du tittar på den interna strukturen hos omvandlarchips, till exempel från Texas Instruments, så är den här metoden lika vanlig som de tidigare. Noggrannheten för denna metod är naturligtvis inte den högsta, men detta är tillräckligt för att strömbrytaren ska fungera.


Fig 3. Transistor som strömsensor
Vi gör samma sak i andra kretsar med liknande omvandlare, oavsett om det är boostande eller inverterande.
Det är dock nödvändigt att separat nämna transformatorns framåt- och tillbakagångsomvandlare.


Figur 4. Anslutning av strömsensorer i flyback-omvandlare
De kan också använda antingen ett externt motstånd eller en transistor i sin roll.
Det är här vi är klara med att koppla sensorer till DC-omvandlare. Har du förslag på andra alternativ kompletterar jag gärna artikeln med dem.
1.2 Anslutning av sensorer till enfas AC-kretsar
I AC-kretsar har vi ett mycket större urval av möjliga sensorer. Låt oss överväga flera alternativ.
Det enklaste är att använda en resistiv spänningsdelare och en strömshunt.


Figur 5. Anslutning av motståndssensorer
Det har dock ett par betydande nackdelar:
För det första kommer vi antingen att tillhandahålla en betydande amplitud av signalen från den aktuella shunten genom att allokera en stor mängd effekt till den, eller så kommer vi att nöja oss med en liten amplitud av signalen och därefter förstärka den. Och för det andra skapar motståndet en potentialskillnad mellan nätverksneutral och enhetsneutral. Om enheten är isolerad spelar det ingen roll, men om enheten har en jordningsterminal riskerar vi att lämnas utan en signal från den aktuella sensorn, eftersom vi kommer att kortsluta den. Det kan vara värt att prova sensorer som fungerar på andra principer.
Till exempel kommer vi att använda ström- och spänningstransformatorer, eller en Halleffektströmsensor och en spänningstransformator. Det finns mycket fler möjligheter att arbeta med utrustning, eftersom den neutrala ledningen inte har några förluster, och viktigast av allt, i båda fallen finns det galvanisk isolering av mätutrustningen, vilket ofta kan vara användbart. Det är dock nödvändigt att ta hänsyn till att transformatorström- och spänningssensorer har en begränsad frekvensgång och om vi vill mäta den harmoniska sammansättningen av distorsioner så är det inte ett faktum att det kommer att fungera.


Figur 6. Anslutning av transformator och beröringsfria ström- och spänningsgivare
1.3 Anslutning av sensorer till flerfas AC-kretsar
I flerfasnät är vår förmåga att ansluta strömsensorer något mindre. Detta beror på att det inte kommer att vara möjligt att använda en strömshunt alls, eftersom potentialskillnaden mellan fasshuntarna kommer att fluktuera inom hundratals volt och jag känner inte till någon generell styrenhet vars analoga ingångar kan motstå sådant övergrepp.
Naturligtvis finns det ett sätt att använda strömshuntar - för varje kanal behöver du göra en galvaniskt isolerad analog ingång. Men det är mycket lättare och mer pålitligt att använda andra sensorer.
I min kvalitetsanalysator använder jag resistiva spänningsdelare och fjärrstyrda halleffektströmsensorer.

Figur 7. Strömgivare i ett trefasnät
Som du kan se på bilden använder vi en fyrtrådsanslutning. Naturligtvis kan du istället för Hall-effektströmsensorer använda strömtransformatorer eller Rogowski-slingor.
Istället för resistiva delare kan spänningstransformatorer användas, både för fyrtrådiga och tretrådiga system.
I det senare fallet är spänningstransformatorernas primärlindningar anslutna med en triangel, och sekundärlindningarna med en stjärna, vars gemensamma punkt är den gemensamma punkten för mätkretsen


Figur 8.Användning av spänningstransformatorer i ett trefasnät

2 RMS-värde för ström och spänning


Det är dags att lösa problemet med att mäta våra signaler. Av praktisk betydelse för oss är först och främst det effektiva värdet av ström och spänning.
Låt mig påminna dig om utrustningen från cykeln på sensorer. Med hjälp av ADC på vår mikrokontroller kommer vi att registrera det momentana spänningsvärdet med jämna mellanrum. Under mätperioden kommer vi alltså att ha en rad data om nivån på det momentana spänningsvärdet (för ström är allt liknande).


Figur 9. Serie av momentana spänningsvärden
Vår uppgift är att beräkna det effektiva värdet. Låt oss först använda integralformeln:
(1)
I ett digitalt system måste vi begränsa oss till ett visst kvantum av tid, så vi går vidare till summan:
(2)
Var är samplingsperioden för vår signal, och är antalet sampel under mätperioden. Någonstans här i videon börjar jag prata strunt om områdens jämlikhet. Jag borde ha sovit lite den dagen. =)
I MSP430FE4252 mikrokontroller, som används i enfas Mercury elmätare, görs 4096 räkningar under en mätperiod på 1, 2 eller 4 sekunder. Vi kommer att förlita oss på T=1c och N=4096 i det följande. Dessutom kommer 4096 punkter per sekund att tillåta oss att använda snabba Fourier-transformationsalgoritmer för att bestämma övertonsspektrumet upp till den 40:e övertonen, som krävs av GOST. Men mer om det i nästa avsnitt.
Låt oss skissa på en algoritm för vårt program. Vi måste säkerställa en stabil lansering av ADC var 1/8192 sekund, eftersom vi har två kanaler och vi kommer att mäta dessa data omväxlande. För att göra detta, ställ in en timer och avbrottssignalen kommer automatiskt att starta om ADC:n. Alla ADC:er kan göra detta.
Vi kommer att skriva det framtida programmet på arduino, eftersom många har det till hands. För närvarande är vårt intresse rent akademiskt.
Med en systemkvartsfrekvens på 16 MHz och en 8-bitars timer (så att livet inte ser ut som honung), måste vi se till att alla timeravbrott fungerar med en frekvens på 8192 Hz.
Vi är ledsna över att 16 MHz inte delas så mycket som vi behöver och den slutliga arbetsfrekvensen för timern är 8198 Hz. Vi blundar för felet på 0,04 % och läser fortfarande 4096 prover per kanal.
Vi är ledsna att bräddavbrottet i arduino är upptaget med att beräkna tid (ansvarig för millis och fördröjning, så det kommer att sluta fungera normalt), så vi använder jämförelseavbrottet.
Och vi inser plötsligt att signalen som kommer till oss är bipolär och att msp430fe4252 klarar den perfekt. Vi nöjer oss med en unipolär ADC, så vi sätter ihop en enkel bipolär till unipolär signalomvandlare med hjälp av en operationsförstärkare:


Fig 10. Bipolär till unipolär signalomvandlare
Dessutom är vår uppgift att säkerställa att vår sinusform oscillerar i förhållande till halva referensspänningen - då kommer vi antingen subtrahera halva intervallet eller aktivera alternativet i ADC-inställningarna och få signerade värden.
Arduino har en 10-bitars ADC, så vi kommer att subtrahera hälften från det osignerade resultatet i intervallet 0-1023 och få -512-511.
Vi kontrollerar modellen monterad i LTSpiceIV och ser till att allt fungerar som det ska. I videomaterialet verifierar vi detta ytterligare experimentellt.


Figur 11. Simuleringsresultat. Grönt är källsignalen, blått är utsignalen.

Skiss för Arduino för en kanal

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

Programmet är skrivet i Arduino IDE för ATmega1280 mikrokontroller. På mitt felsökningskort dirigeras de första 8 kanalerna för kortets interna behov, så ADC8-kanalen används. Det är möjligt att använda den här skissen för en tavla med ATmega168, men du måste välja rätt kanal.
Inne i avbrotten förvränger vi ett par servicestift för att tydligt se den fungerande digitaliseringsfrekvensen.
Några ord om varifrån koefficienten 102 kom. Vid första starten tillfördes en signal med olika amplituder från generatorn, det effektiva spänningsvärdet avlästes från oscilloskopet och det beräknade värdet i absoluta ADC-enheter togs från konsolen. .

Umax, V Urms, B Räknat
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

Genom att dividera värdena i den tredje kolumnen med värdena för den andra får vi ett genomsnitt på 102. Detta kommer att vara vår "kalibrering" koefficient. Du kan dock märka att när spänningen minskar så sjunker noggrannheten kraftigt. Detta beror på den låga känsligheten hos vår ADC. Faktum är att 10 siffror för korrekta beräkningar är katastrofalt litet, och om det är fullt möjligt att mäta spänningen i ett uttag på detta sätt, så kommer det att vara ett brott mot metrologin att använda en 10-bitars ADC för att mäta strömmen som förbrukas av lasten .

Vid det här laget tar vi en paus. I nästa del kommer vi att överväga de andra tre frågorna i den här serien och kommer smidigt att gå vidare till att skapa själva enheten.

Du hittar den presenterade firmwaren, såväl som annan firmware för denna serie (eftersom jag filmar videomaterial snabbare än jag förbereder artiklar) i arkivet på GitHub.