Innholdsfortegnelse:

Måling av True-RMS AC-spenning: 14 trinn
Måling av True-RMS AC-spenning: 14 trinn

Video: Måling av True-RMS AC-spenning: 14 trinn

Video: Måling av True-RMS AC-spenning: 14 trinn
Video: Как использовать датчик переменного/постоянного тока Allegro ACS712 с Arduino 2024, November
Anonim
Image
Image
Demonstrasjon
Demonstrasjon

I dag skal vi bruke STM32 Maple Mini til å lese AC. I vårt eksempel får vi RMS -verdien til strømnettet. Dette er veldig nyttig for de som ønsker å overvåke det elektriske nettverket for tingenes internett. Vi vil deretter opprette en applikasjon ved hjelp av beregningskraften til Maple Mini, bruke en elektronisk krets som er i stand til å tillate innhenting av et 127Vac -signal, samt anvende root mean square (RMS) -beregningen på prøvene.

Trinn 1: Demonstrasjon

I vår samling i dag har vi STM32, i tillegg til vår analoge krets for å gjøre inngangen til 110. For å unngå støt, isoler motstanden som kommer inn med 110.

Kretsen er ganske følsom. Jeg kommer inn med 110, men jeg reduserer det 168 ganger ved å bruke spenningsdeleren og legger den inn i operasjonsforsterkeren, som har flere funksjoner.

Vi har også noen valgfrie kondensatorer for kildefiltrering. Hvis kilden din er av god kvalitet, trenger du ikke bruke dem.

AD -inngangen beregnes gjennom oscilloskopet, der du ser en sinusformet, som ikke er 110 (men den er godt formet). En annen ting er at spenningen i det elektriske nettverket vårt ikke er 110 (det er faktisk 127 volt). Men ettersom vi gjennomgår en stabilisator, vil den justere seg til 115V.

Verdien som vises på den serielle skjermen er det som er beregnet i RMS, det vil si den som er identifisert av Fluke Meter.

Trinn 2: Ressurser brukt

Ressurser brukt
Ressurser brukt

• Gensere

• En Maple Mini

• Protoboard

• En LM386 forsterker

• En symmetrisk kilde (+ 5V og -5V)

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

• Fire kondensatorer av 100nF polyester

• Tre 10k motstander

• Fire 470k motstander

• En 5k6 motstand

• En 1n4728A zenerdiode

Trinn 3: Blokkdiagram

Blokkdiagram
Blokkdiagram

Trinn 4: Oppsett

Ordningen
Ordningen

Dette er en krets jeg utviklet basert på spesifikasjonene som jeg tror er de beste for denne målingen, men det er flere andre eksempler som finnes på internett.

Trinn 5: LM386 - Festing

LM386 - Festing
LM386 - Festing

LM386 har to forsterkere for kondisjonering eller signalforsterkning.

Trinn 6: AmpOp - Differensial (subtraktor)

AmpOp - Differensial (subtraktor)
AmpOp - Differensial (subtraktor)

Trinn 7: AmpOp - Inverter Adder

AmpOp - Inverter Adder
AmpOp - Inverter Adder

Trinn 8: Maple Mini - Pinage

Maple Mini - Pinage
Maple Mini - Pinage

Pinner merket på:

Rød >> 3V3 Tolerant

Grønn >> 5V Tolerant

Trinn 9: Maple Mini - Pinning - a / D Brukes til fange

Maple Mini - Pinning - a / D Brukes til fange
Maple Mini - Pinning - a / D Brukes til fange

Jeg understreker her at pinnen jeg brukte er D11 som (i nomenklaturen til STMicroelectronics) er PA0.

Trinn 10: Montering

montering
montering

For kretsen vår trenger du en symmetrisk kilde, som den vi opprettet for dette prosjektet. Ellers trenger du to kilder.

Trinn 11: Graf med innhentede data

Graf med innhentede data
Graf med innhentede data

Trinn 12: Beregning av RMS -verdien

Beregning av RMS -verdien
Beregning av RMS -verdien

Trinn 13: Kildekode

Kildekode - Definisjoner og konstanter

Først definerte vi pinnavlesningen som D11, i tillegg til de forskjellige konstantene som ble brukt i beregningene.

#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

Kildekode - Globale variabler

Nå definerer vi noen globale 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

Kildekode - Oppsett ()

Start serieporten med 1 Mbps. Vi justerte AD -porten som input og ventet 5 sekunder før vi begynte å samle inn data. Standbytid er valgfritt.

ugyldig oppsett () {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. (valgfritt)}

Kildekode - sløyfe () - Starter datainnsamlingsvariablene

I Loop har vi variabelen for iterasjon. Her lagrer vi også avlesningene av AD i 0.0 og starter variabelen VRMS på nytt også 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

Kildekode - Fanger og utfører de individuelle beregningene for hver prøve

På dette stadiet, hvis i er mindre enn prøven, starter vi en prøvetakingssyklus til jeg når antall prøver. Vi kjører analogRead for å lese den analoge porten og beregne summen av kvadratene til avlesningsspenningene. Til slutt øker vi iteratoren.

while (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}

Kildekode - Generelle beregninger av prøvene og identifisering av maksimum, minimum og gjennomsnitt

Vi bruker multiplikasjonsfakta for å bestemme den faktiske verdien av spenningene. Vi oppdager om verdien er maksimum eller minimum, og vi beregner gjennomsnittet av gjeldende maksimums- og minimumsverdier.

// 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 mínimo atuais Vmed = (Vmax + Vmin) /2.0;

Kildekode - Utmatingsalternativer

Vi har tre alternativer for å "plotte" utgangsverdien. Vi har output formatert til Arduino IDE seriell plotter, som CSV eller Jason.

// saída formatada for 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); */}

Trinn 14: Filer

Last ned filene:

PDF

INO

Anbefalt: