Innehållsförteckning:

Mätning av True-RMS AC-spänning: 14 steg
Mätning av True-RMS AC-spänning: 14 steg

Video: Mätning av True-RMS AC-spänning: 14 steg

Video: Mätning av True-RMS AC-spänning: 14 steg
Video: Measuring AC voltage using Arduino. #arduino 2024, November
Anonim
Image
Image
Demonstration
Demonstration

Idag kommer vi att använda STM32 Maple Mini för att göra en AC -avläsning. I vårt exempel får vi RMS -värdet för elnätet. Detta är mycket användbart för dem som vill övervaka det elektriska nätverket för Internet of Things. Vi kommer sedan att skapa en applikation med hjälp av Maple Mini: s beräkningseffekt, tillämpa en elektronisk krets som kan tillåta inhämtning av en 127Vac -signal, samt tillämpa root -medelkvadratberäkningen (RMS) på proverna.

Steg 1: Demonstration

I vår samling idag har vi STM32, utöver vår analoga krets för att göra ingången till 110. För att undvika stötar, isolera motståndet som går in med 110.

Kretsen är ganska känslig. Jag kommer in med 110, men jag reducerar det 168 gånger med hjälp av spänningsdelaren och lägger den i operationsförstärkaren, som har flera funktioner.

Vi har också några valfria kondensatorer för källfiltrering. Om din källa är av god kvalitet behöver du inte använda dem.

AD -ingången beräknas genom oscilloskopet, där du ser en sinusoid, som inte är 110 (men den är välformad). En annan sak är att spänningen i vårt elektriska nät inte är 110 (det är faktiskt 127 volt). Men eftersom vi genomgår en stabilisator justeras den till 115V.

Värdet som visas på den seriella monitorn är det som beräknas i RMS, det vill säga det som identifieras av Fluke -mätaren.

Steg 2: Resurser som används

Resurser som används
Resurser som används

• Hoppare

• En Maple Mini

• Protoboard

• En LM386 -förstärkare

• En symmetrisk källa (+ 5V och -5V)

• En 10k multi-turn trimpot (eller potentiometer)

• Fyra kondensatorer av 100nF polyester

• Tre 10k motstånd

• Fyra 470k motstånd

• Ett 5k6 -motstånd

• En 1n4728A zenerdiod

Steg 3: Blockdiagram

Blockdiagram
Blockdiagram

Steg 4: Schema

Schema
Schema

Detta är en krets jag utvecklat baserat på specifikationerna som jag tror är bäst för denna mätning, men det finns flera andra exempel som finns på internet.

Steg 5: LM386 - Fästning

LM386 - Fästning
LM386 - Fästning

LM386 har två förstärkare för konditionering eller signalförstärkning.

Steg 6: AmpOp - Differential (subtraktor)

AmpOp - Differential (subtraktor)
AmpOp - Differential (subtraktor)

Steg 7: AmpOp - Inverteradderare

AmpOp - Inverteradderare
AmpOp - Inverteradderare

Steg 8: Maple Mini - Pinage

Maple Mini - Pinage
Maple Mini - Pinage

Pins markerade på:

Röd >> 3V3 Tolerant

Grön >> 5V Tolerant

Steg 9: Maple Mini - Pinning - a / D Används för att fånga

Maple Mini - Pinning - a / D Används för att fånga
Maple Mini - Pinning - a / D Används för att fånga

Jag betonar här att stiftet som jag använde är D11 som (i STMicroelectronics nomenklatur) är PA0.

Steg 10: Montering

hopsättning
hopsättning

För vår krets behöver du en symmetrisk källa, som den vi skapade för detta projekt. Annars behöver du två källor.

Steg 11: Diagram med erhållna data

Diagram med erhållna data
Diagram med erhållna data

Steg 12: Beräkning av RMS -värdet

Beräkning av RMS -värdet
Beräkning av RMS -värdet

Steg 13: Källkod

Källkod - Definitioner och konstanter

Först definierade vi stiftavläsningen som D11, liksom de olika konstanterna som används i beräkningarna.

#define leituraTensao D11 // AD CH0 no pino PA0 // valor teórico divisor de tensão = 168.85714285714285714286 const float fatorDivisor = 168.40166345742404792461; // valor teórico do ganho de amplificação = 1.0 const float fatorAmplificador = 1.0; // Valor usado na multiplicação da leitura const float fatorMultiplicacao = fatorDivisor * fatorAmplificador; // Valor teórico da Tensão de alimentação Vcc = 3.3V const float Vcc = 3.3; // valor teórico do offset do amplificador = Vcc /2.0; const float offSet = 1,66; // fator teórico da conversão do AD = 3.3 / 4095.0 const float fatorAD = Vcc / 4095.0; const int amostras = 71429; // resulta em 1, 027 segundos para cada atualização // const int amostras = 35715; // resulta em 0, 514 segundos para cada atualização

Källkod - Globala variabler

Nu definierar vi några globala variabler.

float Vrms = 0,0; // armazena o valor rms da tensãofloat Vmax = 0,0; // armazena o valor máximo detectado float Vmin = 10000.0; // armazena o valor mínimo detectado float Vmed = 0,0; // armazena o valor médio entre Vmáx e Vmín

Källkod - Setup ()

Starta serieporten med 1 Mbps. Vi justerade AD -porten som ingång och väntade 5 sekunder innan vi började samla in data. Standbytid är valfri.

void setup () {Serial.begin (1000000); // inicia a porta serial em 1Mbps pinMode (leituraTensao, INPUT); // ajusta a porta do AD como entrada delay (5000); // aguarda 5s antes de iniciar a coleta. (valfritt)}

Källkod - Loop () - Startar datainsamlingsvariablerna

I Loop har vi variabeln för iteration. Här lagrar vi också avläsningarna av AD i 0.0 och startar om variabeln VRMS också i 0.0.

void loop () {int i = 0; // variável para iteração float leitura = 0.0; // armazena as leituras do AD Vrms = 0.0; // reinicia a variável Vrms

Källkod - Fångar och utför de individuella beräkningarna för varje prov

I detta skede, om i är mindre än provet, startar vi en provtagningscykel tills jag når antalet prover. Vi kör analogRead för att läsa den analoga porten och beräkna summan av kvadraterna för avlästa spänningar. Slutligen ökar vi iteratorn.

medan (i <amostras) {// inicia um ciclo de amostragem até que i alcance o número de amostras leitura = analogRead (leituraTensao); // lê a porta analógica //Serial.println(leitura); // Descomente se quiser ver o sinal bruto do AD Vrms = Vrms + pow (((leitura * fatorAD) - offSet), 2.0); // calcula a soma dos quadrados das tensões lidas i ++; // incrementa o iterador}

Källkod - Allmänna beräkningar av proverna och identifiering av högsta, lägsta och genomsnittliga

Vi tillämpar multiplikationsfaktumet för att bestämma det verkliga värdet av spänningarna. Vi upptäcker om värdet är maximalt eller minimum, och vi beräknar genomsnittet av de aktuella max- och minimivärdena.

// Aplicando fator de multiplicação para determinar o valor real das tensões Vrms = (sqrt (Vrms /amostras)) * fatorMultiplicacao; // detecta se é um valor é máximo if (Vrms> Vmax) {Vmax = Vrms; } // detecta se é um valor mínimo if (Vrms <Vmin) {Vmin = Vrms; } // calcula a média dos valores máximo e minimo atuais Vmed = (Vmax + Vmin) /2.0;

Källkod - Utmatningsalternativ

Vi har tre alternativ för att "plotta" utgångsvärdet. Vi har utdata formaterade till Arduino IDE -seriell plotter, som CSV eller Jason.

// saída formatada para plotter serial IDE Arduino Serial.print (Vrms, 3); Serial.print (","); Serial.print (Vmax, 3); Serial.print (","); Serial.print (Vmin, 3); Serial.print (","); Serial.println (Vmed, 3); /* // saída formatada como json Serial.print ("{" instante (ms) ":"); Serial.print (millis ()); Serial.print (","); Serial.print ("\" Vrms (V) ":"); Serial.print (Vrms, 3); Serial.print (","); Serial.print ("\" Vmax (V) ":"); Serial.print (Vmax, 3); Serial.print (","); Serial.print ("\" Vmin (V) ":"); Serial.print (Vmin, 3); Serial.print (","); Serial.print ("\" Vmed (V) ":"); Serial.print (Vmed, 3); Serial.println ("}"); * / /* // saída formatada como CSV Serial.print (millis ()); Serial.print (","); Serial.print (Vrms, 3); Serial.print (","); Serial.print (Vmax, 3); Serial.print (","); Serial.print (Vmin, 3); Serial.print (","); Serial.println (Vmed, 3); */}

Steg 14: Filer

Ladda ner filerna:

PDF

INO

Rekommenderad: