INHOUDSOPGAWE:

Meting van frekwensie- en spanningsvoorsiening deur Arduino: 6 stappe
Meting van frekwensie- en spanningsvoorsiening deur Arduino: 6 stappe

Video: Meting van frekwensie- en spanningsvoorsiening deur Arduino: 6 stappe

Video: Meting van frekwensie- en spanningsvoorsiening deur Arduino: 6 stappe
Video: How to use Allegro ACS712 AC/DC Current Sensor with Arduino 2024, November
Anonim
Kragtoevoer en frekwensie meting met behulp van Arduino
Kragtoevoer en frekwensie meting met behulp van Arduino

Inleiding:

Die doel van hierdie projek is om die voedingsfrekwensie en -spanning te meet, wat tussen 220 en 240 volt en 50 Hz hier in Indië is. Ek het 'n Arduino gebruik om seine vas te lê en frekwensie en spanning te bereken, u kan enige ander mikrobeheerder of -bord gebruik. Die kring benodig 'n handjievol komponente en is redelik akkuraat vir alle praktiese doeleindes.

Stap 1: Vereiste komponente

  • Arduino Uno
  • IC LM358
  • Trap -transformator (220V tot 12V)
  • Kapasitors:

    • 0.1 uF
    • 2 x 1 uF
  • Weerstande:

    • 3 x 1 kOhm
    • 2 x 100 kOhm
    • 1.5kOhm
    • 3.3kOhm
    • 6,8 kOhm
  • 3 x 1N4148 diode
  • Broodbord en jumperdraad (opsioneel)

Stap 2: Skematiese diagram

Skematiese diagram
Skematiese diagram
Skematiese diagram
Skematiese diagram

In die bogenoemde stroombaan is die transformator primêr gekoppel aan die hoofleiding en die primêre is gekoppel aan ons meetbaan

Stap 3: Begrip van die kring

Verstaan die kring
Verstaan die kring
Verstaan die kring
Verstaan die kring
Verstaan die kring
Verstaan die kring

Volgens die funksionaliteit kan hierdie stroombaan in vier dele verdeel word:

A: Die kringloop van nulkruising

Hierdie stroombaan genereer 'n 5V vierkante puls wanneer die sinusgolf van positief na negatief gaan. Weerstand R1 gekombineer met D1 en D2 beperk die insetspanning swaai by die diode aansluiting tot -0,6V tot +5,6V (veronderstel dat die diode se voorwaartse spanning 0,6V is). Verder kan u die ingangsspanningsreeks van die stroombaan verhoog deur die waarde van R1 te verhoog.

Die weerstand R2 en R3 vorm 'n spanningsverdeler om die swaai van die negatiewe spanning tot -0,24Volts te beperk, aangesien die ingangsmodus -spanning van LM358 beperk is tot -0,3Volts.

Die weerstand R4, R5, kapasitor C1 en die op-amp (hier gebruik as 'n vergelyker) vorm die Schmitt Trigger-stroombaan waar die weerstand R4 en R5 die histerese op insette +49,5mV bo die grond stel. Die uitset van die Schmitt Trigger word na die Arduino PIN2 gevoer vir verdere verwerking.

B: Isolasie en spanning verlaag

Soos die naam aandui, isoleer en verlaag hierdie deel die spanning tot ongeveer 12Vrms. Die verlaagde spanning word verder na die instrumentasiekring gelei.

C: Peak Detector kring

Hierdie stroombaan bepaal die maksimum piek spanning van die insetsein. Weerstandsverdeler R6 en R7 verminder die insetspanning met 'n faktor van 0,23 (12Vrms word verminder tot 2,76Vrms). Die diode D3 voer slegs die positiewe halfsiklus van die sein uit. Die spanning oor C2 styg tot by die piekwaarde van die gelykgemaakte sein, wat na die analoge pen A0 van Arduino gevoer word om die spanning verder te bereken.

Boonop kan u hierdie stroombaan vervang deur 'n presiese piekdetektorkring soos hier genoem. Maar vir my demonstrasiedoeleindes is die bogenoemde kring voldoende.

D: Arduino

In hierdie deel vang die Arduino die vierkantpulse wat deur die Schmitt Trigger -stroombaan gegenereer word en lees die analoog spanning van die piekdetektorkring. Die data word verder verwerk om die tydsperiode (vandaar frekwensie) van die vierkantpuls (wat gelyk is aan die wisselstroompersoon) en die spanning van die toevoer te bepaal.

Stap 4: Berekening van frekwensie en spanning

Berekening van frekwensie:

Met die hulp van Arduino kan ons die tydperk T van die sein meet. Die vierkantgolfpulse van die nul-kruising detektor word na pen 2 gevoer, van daar af kan ons die tydsperiode van elke pols meet. Ons kan die interne timer van Arduino (spesifiek Timer1) gebruik om die tydsperiode tussen twee stygende rande van die vierkantpuls te bereken met behulp van onderbrekings. Die timer styg met 1 per kloksiklus (sonder prescaler = 1) en die waarde word in register TCNT1 gestoor. Daarom verhoog die 16Mhz -klok die teller met 16 elke mikrosekonde. Net so vir prescaler = 8 word die timer met elke mikrosekonde toegeneem. Vandaar die tydperk tussen twee stygende rand

T = (TCNT1 -waarde) / tydsduur vir elke telling

Waar, tyd geneem vir elke telling = voorskaler / (Arduino kloksnelheid (16MHz)

Daarom is frekwensie f = 1 / T = (Arduino -kloksnelheid (16MHz) / (Prescaler * TCNT! -Waarde)

Daarom word die tydsnelheid (Hz) gegee deur = (Arduino -kloksnelheid (16MHz)) / prescaler

en die frekwensie van die sein word gegee deur = (Arduino kloksnelheid

Dienooreenkomstig kan ons die frekwensie f uit die verhouding f = 1/T bereken.

Berekening van spanning:

Die ingeboude ADC van Arduino het 'n resolusie van 10 bisse (moontlike waardes = 2^10 = 1024), wat waardes in die reeks 0-1023 teruggee. Om die ooreenstemmende analoog spanning V te bereken, moet ons die volgende verband gebruik

V = (ADC -lees) * 5/1023

Om die voedingspanning Vs (rms) te bereken, moet ons die transformatorverhouding, weerstandsverdeler R6R7 en die piekdetektorkring in ag neem. Ons kan die verskillende faktore/verhouding eenvoudig saamstel as:

Transformatorverhouding = 12/230 = 0,052

Weerstandsverdeler = R7/(R6 + R7) = 0,23

By piek detektorkring = 1.414

Vs (rms) = V/(1.414*0.052*0.23) = (ADC -lees)*0.289

Daar moet op gelet word dat hierdie waarde ver van die werklike waarde is, hoofsaaklik as gevolg van foute in die werklike transformatorverhouding en die diode -voorwaartse spanningsval. Een manier om dit te omseil, is om die faktor te bepaal nadat die stroombaan saamgestel is. Dit is deur die toevoerspanning en die spanning oor die kapasitor C2 afsonderlik met 'n multimeter te meet en dan Vs (rms) soos volg te bereken:

Vs (rms) = ((Voedingsspanning *5)/(Spanning oor C2 *1023)) *(ADC -lesing)

in my geval is Vs (rms) = 0,33*(ADC -lees)

Stap 5: Arduino -kode

#definieer volt_in A0 // analoogspanning leespen

vlugtige uint16_t t_periode; uint16_t ADC_waarde = 0; float volt, frekwensie; leegte isr () {t_periode = TCNT1; // stoor TCNT1 -waarde in t_periode TCNT1 = 0; // reset Timer1 ADC_value = analogRead (volt_in); // lees analoog spanning} float get_freq () {uint16_t timer = t_periode; as (timer == 0) terugkeer 0; // om die verdeling deur nul te vermy, gee 16000000.0/(8UL*timer) terug; // frekwensie word gegee deur f = clk_freq/(prescaler*timeperiod)} leemte -opstelling () {TCCR1A = 0; TCCR1B = bietjie (CS11); // stel prescaler op 8 TCNT1 = 0; // reset Timer1 waarde TIMSK1 = bit (TOIE1); // aktiveer Timer1 oorloop onderbreek EIFR | = bit (INTF0); // duidelik INT0 onderbreek vlag Serial.begin (9600); } leemte -lus () {attachInterrupt (0, isr, RISING); // eksterne vertraging (INT0) vertraging (1000) moontlik maak; losmaakonderbreking (0); freq = get_freq (); volt = ADC_waarde*0,33; String buf; buf += String (frekwensie, 3); buf += F ("Hz / t"); buf += String (volt); buf += F ("Volt"); Serial.println (buf); }

Stap 6: Gevolgtrekking

Afsluiting
Afsluiting
Afsluiting
Afsluiting

U kan die kring in 'n broodbord monteer en die kode aanpas en 'n SD -kaart byvoeg om die data op te slaan, wat later ontleed kan word. Een voorbeeld is dat u die spanning en frekwensie tydens spitstye kan ontleed.

Die kring wat ek in die broodbord bymekaargemaak het, gebruik LM324 (quad opamp) in plaas van LM358 (dual opamp), aangesien ek op daardie oomblik nie die IC gehad het nie en die landwye sluiting weens COVID-19-pandemie dit vir my moeilik gemaak het om 'n nuwe IC te kry. Dit sou egter nie die werking van die stroombaan beïnvloed nie.

Lewer gerus kommentaar hieronder vir enige voorstelle en navrae.

Aanbeveel: