Indholdsfortegnelse:

Strømforsyningsfrekvens og spændingsmåling ved hjælp af Arduino: 6 trin
Strømforsyningsfrekvens og spændingsmåling ved hjælp af Arduino: 6 trin

Video: Strømforsyningsfrekvens og spændingsmåling ved hjælp af Arduino: 6 trin

Video: Strømforsyningsfrekvens og spændingsmåling ved hjælp af Arduino: 6 trin
Video: PZEM-004T & ESP8266 ESP-01 Wi-Fi energimonitor | ESP-01 Home Automation | RemoteXY 2024, November
Anonim
Strømforsyning Frekvens- og spændingsmåling ved hjælp af Arduino
Strømforsyning Frekvens- og spændingsmåling ved hjælp af Arduino

Introduktion:

Målet med dette projekt er at måle forsyningsfrekvens og spænding, som er mellem 220 til 240 volt og 50 Hz her i Indien. Jeg brugte en Arduino til at fange signal og beregne frekvens og spænding, du kan bruge enhver anden mikrokontroller eller kort, du har. Kredsløbet kræver en håndfuld komponenter og er ret præcist til alle praktiske formål.

Trin 1: Komponenter påkrævet

  • Arduino Uno
  • IC LM358
  • Trin ned transformer (220V til 12V)
  • Kondensatorer:

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

    • 3 x 1 kOhm
    • 2 x 100 kOhm
    • 1,5kOhm
    • 3,3 kOhm
    • 6,8 kOhm
  • 3 x 1N4148 diode
  • Brødbræt og jumper wire (valgfrit)

Trin 2: Skematisk diagram

Skematisk diagram
Skematisk diagram
Skematisk diagram
Skematisk diagram

I ovenstående kredsløb er transformatorens primær tilsluttet forsyningsnettet, og primæren er forbundet til vores målekredsløb

Trin 3: Forstå kredsløbet

Forstå kredsløbet
Forstå kredsløbet
Forstå kredsløbet
Forstå kredsløbet
Forstå kredsløbet
Forstå kredsløbet

I henhold til funktionaliteten kan dette kredsløb opdeles i fire dele:

A: Zero Crossing Detector -kredsløbet

Dette kredsløb genererer en 5V kvadratisk puls, når sinusbølgen går fra positiv til negativ. Modstand R1 kombineret med D1 og D2 begrænser indgangsspændingssvinget ved diodeforbindelsen til -0,6V til +5,6V (forudsat at diodes forspænding er 0,6V). Desuden kan du øge kredsens indgangsspændingsområde ved at øge værdien på R1.

Modstanden R2 og R3 danner en spændingsdeler for at begrænse den negative spændingssving til -0,24Volts, da input -common -mode -spændingen for LM358 er begrænset til -0,3Volts.

Modstanden R4, R5, kondensatoren C1 og op-amp (her brugt som komparator) danner Schmitt Trigger-kredsløbet, hvor modstanden R4 og R5 sætter hysteresen ved input +49,5mV over jorden. Output fra Schmitt Trigger føres til Arduino PIN2 til videre behandling.

B: Isolation og spænding Træd ned

Som navnet antyder, isolerer og reducerer denne del spændingen til cirka 12Vrms. Den reducerede spænding føres yderligere til instrumenteringskredsløbet.

C: Peak Detector kredsløb

Dette kredsløb bestemmer den maksimale spids for indgangssignalet. Modstandsdeler R6 og R7 reducerer indgangsspændingen med en faktor 0,23 (12Vrms reduceres til 2,76Vrms). Dioden D3 udfører kun den positive halve cyklus af signalet. Spændingen over C2 stiger op til spidsværdien af det rektificerede signal, som føres til Arduino analog pin A0 for yderligere at beregne spændingen.

Derudover kan du udskifte dette kredsløb med et præcisionsspidsdetektorkredsløb som disse nævnt her. Men til mine demonstrationsformål vil ovenstående kredsløb være tilstrækkeligt.

D: Arduino

I denne del fanger Arduino de firkantede pulser, der genereres af Schmitt Trigger -kredsløbet, og læser den analoge spænding fra spidsdetektorkredsløbet. Dataene behandles yderligere for at bestemme tidsperioden (dermed frekvensen) af kvadratpulsen (som er lig med ac -forsyningstidspersonen) og forsyningens spænding.

Trin 4: Beregning af frekvens og spænding

Beregning af frekvens:

Ved hjælp af Arduino kan vi måle tidsperioden T for signalet. Kvadratbølgepulser fra nulkrydsningsdetektoren føres til pin 2, derfra kan vi måle tidsperioden for hver puls. Vi kan bruge Arduinos interne timer (specifikt Timer1) til at beregne tidsperioden mellem to stigende kanter af kvadratpulsen ved hjælp af afbrydelser. Timeren øges med 1 pr. Urcyklus (uden prescaler = 1), og værdien gemmes i register TCNT1. Derfor øger 16Mhz -uret tælleren med 16 hvert mikrosekund. Tilsvarende for prescaler = 8 øges timeren med 2 hvert mikrosekund. Derfor tidsperioden mellem to stigende kanter

T = (TCNT1 -værdi) / tid taget for hver optælling

Hvor, tid taget for hver optælling = prescaler / (Arduino clockhastighed (16MHz)

Derfor er frekvens f = 1 / T = (Arduino -urhastighed (16MHz) / (Prescaler * TCNT! -Værdi)

Derfor er timerhastigheden (Hz) givet af = (Arduino -urhastighed (16MHz)) / prescaler

og signalets frekvens er givet ved = (Arduino -urhastighed

Tilsvarende kan vi beregne frekvens f ud fra forholdet f = 1/T.

Beregning af spænding:

Den indbyggede ADC i Arduino har en opløsning på 10 bit (mulige værdier = 2^10 = 1024), der returnerer værdier i området 0-1023. For at beregne den tilsvarende analoge spænding V skal vi bruge følgende relation

V = (ADC -læsning) * 5/1023

For at beregne forsyningsspændingen Vs (rms) skal vi tage hensyn til transformatorforholdet, modstandsdeleren R6R7 og spidsdetektorkredsløbet. Vi kan simpelthen sammensætte de forskellige faktorer/forhold som:

Transformatorforhold = 12/230 = 0,052

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

Ved spidsdetektorkredsløb = 1.414

Vs (rms) = V/(1.414*0.052*0.23) = (ADC -læsning)*0.289

Det skal bemærkes, at denne værdi er langt fra den faktiske værdi, hovedsagelig på grund af fejl i det faktiske transformatorforhold og diodeens fremadspændingsfald. En måde at omgå dette er at bestemme faktoren efter samling af kredsløbet. Det er ved at måle forsyningsspændingen og spændingen over kondensatoren C2 separat med et multimeter og derefter beregne Vs (rms) som følger:

Vs (rms) = ((Forsyningsspænding *5)/(Spænding over C2 *1023)) *(ADC -aflæsning)

i mit tilfælde er Vs (rms) = 0,33*(ADC -læsning)

Trin 5: Arduino -kode

#define volt_in A0 // analog spænding læs pin

flygtig uint16_t t_period; uint16_t ADC_værdi = 0; float volt, freq; void isr () {t_period = TCNT1; // gem TCNT1 -værdi i t_period TCNT1 = 0; // reset Timer1 ADC_value = analogRead (volt_in); // læs analog spænding} float get_freq () {uint16_t timer = t_periode; hvis (timer == 0) returnerer 0; // for at undgå division med nul, returner 16000000.0/(8UL*timer); // frekvens er givet ved f = clk_freq/(prescaler*timeperiod)} void setup () {TCCR1A = 0; TCCR1B = bit (CS11); // sæt prescaler til 8 TCNT1 = 0; // reset Timer1 værdi TIMSK1 = bit (TOIE1); // aktiver Timer1 overløbsafbrydelse EIFR | = bit (INTF0); // ryd INT0 -afbrydelsesflag Serial.begin (9600); } void loop () {attachInterrupt (0, isr, RISING); // aktiver ekstern afbrydelse (INT0) forsinkelse (1000); detachInterrupt (0); freq = get_freq (); volt = ADC_værdi*0,33; String buf; buf += String (freq, 3); buf += F ("Hz / t"); buf += streng (volt); buf += F ("Volt"); Serial.println (buf); }

Trin 6: Konklusion

Konklusion
Konklusion
Konklusion
Konklusion

Du kan samle kredsløbet i et brødbræt og justere koden og tilføje et SD -kort for at gemme dataene, som senere kan analyseres. Et sådant eksempel er, at du kan analysere spændingen og frekvensen i spidsbelastningstider.

Det kredsløb, jeg samlede i brødbrættet, brugte LM324 (quad opamp) i stedet for LM358 (dual opamp), da jeg ikke havde den IC på det tidspunkt og landsdækkende lockdown på grund af COVID-19-pandemien gjorde det svært for mig at få en ny IC. Ikke desto mindre ville det ikke påvirke kredsløbets funktion.

Kommenter gerne nedenfor for eventuelle forslag og forespørgsler.

Anbefalede: