Kazalo:

Merjenje frekvence in napetosti napajalnika z uporabo Arduina: 6 korakov
Merjenje frekvence in napetosti napajalnika z uporabo Arduina: 6 korakov

Video: Merjenje frekvence in napetosti napajalnika z uporabo Arduina: 6 korakov

Video: Merjenje frekvence in napetosti napajalnika z uporabo Arduina: 6 korakov
Video: Uporaba osciloskopa za prikaz časovno spremenljivih veličin 2024, November
Anonim
Merjenje frekvence in napetosti napajalnika z uporabo Arduina
Merjenje frekvence in napetosti napajalnika z uporabo Arduina

Uvod:

Cilj tega projekta je merjenje napajalne frekvence in napetosti, ki je v Indiji med 220 do 240 voltov in 50Hz. Za zajem signala in izračun frekvence in napetosti sem uporabil Arduino, lahko uporabite kateri koli drug mikrokrmilnik ali ploščo, ki jo imate. Vezje zahteva nekaj komponent in je dokaj natančno za vse praktične namene.

1. korak: potrebne komponente

  • Arduino Uno
  • IC LM358
  • Izpadni transformator (220V do 12V)
  • Kondenzatorji:

    • 0,1 uF
    • 2 x 1 uF
  • Upori:

    • 3 x 1 kOhm
    • 2 x 100 kOhm
    • 1,5 kOhm
    • 3,3 kOhm
    • 6,8 kOhm
  • 3 x 1N4148 dioda
  • Plošča za kruh in skakalna žica (neobvezno)

2. korak: Shematski diagram

Shematski diagram
Shematski diagram
Shematski diagram
Shematski diagram

V zgornjem vezju je primarni transformator priključen na napajalno omrežje, primarni pa na naše merilno vezje

3. korak: Razumevanje vezja

Razumevanje vezja
Razumevanje vezja
Razumevanje vezja
Razumevanje vezja
Razumevanje vezja
Razumevanje vezja

Glede na funkcionalnost lahko to vezje razdelimo na štiri dele:

O: Vezje detektorja ničelnega prehoda

To vezje generira 5V kvadratni impulz vsakič, ko sinusni val preide iz pozitivnega v negativnega. Upor R1 v kombinaciji z D1 in D2 omejuje nihanje vhodne napetosti na stiku diode na -0,6 V do +5,6 V (ob predpostavki, da je prednja napetost diode 0,6 V). Poleg tega lahko povečate območje vhodne napetosti vezja s povečanjem vrednosti R1.

Upor R2 in R3 tvorita delilnik napetosti za omejitev nihanja napetosti na -0,24 voltov, saj je vhodna napetost v skupnem načinu LM358 omejena na -0,3 volta.

Upor R4, R5, kondenzator C1 in op-amp (tukaj uporabljen kot primerjalnik) tvori Schmittovo sprožilno vezje, kjer upor R4 in R5 nastavi histerezo na vhodu +49,5 mV nad tlemi. Izhod Schmittovega sprožilca se pošlje na Arduino PIN2 za nadaljnjo obdelavo.

B: Izolacija in napetost stopita navzdol

Kot že ime pove, ta del izolira in zniža napetost na približno 12Vrms. Zmanjšana napetost se dalje napaja v instrumentacijsko vezje.

C: Vezje detektorja vršnih vrednosti

To vezje določa največjo maksimalno napetost vhodnega signala. Uporniški delilnik R6 in R7 zmanjšata vhodno napetost za faktor 0,23 (12Vrms se zmanjša na 2.76Vrms). Dioda D3 vodi le pozitivni polcikel signala. Napetost na C2 se poveča do najvišje vrednosti odpravljenega signala, ki se napaja na analogni pin A0 Arduino za nadaljnji izračun napetosti.

Poleg tega lahko to vezje zamenjate z natančnim detektorjem vrha, kot je omenjeno tukaj. Toda za moje predstavitvene namene bo zgornje vezje dovolj.

D: Arduino

V tem delu Arduino zajame kvadratne impulze, ki jih ustvari Schmitt Trigger vezje, in odčita analogno napetost iz vezja detektorja vrha. Podatki se nadalje obdelujejo, da se določi časovno obdobje (torej frekvenca) kvadratnega impulza (ki je enak osebi za čas napajanja z izmeničnim tokom) in napetost napajanja.

4. korak: Izračun frekvence in napetosti

Izračun frekvence:

S pomočjo Arduina lahko izmerimo časovno obdobje T signala. Kvadratni valovni impulzi iz detektorja ničelnega prehoda se napajajo na pin 2, od tam lahko merimo časovno obdobje vsakega impulza. Z notranjim časovnikom Arduino (natančneje Timer1) lahko s pomočjo prekinitev izračunamo časovno obdobje med dvema naraščajočima roboma kvadratnega impulza. Časovnik se poveča za 1 na cikel ure (brez prednamestitve = 1) in vrednost se shrani v register TCNT1. Tako ura 16 Mhz poveča števec za 16 vsako mikrosekundo. Podobno se pri predkalerju = 8 časovnik poveča za 2 vsaki mikrosekundi. Od tod tudi časovno obdobje med dvema naraščajočima roboma

T = (vrednost TCNT1) / čas, potreben za vsako štetje

Kje, čas, potreben za vsako štetje = predkaler / (Taktna hitrost Arduino (16MHz)

Zato je frekvenca f = 1 / T = (Taktna hitrost Arduino (16 MHz) / (Vrednost predrazdelitve * TCNT!))

Hitrost časovnika (Hz) je zato podana z = (Taktna hitrost Arduino (16 MHz)) / predraztezovalnik

frekvenca signala pa je podana z = (Taktna hitrost Arduina

Ustrezno lahko izračunamo frekvenco f iz relacije f = 1/T.

Izračun napetosti:

Vgrajeni ADC Arduina ima ločljivost 10 bitov (možne vrednosti = 2^10 = 1024), vrne vrednosti v območju 0-1023. Za izračun ustrezne analogne napetosti V moramo uporabiti naslednje razmerje

V = (branje ADC) * 5/1023

Za izračun napajalne napetosti Vs (rms) moramo upoštevati razmerje transformatorjev, uporniški delilnik R6R7 in vršno detektorsko vezje. Lahko preprosto sestavimo različne dejavnike/razmerje kot:

Razmerje transformatorja = 12/230 = 0,052

Uporniški delilec = R7/(R6 + R7) = 0,23

Pri vršnem vezju detektorja = 1.414

Vs (rms) = V/(1.414*0.052*0.23) = (odčitavanje ADC)*0.289

Treba je opozoriti, da je ta vrednost daleč od dejanske vrednosti, predvsem zaradi napake v dejanskem razmerju transformatorjev in padca napetosti diode naprej. Eden od načinov, kako se temu izogniti, je določitev faktorja po sestavljanju vezja. To pomeni, da z multimetrom ločeno izmerimo napajalno napetost in napetost na kondenzatorju C2, nato pa izračunamo Vs (rms) na naslednji način:

Vs (rms) = ((Napajalna napetost *5)/(Napetost na C2 *1023)) *(Odčitavanje ADC)

v mojem primeru je Vs (rms) = 0,33*(branje ADC)

5. korak: Arduino koda

#define volt_in A0 // pin za branje analogne napetosti

hlapno uint16_t t_period; uint16_t ADC_value = 0; plavajoči volt, frekvenca; void isr () {t_period = TCNT1; // shranimo vrednost TCNT1 v t_period TCNT1 = 0; // ponastavi Timer1 ADC_value = analogRead (volt_in); // beri analogno napetost} float get_freq () {uint16_t timer = t_period; if (timer == 0) vrne 0; // da bi se izognili delitvi na nič else return 16000000.0/(8UL*timer); // frekvenca je podana z f = clk_freq/(prescaler*timeperiod)} void setup () {TCCR1A = 0; TCCR1B = bit (CS11); // nastavite predkaler na 8 TCNT1 = 0; // ponastavimo vrednost Timer1 TIMSK1 = bit (TOIE1); // omogočimo prekinitev pretoka Timer1 EIFR | = bit (INTF0); // počisti zastavico prekinitve INT0 Serial.begin (9600); } void loop () {attachInterrupt (0, isr, RISING); // omogočimo zakasnitev zunanjega prekinitve (INT0) (1000); detachInterrupt (0); freq = get_freq (); volt = vrednost ADC_ 0,33; Strunski buf; buf += niz (freq, 3); buf += F ("Hz / t"); buf += niz (volt); buf += F ("Volti"); Serial.println (buf); }

6. korak: Zaključek

Zaključek
Zaključek
Zaključek
Zaključek

Vezje lahko sestavite v mizo in prilagodite kodo ter dodate kartico SD za shranjevanje podatkov, ki jih je mogoče pozneje analizirati. Eden takih primerov je, da lahko analizirate napetost in frekvenco v času največje porabe.

Vezje, ki sem ga sestavil na plošči, je namesto LM358 (dvojni opamp) uporabljalo LM324 (štirikratni opamp), saj v tistem trenutku tega IC-ja še nisem imel in zapora po vsej državi zaradi pandemije COVID-19 mi je otežila pridobitev novega IC-ja. Kljub temu to ne bi vplivalo na delovanje vezja.

Za vse predloge in poizvedbe lahko spodaj komentirate.

Priporočena: