Innholdsfortegnelse:

Strømforsyning Frekvens- og spenningsmåling ved bruk av Arduino: 6 trinn
Strømforsyning Frekvens- og spenningsmåling ved bruk av Arduino: 6 trinn

Video: Strømforsyning Frekvens- og spenningsmåling ved bruk av Arduino: 6 trinn

Video: Strømforsyning Frekvens- og spenningsmåling ved bruk av Arduino: 6 trinn
Video: Управление 32 сервомоторами с помощью PCA9685 и Arduino: V3 2024, November
Anonim
Strømforsyning Frekvens og spenningsmåling ved hjelp av Arduino
Strømforsyning Frekvens og spenningsmåling ved hjelp av Arduino

Introduksjon:

Målet med dette prosjektet er å måle forsyningsfrekvens og spenning, som er mellom 220 til 240 volt og 50 Hz her i India. Jeg brukte en Arduino for å fange signal og beregne frekvens og spenning, du kan bruke hvilken som helst annen mikrokontroller eller brett du har. Kretsen krever en håndfull komponenter og er ganske nøyaktig for alle praktiske formål.

Trinn 1: Komponenter påkrevd

  • Arduino Uno
  • IC LM358
  • Trinn ned transformator (220V til 12V)
  • Kondensatorer:

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

    • 3 x 1 kOhm
    • 2 x 100 kOhm
    • 1,5kOhm
    • 3,3 kOhm
    • 6,8 kOhm
  • 3 x 1N4148 diode
  • Brødbrett og jumper wire (valgfritt)

Trinn 2: Skjematisk diagram

Skjematisk diagram
Skjematisk diagram
Skjematisk diagram
Skjematisk diagram

I kretsen ovenfor er transformatoren primær koblet til strømnettet og primæren er koblet til vår målekrets

Trinn 3: Forstå kretsen

Forstå kretsen
Forstå kretsen
Forstå kretsen
Forstå kretsen
Forstå kretsen
Forstå kretsen

I henhold til funksjonaliteten kan denne kretsen deles inn i fire deler:

A: Zero Crossing Detector -kretsen

Denne kretsen genererer en 5V kvadratisk puls når sinusbølgen går fra positiv til negativ. Motstand R1 kombinert med D1 og D2 begrenser inngangsspenningssvingningen ved diodeforbindelsen til -0,6V til +5,6V (forutsatt at diodens fremspenning er 0,6V). Videre kan du øke inngangsspenningsområdet til kretsen ved å øke verdien på R1.

Motstanden R2 og R3 danner en spenningsdeler for å begrense den negative spenningssvingningen til -0,24Volts da inngangsspenningen for vanlig modus til LM358 er begrenset til -0,3Volt.

Motstanden R4, R5, kondensatoren C1 og op-amp (her brukt som komparator) danner Schmitt Trigger-kretsen der motstanden R4 og R5 setter hysteresen ved inngang +49,5 mV over bakken. Utgangen fra Schmitt Trigger mates til Arduino PIN2 for videre behandling.

B: Isolasjon og spenning Trinn ned

Som navnet antyder, isolerer og senker denne delen spenningen til omtrent 12Vrms. Den reduserte spenningen mates videre til instrumenteringskretsen.

C: Toppdetektorkrets

Denne kretsen bestemmer maksimal spenning for inngangssignalet. Motstandsdeler R6 og R7 reduserer inngangsspenningen med en faktor 0,23 (12Vrms reduseres til 2,76Vrms). Dioden D3 utfører bare den positive halvsyklusen til signalet. Spenningen over C2 øker opp til toppverdien av det rektifiserte signalet, som mates til Arduino analog pin A0 for ytterligere å beregne spenningen.

I tillegg kan du erstatte denne kretsen med en presisjons toppdetektorkrets som disse nevnt her. Men for mine demonstrasjonsformål vil kretsen ovenfor være tilstrekkelig.

D: Arduino

I denne delen fanger Arduino de firkantede pulser generert av Schmitt Trigger -kretsen og leser den analoge spenningen fra toppdetektorkretsen. Dataene behandles videre for å bestemme tidsperioden (derav frekvensen) til kvadratpulsen (som er lik person for vekselstrømforsyningstidspunktet) og spenningen til forsyningen.

Trinn 4: Beregning av frekvens og spenning

Beregning av frekvens:

Ved hjelp av Arduino kan vi måle tidsperioden T for signalet. Kvadratbølgepulsene fra nullovergangsdetektoren mates til pinne 2, derfra kan vi måle tidsperioden for hver puls. Vi kan bruke Arduinos interne timer (spesielt Timer1) til å beregne tidsperioden mellom to stigende kanter på kvadratpulsen ved hjelp av avbrudd. Tidsuret øker med 1 per klokkesyklus (uten prescaler = 1) og verdien lagres i registeret TCNT1. Derfor øker 16Mhz -klokken telleren med 16 hvert mikrosekund. På samme måte for prescaler = 8 øker timeren med 2 hvert mikrosekund. Derav tidsperioden mellom to stigende kanter

T = (TCNT1 -verdi) / tid det tar for hver telling

Hvor, tid tatt for hver telling = forhåndsskaler / (Arduino klokkehastighet (16MHz)

Derfor er frekvensen f = 1 / T = (Arduino -klokkehastighet (16MHz) / (Prescaler * TCNT! -Verdi)

Derfor er tidtakerhastigheten (Hz) gitt av = (Arduino klokkehastighet (16MHz)) / forkalkingsenhet

og frekvensen til signalet er gitt av = (Arduino klokkehastighet

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

Beregning av spenning:

Den innebygde ADC av Arduino har en oppløsning på 10 bits (mulige verdier = 2^10 = 1024), og returnerer verdier i området 0-1023. For å beregne den tilsvarende analoge spenningen V må vi bruke følgende forhold

V = (ADC -avlesning) * 5/1023

For å beregne forsyningsspenningen Vs (rms) må vi ta hensyn til transformatorforholdet, motstandsdeleren R6R7 og toppdetektorkretsen. Vi kan ganske enkelt sette sammen de forskjellige faktorene/forholdet som:

Transformatorforhold = 12/230 = 0,052

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

Ved toppdetektorkrets = 1.414

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

Det skal bemerkes at denne verdien er langt fra den faktiske verdien, hovedsakelig på grunn av feil i det faktiske transformatorforholdet og diodens spenningsfall. En måte å omgå dette på er å bestemme faktoren etter at kretsen er satt sammen. Det er ved å måle forsyningsspenningen og spenningen over kondensatoren C2 separat med et multimeter, og deretter beregne Vs (rms) som følger:

Vs (rms) = ((forsyningsspenning *5)/(spenning over C2 *1023)) *(ADC -avlesning)

i mitt tilfelle er Vs (rms) = 0,33*(ADC Reading)

Trinn 5: Arduino -kode

#define volt_in A0 // analog spenning lesestift

flyktig uint16_t t_period; uint16_t ADC_value = 0; float volt, frekvens; void isr () {t_period = TCNT1; // lagre TCNT1 -verdi i t_periode TCNT1 = 0; // reset Timer1 ADC_value = analogRead (volt_in); // les analog spenning} float get_freq () {uint16_t timer = t_period; hvis (timer == 0) returnerer 0; // for å unngå divisjon med null ellers returner 16000000.0/(8UL*timer); // frekvens er gitt av f = clk_freq/(prescaler*timeperiod)} void setup () {TCCR1A = 0; TCCR1B = bit (CS11); // sett prescaler til 8 TCNT1 = 0; // reset Timer1 verdi TIMSK1 = bit (TOIE1); // aktivere Timer1 overløp avbryte EIFR | = bit (INTF0); // tøm INT0 -avbruddsflagget Serial.begin (9600); } void loop () {attachInterrupt (0, isr, RISING); // aktivere ekstern avbrudd (INT0) forsinkelse (1000); detachInterrupt (0); freq = get_freq (); volt = ADC_verdi*0,33; String buf; buf += streng (frekvens, 3); buf += F ("Hz / t"); buf += streng (volt); buf += F ("Volt"); Serial.println (buf); }

Trinn 6: Konklusjon

Konklusjon
Konklusjon
Konklusjon
Konklusjon

Du kan sette sammen kretsen i et brødbrett og justere koden og legge til et SD -kort for å lagre dataene, som senere kan analyseres. Et slikt eksempel er at du kan analysere spenningen og frekvensen i rushtiden.

Kretsen jeg monterte i brødbrettet brukte LM324 (quad opamp) i stedet for LM358 (dual opamp) da jeg ikke hadde den ICen i det øyeblikket og landsomfattende lockdown på grunn av COVID-19-pandemien gjorde det vanskelig for meg å få en ny IC. Likevel ville det ikke påvirke kretsens arbeid.

Kommenter gjerne nedenfor for forslag og spørsmål.

Anbefalt: