Turinys:

Tikrosios RMS kintamosios įtampos matavimas: 14 žingsnių
Tikrosios RMS kintamosios įtampos matavimas: 14 žingsnių

Video: Tikrosios RMS kintamosios įtampos matavimas: 14 žingsnių

Video: Tikrosios RMS kintamosios įtampos matavimas: 14 žingsnių
Video: Miernik cyfrowy - Smart Digital Multimetr GVDA - model GD119B z dużym kolorowym wyświetlaczem 2024, Lapkritis
Anonim
Image
Image
Demonstracija
Demonstracija

Šiandien mes naudosime „STM32 Maple Mini“kintamosios srovės skaitymui. Mūsų pavyzdyje gausime elektros tinklo RMS vertę. Tai labai naudinga tiems, kurie nori stebėti daiktų interneto elektros tinklą. Tada mes sukursime programą, naudodamiesi „Maple Mini“skaičiavimo galia, pritaikysime elektroninę grandinę, galinčią įgyti 127 Vac signalą, taip pat taikysime mėginių vidutinio kvadrato (RMS) skaičiavimą.

1 žingsnis: demonstracija

Šiandien mūsų surinkime, be analoginės grandinės, turime įvesti 110 STM32. Kad išvengtumėte smūgių, izoliuokite įeinantį rezistorių 110.

Grandinė yra gana jautri. Aš gaunu 110, bet sumažinu jį 168 kartus, naudodamas įtampos skirstytuvą, ir įdedu jį į operacinį stiprintuvą, kuris turi keletą funkcijų.

Mes taip pat turime papildomus šaltinio filtravimo kondensatorius. Jei jūsų šaltinis yra geros kokybės, jums nereikia jų naudoti.

AD įvestis apskaičiuojama naudojant osciloskopą, kuriame matote sinusoidą, kuris nėra 110 (bet jis yra gerai suformuotas). Kitas dalykas yra tai, kad mūsų elektros tinklo įtampa nėra 110 (tai iš tikrųjų yra 127 voltai). Bet kai mes atliekame stabilizatorių, jis prisitaikys prie 115 V.

Serijiniame monitoriuje rodoma vertė yra tokia, kokia apskaičiuota RMS, ty ta, kurią nustato „Fluke Meter“.

2 žingsnis: naudojami ištekliai

Naudojami ištekliai
Naudojami ištekliai

• Džemperiai

• „Maple Mini“

• Protoboard

• LM386 stiprintuvas

• Simetriškas šaltinis (+ 5V ir -5V)

• 10k kelių posūkių trimpot (arba potenciometras)

• Keturi 100nF poliesterio kondensatoriai

• Trys 10k rezistoriai

• Keturi 470k rezistoriai

• Vienas 5k6 rezistorius

• Vienas 1n4728A „Zener“diodas

3 žingsnis: blokinė diagrama

Blokinė diagrama
Blokinė diagrama

4 žingsnis: schema

Schema
Schema

Tai grandinė, kurią sukūriau pagal specifikacijas, kurios, mano manymu, yra geriausios šiam matavimui, tačiau yra keletas kitų pavyzdžių, kuriuos galima rasti internete.

5 žingsnis: LM386 - prisegimas

LM386 - prisegimas
LM386 - prisegimas

LM386 turi du stiprintuvus kondicionavimui arba signalo stiprinimui.

6 žingsnis: „AmpOp“- diferencialas (atimamasis)

„AmpOp“- diferencialas (atimamasis)
„AmpOp“- diferencialas (atimamasis)

7 žingsnis: „AmpOp“- keitiklio papildymas

„AmpOp“- keitiklis
„AmpOp“- keitiklis

8 žingsnis: „Maple Mini“- šulinys

Klevas Mini - skylė
Klevas Mini - skylė

Smeigtukai pažymėti:

Raudona >> 3V3 Tolerantiška

Žalia >> 5V Tolerantiška

9 veiksmas: „Maple Mini“- prisegimas - a / D, naudojamas fiksuojant

„Maple Mini - Pinning“- a / D Naudojamas fiksuojant
„Maple Mini - Pinning“- a / D Naudojamas fiksuojant

Čia pabrėžiu, kad mano naudojamas kaištis yra D11, kuris (STMicroelectronics nomenklatūroje) yra PA0.

10 žingsnis: Surinkimas

Surinkimas
Surinkimas

Mūsų grandinei jums reikės simetrinio šaltinio, tokio, kokį sukūrėme šiam projektui. Priešingu atveju jums reikės dviejų šaltinių.

11 veiksmas: grafikas su gautais duomenimis

Grafikas su gautais duomenimis
Grafikas su gautais duomenimis

12 žingsnis: RMS vertės apskaičiavimas

RMS vertės apskaičiavimas
RMS vertės apskaičiavimas

13 žingsnis: šaltinio kodas

Šaltinio kodas - Apibrėžimai ir konstantos

Iš pradžių mes nustatėme kaiščio rodmenį kaip D11, taip pat įvairias skaičiavimuose naudojamas konstantas.

#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

Šaltinio kodas - visuotiniai kintamieji

Dabar mes apibrėžiame kai kuriuos pasaulinius kintamuosius.

plūdė 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

Šaltinio kodas - sąranka ()

Pradėkite nuoseklųjį prievadą 1Mbps greičiu. Mes sureguliavome AD prievadą kaip įvestį ir laukėme 5 sekundes, kol pradėjome rinkti duomenis. Budėjimo laikas yra neprivalomas.

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

Šaltinio kodas - ciklas () - pradeda duomenų rinkimo kintamuosius

Cikle turime iteracijos kintamąjį. Čia taip pat saugome AD rodmenis 0,0 ir iš naujo paleiskite kintamąjį VRMS taip pat 0,0.

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

Šaltinio kodas - fiksuoja ir atlieka individualius kiekvieno mėginio skaičiavimus

Šiame etape, jei i yra mažesnis už mėginį, pradedame mėginių ėmimo ciklą, kol i pasiekia mėginių skaičių. Paleidžiame analogRead, kad nuskaitytume analoginį prievadą ir apskaičiuotume skaitymo įtampų kvadratų sumą. Galiausiai padidiname iteratorių.

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 ++; // padidėjimas iterador}

Šaltinio kodas - bendri mėginių skaičiavimai ir maksimalaus, minimalaus ir vidutinio nustatymas

Mes naudojame daugybos faktą, kad nustatytume tikrąją įtampų vertę. Mes nustatome, ar vertė yra maksimali, ar minimali, ir apskaičiuojame dabartinių maksimalių ir minimalių verčių vidurkį.

// Aplicando fator de multiplicação para determinar o valor real das tensões Vrms = (sqrt (Vrms /amostras)) * fatorMultiplicacao; // aptikti se é um valor é máximo if (Vrms> Vmax) {Vmax = Vrms; } // aptikti 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;

Šaltinio kodas - išvesties parinktys

Turime tris išvesties vertės „braižymo“galimybes. Išvestį suformatavome pagal „Arduino IDE“serijos braižytuvą, pvz., CSV ar Jason.

// saidos formatas, skirtas braižytuvo serijai IDE Arduino Serial.print (Vrms, 3); Serial.print (","); Serijinis atspaudas (Vmax, 3); Serial.print (","); Serijinis spaudinys (Vmin, 3); Serial.print (","); Serial.println (Vmed, 3); /* // formatu como json Serial.print ("{" instante (ms) ":"); Serijinis atspaudas (milis ()); Serial.print (","); Serial.print ("\" Vrms (V) ":"); Serijinis atspaudas (Vrms, 3); Serial.print (","); Serial.print ("\" Vmax (V) ":"); Serijinis atspaudas (Vmax, 3); Serial.print (","); Serial.print ("\" Vmin (V) ":"); Serijinis spaudinys (Vmin, 3); Serial.print (","); Serial.print ("\" Vmed (V) ":"); Serijinis spaudinys (Vmed, 3); Serial.println ("}"); * / /* // formatu į CSV Serial.print (millis ()); Serial.print (","); Serijinis atspaudas (Vrms, 3); Serial.print (","); Serijinis atspaudas (Vmax, 3); Serial.print (","); Serijinis spaudinys (Vmin, 3); Serial.print (","); Serial.println (Vmed, 3); */}

14 žingsnis: failai

Atsisiųskite failus:

PDF

AŠ NE

Rekomenduojamas: