Kazalo:
- 1. korak: demonstracija
- 2. korak: Uporabljeni viri
- 3. korak: Blokovni diagram
- 4. korak: Shema
- 5. korak: LM386 - Pripenjanje
- Korak 6: AmpOp - Diferencial (odštevalec)
- 7. korak: AmpOp - Inverter Adder
- 8. korak: Maple Mini - Pinage
- 9. korak: Maple Mini - Pripenjanje - a / D Uporablja se pri zajemanju
- 10. korak: Montaža
- 11. korak: Graf z pridobljenimi podatki
- 12. korak: Izračun vrednosti RMS
- Korak: Izvorna koda
- 14. korak: Datoteke
2025 Avtor: John Day | [email protected]. Nazadnje spremenjeno: 2025-01-13 06:58
Danes bomo za branje izmeničnega toka uporabljali STM32 Maple Mini. V našem primeru bomo dobili RMS vrednost električnega omrežja. To je zelo koristno za tiste, ki želijo spremljati električno omrežje za internet stvari. Nato bomo z uporabo računalniške moči Maple Mini ustvarili aplikacijo, uporabili elektronsko vezje, ki lahko omogoči pridobivanje 127Vac signala, ter uporabili izračun korenskega povprečja (RMS) na vzorcih.
1. korak: demonstracija
V današnji sestavi imamo poleg analognega vezja tudi STM32 za vnos 110. Da bi se izognili udarcem, izolirajte upor, ki vstopa za 110.
Vezje je precej občutljivo. Vstopam s 110, vendar ga z delilnikom napetosti zmanjšam 168 -krat in ga vstavim v operacijski ojačevalnik, ki ima več funkcij.
Imamo tudi nekaj izbirnih kondenzatorjev za filtriranje virov. Če je vaš vir dobre kakovosti, vam jih ni treba uporabiti.
Vhod AD se izračuna preko osciloskopa, v katerem vidite sinusoido, ki ni 110 (vendar je dobro oblikovana). Druga stvar je, da napetost v našem električnem omrežju ni 110 (dejansko je 127 voltov). Ker pa smo pod stabilizatorjem, se bo prilagodil na 115V.
Vrednost, prikazana na serijskem monitorju, je tista, ki se izračuna v RMS, to je tista, ki jo identificira merilnik Fluke.
2. korak: Uporabljeni viri
• Skakalci
• javorjev mini
• Protoboard
• Ojačevalnik LM386
• Simetrični vir (+ 5V in -5V)
• 10-milimetrski trimpot (ali potenciometer)
• Štirje kondenzatorji iz 100nF poliestra
• Trije 10k upori
• Štirje 470k upori
• En upor 5k6
• Ena zener dioda 1n4728A
3. korak: Blokovni diagram
4. korak: Shema
To vezje sem razvil na podlagi specifikacij, za katere menim, da so najboljše za to meritev, vendar obstaja več drugih primerov, ki jih lahko najdemo na internetu.
5. korak: LM386 - Pripenjanje
LM386 ima dva ojačevalnika za kondicioniranje ali ojačanje signala.
Korak 6: AmpOp - Diferencial (odštevalec)
7. korak: AmpOp - Inverter Adder
8. korak: Maple Mini - Pinage
Zatiči označeni na:
Rdeča >> 3V3 Tolerantna
Zelena >> 5V tolerantna
9. korak: Maple Mini - Pripenjanje - a / D Uporablja se pri zajemanju
Tukaj poudarjam, da sem pin, ki sem ga uporabil, D11, ki je (v nomenklaturi STMicroelectronics) PA0.
10. korak: Montaža
Za naše vezje boste potrebovali simetričen vir, kakršen smo ustvarili za ta projekt. V nasprotnem primeru boste potrebovali dva vira.
11. korak: Graf z pridobljenimi podatki
12. korak: Izračun vrednosti RMS
Korak: Izvorna koda
Izvorna koda - definicije in konstante
Najprej smo definirali odčitavanje nožic kot D11, pa tudi različne konstante, uporabljene pri izračunih.
#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 pogovorão do AD = 3.3 / 4095.0 const float fatorAD = Vcc / 4095.0; const int amostras = 71429; // rezultati em 1, 027 segundos para cada atualização // const int amostras = 35715; // rezultati em 0, 514 segundos para cada atualização
Izvorna koda - globalne spremenljivke
Zdaj definiramo nekatere globalne spremenljivke.
plovec 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
Izvorna koda - Nastavitev ()
Zaženite serijska vrata pri 1Mbps. Vrata AD smo prilagodili kot vhod in počakali 5 sekund, preden smo začeli zbirati podatke. Čas pripravljenosti ni obvezen.
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. (neobvezno)}
Source Code - Loop () - Zažene spremenljivke zbiranja podatkov
V zanki imamo spremenljivko za ponovitev. Tu shranimo tudi odčitke AD v 0.0 in znova zaženemo spremenljivko VRMS tudi v 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 variaável Vrms
Izvorna koda - zajame in izvede posamezne izračune za vsak vzorec
Na tej stopnji, če je i manjši od vzorca, začnemo cikel vzorčenja, dokler i ne doseže števila vzorcev. Zaženemo analogRead za branje analognih vrat in izračun vsote kvadratov odčitanih napetosti. Na koncu povečujemo iterator.
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); // izračunava soma dos quadrados das tensões lidas i ++; // prirast o iteradorju}
Izvorna koda - Splošni izračuni vzorcev in identifikacija največjega, najmanjšega in povprečja
Za določitev dejanske vrednosti napetosti uporabimo dejstvo množenja. Zaznamo, ali je vrednost največja ali najnižja, in izračunamo povprečje trenutnih največjih in najnižjih vrednosti.
// 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; } // izračunaj a média dos valores máximo e mínimo atuais Vmed = (Vmax + Vmin) /2,0;
Izvorna koda - možnosti izhoda
Imamo tri možnosti za "risanje" izhodne vrednosti. Imamo izhod, oblikovan v serijski ploter Arduino IDE, kot sta CSV ali Jason.
// formatada za ploter serijski IDE Arduino Serial.print (Vrms, 3); Serial.print (","); Serijski.tisk (Vmax, 3); Serial.print (","); Serijski.tisk (Vmin, 3); Serial.print (","); Serial.println (Vmed, 3); /* // formatada za json Serial.print ("{" instante (ms) ":"); Serial.print (millis ()); Serial.print (","); Serial.print ("\" Vrms (V) ":"); Serijski.tisk (Vrms, 3); Serial.print (","); Serial.print ("\" Vmax (V) ":"); Serijski.tisk (Vmax, 3); Serial.print (","); Serial.print ("\" Vmin (V) ":"); Serijski.tisk (Vmin, 3); Serial.print (","); Serial.print ("\" Vmed (V) ":"); Serijski.tisk (Vmed, 3); Serial.println ("}"); * / /* // saída formatada como CSV Serial.print (millis ()); Serial.print (","); Serijski.tisk (Vrms, 3); Serial.print (","); Serijski.tisk (Vmax, 3); Serial.print (","); Serijski.tisk (Vmin, 3); Serial.print (","); Serial.println (Vmed, 3); */}
14. korak: Datoteke
Prenesite datoteke:
JAZ NE