Sisukord:

Toiteallika sageduse ja pinge mõõtmine Arduino abil: 6 sammu
Toiteallika sageduse ja pinge mõõtmine Arduino abil: 6 sammu

Video: Toiteallika sageduse ja pinge mõõtmine Arduino abil: 6 sammu

Video: Toiteallika sageduse ja pinge mõõtmine Arduino abil: 6 sammu
Video: Mõõtke kuni 500 A alalisvoolu šunttakisti ja Arduino ekraaniga LCD1602 ekraanil 2024, November
Anonim
Toiteallika sageduse ja pinge mõõtmine Arduino abil
Toiteallika sageduse ja pinge mõõtmine Arduino abil

Sissejuhatus:

Selle projekti eesmärk on mõõta toitesagedust ja pinget, mis on siin Indias vahemikus 220 kuni 240 volti ja 50 Hz. Kasutasin signaali hõivamiseks ning sageduse ja pinge arvutamiseks Arduinot, võite kasutada mis tahes muud mikrokontrollerit või plaati. Vooluahel nõuab käputäis komponente ja on praktilistel eesmärkidel üsna täpne.

Samm: nõutavad komponendid

  • Arduino Uno
  • IC LM358
  • Lülitage trafo välja (220V kuni 12V)
  • Kondensaatorid:

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

    • 3 x 1 kOhm
    • 2 x 100 kOhm
    • 1,5 kOhm
    • 3,3 kOhm
    • 6,8 kOhm
  • 3 x 1N4148 dioodi
  • Leivalaud ja hüppaja traat (valikuline)

Samm: skemaatiline skeem

Skemaatiline diagramm
Skemaatiline diagramm
Skemaatiline diagramm
Skemaatiline diagramm

Ülaltoodud vooluahelas on trafo primaar ühendatud toitevõrguga ja primaar on ühendatud meie mõõteahelaga

3. samm: ahela mõistmine

Vooluahela mõistmine
Vooluahela mõistmine
Vooluahela mõistmine
Vooluahela mõistmine
Vooluahela mõistmine
Vooluahela mõistmine

Vastavalt funktsionaalsusele saab selle vooluahela jagada neljaks osaks:

V: Nullristumise detektori ahel

See vooluahel genereerib 5 V ruutimpulssi alati, kui siinuslaine muutub positiivsest negatiivseks. Takisti R1 koos D1 ja D2 -ga piirab sisendpinge kõikumist dioodi ristmikul -0,6V kuni +5,6V (eeldades, et dioodi edasipinge on 0,6V). Lisaks saate suurendada ahela sisendpinge vahemikku, suurendades väärtust R1.

Takisti R2 ja R3 moodustavad pingejaguri, et piirata negatiivse pinge kõikumist -0,24 volti, kuna LM358 sisendpinge on piiratud -0,3 voltiga.

Takisti R4, R5, kondensaator C1 ja op-amp (siin kasutatakse võrdlusena) moodustavad Schmitti käivitusahela, kus takisti R4 ja R5 seavad hüstereesi sisendil +49,5 mV maapinnast. Schmitti päästiku väljund suunatakse edasiseks töötlemiseks Arduino PIN2 -sse.

B: isolatsioon ja pinge vähenevad

Nagu nimigi ütleb, eraldab see osa ja vähendab pinget umbes 12 Vrms -ni. Alandatud pinget juhitakse edasi mõõteriistade ahelasse.

C: tippdetektori ahel

See ahel määrab sisendsignaali maksimaalse tipppinge. Takisti jagaja R6 ja R7 vähendavad sisendpinget 0,23 korda (12Vrms vähendatakse 2,76Vrms). Diood D3 juhib ainult signaali positiivset pooltsüklit. Pinge C2 -s tõuseb kuni alaldatud signaali tippväärtuseni, mis antakse pinge edasiseks arvutamiseks Arduino analoogpistikule A0.

Lisaks võite selle vooluahela asendada siin mainitud täppispiikide detektoriga. Kuid minu tutvustamiseks piisab ülaltoodud vooluringist.

D: Arduino

Selles osas salvestab Arduino Schmitti käivitusahela tekitatud ruudukujulisi impulsse ja loeb piikdetektori ahelast analoogpinget. Andmeid töödeldakse edasi, et määrata ruutimpulsi ajavahemik (seega sagedus) (mis on võrdne vahelduvvoolu toiteajaga) ja toitepinge.

4. samm: sageduse ja pinge arvutamine

Sageduse arvutamine:

Arduino abil saame mõõta signaali ajavahemikku T. Null-ristumisanduri ruutlaineimpulsid suunatakse tihvti 2, sealt saame mõõta iga impulsi ajavahemikku. Arduino sisemise taimeriga (täpsemalt Timer1) saame katkestuste abil arvutada ajavahemiku ruutimpulsi kahe tõusva serva vahel. Taimer suureneb ühe tsükli kohta 1 võrra (ilma eelseadistamiseta = 1) ja väärtus salvestatakse registrisse TCNT1. Seega suurendab 16Mhz kell loendurit iga mikrosekundi võrra 16 võrra. Sarnaselt prescaler = 8 korral suurendatakse taimerit iga mikrosekundi võrra 2 võrra. Sellest ka ajavahemik kahe tõusva serva vahel

T = (TCNT1 väärtus) / iga loenduse jaoks kulunud aeg

Kus, iga loenduse jaoks kulunud aeg = prescaler / (Arduino taktsagedus (16 MHz)

Seega on sagedus f = 1 / T = (Arduino taktsagedus (16 MHz) / (Prescaler * TCNT! Väärtus)

Seega on taimerikiirus (Hz) antud = (Arduino taktsagedus (16MHz)) / prescaler

ja signaali sageduse annab = (Arduino taktsagedus

Vastavalt saame sageduse f arvutada seosest f = 1/T.

Pinge arvutamine:

Arduino pardal oleva ADC eraldusvõime on 10 bitti (võimalikud väärtused = 2^10 = 1024), tagastades väärtused vahemikus 0-1023. Vastava analoogpinge V arvutamiseks peame kasutama järgmist seost

V = (ADC näit) * 5/1023

Toitepinge Vs (rms) arvutamiseks peame arvestama trafo suhtega, takisti jagajaga R6R7 ja piikdetektori ahelaga. Võime lihtsalt kokku panna erinevad tegurid/suhted järgmiselt:

Trafo suhe = 12/230 = 0,052

Takisti jagaja = R7/(R6 + R7) = 0,23

Tippdetektori ahelas = 1,414

Vs (rms) = V/(1,414*0,052*0,23) = (ADC näit)*0,289

Tuleb märkida, et see väärtus on tegelikust väärtusest kaugel, peamiselt trafo tegeliku suhte vea ja dioodi edasipinge languse tõttu. Üks võimalus sellest mööda hiilida on teguri määramine pärast vooluringi kokkupanekut. See on mõõtes toitepinget ja kondensaatori C2 pinget eraldi multimeetriga, seejärel arvutades Vs (rms) järgmiselt:

Vs (rms) = ((toitepinge *5)/(pinge C2 *1023)) *(ADC näit)

minu puhul Vs (rms) = 0,33*(ADC lugemine)

Samm: Arduino kood

#define volt_in A0 // analoogpinge lugemisnõel

lenduv uint16_t t_periood; uint16_t ADC_väärtus = 0; ujuk volt, sagedus; tühine isr () {t_periood = TCNT1; // salvesta TCNT1 väärtus t_perioodis TCNT1 = 0; // reset Timer1 ADC_value = analogRead (volt_in); // loe analoogpinget} float get_freq () {uint16_t timer = t_period; if (taimer == 0) tagastab 0; // nulliga jagamise vältimiseks tagasta 16000000.0/(8UL*taimer); // sageduse annab f = clk_freq/(prescaler*timeperiod)} void setup () {TCCR1A = 0; TCCR1B = bit (CS11); // seadista eelvalija 8 TCNT1 = 0; // reset Timer1 value TIMSK1 = bit (TOIE1); // lubage taimer1 ülevoolu katkestus EIFR | = bit (INTF0); // tühjenda INT0 katkestuslipp Serial.begin (9600); } void loop () {attachInterrupt (0, isr, RISING); // lubage väline katkestus (INT0) viivitus (1000); detachInterrupt (0); sagedus = get_freq (); volt = ADC_väärtus*0,33; String buf; buf += string (sagedus, 3); buf += F ("Hz / t"); buf += String (volt); buf += F ("voltid"); Seeria.println (buf); }

6. samm: järeldus

Järeldus
Järeldus
Järeldus
Järeldus

Saate vooluahela leivaplaadile kokku panna ja koodi näpistada ning andmete salvestamiseks SD -kaardi lisada, mida saab hiljem analüüsida. Üks selline näide on pinge ja sageduse analüüsimine tipptundidel.

Leivaplaadis kokku pandud vooluahelas kasutati LM358 (kahekordne opamp) asemel LM324 (quad opamp), kuna mul polnud seda IC-d sel hetkel ja üleriigiline lukustus COVID-19 pandeemia tõttu muutis mul uue IC hankimise keeruliseks. Sellest hoolimata ei mõjuta see vooluringi tööd.

Soovituste ja küsimuste korral võite julgelt allpool kommenteerida.

Soovitan: