Cuprins:

Măsurarea frecvenței și tensiunii de alimentare cu ajutorul Arduino: 6 pași
Măsurarea frecvenței și tensiunii de alimentare cu ajutorul Arduino: 6 pași

Video: Măsurarea frecvenței și tensiunii de alimentare cu ajutorul Arduino: 6 pași

Video: Măsurarea frecvenței și tensiunii de alimentare cu ajutorul Arduino: 6 pași
Video: Aparate de măsură şi control pentru electronişti 2024, Noiembrie
Anonim
Măsurarea frecvenței și tensiunii de alimentare cu Arduino
Măsurarea frecvenței și tensiunii de alimentare cu Arduino

Introducere:

Scopul acestui proiect este de a măsura frecvența și tensiunea de alimentare, care este cuprinsă între 220 și 240 de volți și 50 Hz aici, în India. Am folosit un Arduino pentru captarea semnalului și calcularea frecvenței și tensiunii, puteți utiliza orice alt microcontroler sau placă pe care o aveți. Circuitul necesită o mână de componente și este destul de precis pentru toate scopurile practice.

Pasul 1: Componente necesare

  • Arduino Uno
  • IC LM358
  • Transformator descendent (220V la 12V)
  • Condensatoare:

    • 0,1 uF
    • 2 x 1uF
  • Rezistențe:

    • 3 x 1kOhm
    • 2 x 100kOhm
    • 1,5kOhm
    • 3,3kOhm
    • 6,8 kOhm
  • 3 x diodă 1N4148
  • Pâine și sârmă jumper (opțional)

Pasul 2: Diagrama schematică

Diagramă schematică
Diagramă schematică
Diagramă schematică
Diagramă schematică

În circuitul de mai sus, transformatorul primar este conectat la rețeaua de alimentare, iar primarul este conectat la circuitul nostru de măsurare

Pasul 3: Înțelegerea circuitului

Înțelegerea circuitului
Înțelegerea circuitului
Înțelegerea circuitului
Înțelegerea circuitului
Înțelegerea circuitului
Înțelegerea circuitului

Conform funcționalității, acest circuit poate fi împărțit în patru părți:

A: Circuitul detectorului de trecere zero

Acest circuit generează un impuls pătrat de 5V ori de câte ori unde sinusoidale trece de la pozitiv la negativ. Rezistorul R1 combinat cu D1 și D2 limitează oscilația tensiunii de intrare la joncțiunea diodei la -0,6V la + 5,6V (presupunând că tensiunea directă a diodei este 0,6V). În plus, puteți crește gama de tensiune de intrare a circuitului prin creșterea valorii R1.

Rezistorul R2 și R3 formează un divizor de tensiune pentru a limita oscilația tensiunii negative la -0,24 Volți, deoarece tensiunea de intrare în modul comun al LM358 este limitată la -0,3 Volți.

Rezistorul R4, R5, condensatorul C1 și op-amp (utilizat aici ca comparator) formează circuitul Schmitt Trigger unde rezistorul R4 și R5 setează histerezisul la intrare + 49,5mV deasupra solului. Ieșirea Schmitt Trigger este alimentată către Arduino PIN2 pentru procesare ulterioară.

B: Izolare și tensiune descrescătoare

După cum sugerează și numele, această parte izolează și reduce tensiunea la aproximativ 12Vrms. Tensiunea redusă este alimentată în continuare în circuitul de instrumentare.

C: Circuitul detectorului de vârf

Acest circuit determină tensiunea maximă de vârf a semnalului de intrare. Divizorul de rezistențe R6 și R7 reduce tensiunea de intrare cu un factor de 0,23 (12Vrms este redus la 2,76Vrms). Dioda D3 conduce doar semiciclul pozitiv al semnalului. Tensiunea pe C2 crește până la valoarea de vârf a semnalului rectificat, care este alimentat pinului analogic Arduino A0 pentru a calcula în continuare tensiunea.

În plus, puteți înlocui acest circuit cu un circuit de precizie cu detector de vârf, cum ar fi acestea menționate aici. Dar pentru scopurile mele demonstrative, circuitul de mai sus va fi suficient.

D: Arduino

În această parte, Arduino captează impulsurile pătrate generate de circuitul Schmitt Trigger și citește tensiunea analogică din circuitul detectorului de vârf. Datele sunt prelucrate în continuare pentru a determina perioada de timp (deci frecvența) impulsului pătrat (care este egal cu persoana din timpul de alimentare cu curent alternativ) și tensiunea de alimentare.

Pasul 4: Calculul frecvenței și tensiunii

Calculul frecvenței:

Cu ajutorul Arduino, putem măsura perioada de timp T a semnalului. Impulsurile de undă pătrată de la detectorul de trecere zero sunt alimentate la pinul 2, de acolo putem măsura perioada de timp a fiecărui impuls. Putem utiliza temporizatorul intern al Arduino (în special Timer1) pentru a calcula perioada de timp dintre două margini ascendente ale impulsului pătrat cu ajutorul întreruperilor. Temporizatorul crește cu 1 per ciclu de ceas (fără prescaler = 1) și valoarea este stocată în registrul TCNT1. Prin urmare, ceasul de 16 MHz crește contorul cu 16 la fiecare microsecundă. În mod similar pentru prescaler = 8, cronometrul se mărește cu 2 la fiecare microsecundă. De aici și perioada de timp dintre două margini ascendente

T = (valoare TCNT1) / timpul necesar pentru fiecare numărare

Unde, timpul necesar pentru fiecare număr = prescaler / (viteza ceasului Arduino (16 MHz)

Prin urmare, frecvența f = 1 / T = (Viteza ceasului Arduino (16 MHz) / (Prescaler * valoarea TCNT!)

Prin urmare, viteza temporizatorului (Hz) este dată de = (Viteza ceasului Arduino (16 MHz)) / prescaler

iar frecvența semnalului este dată de = (viteza de ceas Arduino

În mod corespunzător, putem calcula frecvența f din relația f = 1 / T.

Calculul tensiunii:

ADC-ul integrat al Arduino are o rezoluție de 10 biți (valori posibile = 2 ^ 10 = 1024), returnând valori în intervalul 0-1023. Pentru a calcula tensiunea analogică V corespunzătoare trebuie să folosim următoarea relație

V = (citire ADC) * 5/1023

Pentru a calcula tensiunea de alimentare Vs (rms) trebuie să luăm în considerare raportul transformatorului, divizorul rezistorului R6R7 și circuitul detectorului de vârf. Putem pur și simplu să alcătuim diferiți factori / raport ca:

Raportul transformatorului = 12/230 = 0,052

Divizorul rezistorului = R7 / (R6 + R7) = 0,23

La circuitul detectorului de vârf = 1.414

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

Trebuie remarcat faptul că această valoare este departe de valoarea reală, în principal din cauza erorii în raportul real al transformatorului și a căderii de tensiune a diodei. O modalitate de a ocoli acest lucru este de a determina factorul după asamblarea circuitului. Asta prin măsurarea tensiunii de alimentare și a tensiunii pe condensatorul C2 separat cu un multimetru, apoi calculând Vs (rms) după cum urmează:

Vs (rms) = ((Tensiunea de alimentare * 5) / (Tensiunea la C2 * 1023)) * (citirea ADC)

în cazul meu, Vs (rms) = 0,33 * (citire ADC)

Pasul 5: Cod Arduino

#define volt_in A0 // pin analogic de citire a tensiunii

volatil uint16_t t_period; uint16_t ADC_value = 0; float volt, frecvență; void isr () {t_period = TCNT1; // stocați valoarea TCNT1 în t_perioada TCNT1 = 0; // reset Timer1 ADC_value = analogRead (volt_in); // citit tensiune analogică} float get_freq () {uint16_t timer = t_period; if (timer == 0) returnează 0; // pentru a evita împărțirea cu zero altceva returnează 16000000.0 / (8UL * timer); // frecvența este dată de f = clk_freq / (prescaler * timeperiod)} void setup () {TCCR1A = 0; TCCR1B = bit (CS11); // setați prescalerul la 8 TCNT1 = 0; // resetează valoarea Timer1 TIMSK1 = bit (TOIE1); // activa Timer1 overflow interrupt EIFR | = bit (INTF0); // ștergeți semnalul de întrerupere INT0 Serial.begin (9600); } void loop () {attachInterrupt (0, isr, RISING); // activați întreruperea externă (INT0) întârziere (1000); detachInterrupt (0); freq = get_freq (); volt = ADC_value * 0,33; String buf; buf + = String (frecv, 3); buf + = F ("Hz / t"); buf + = String (volt); buf + = F ("Volți"); Serial.println (buf); }

Pasul 6: Concluzie

Concluzie
Concluzie
Concluzie
Concluzie

Puteți asambla circuitul într-o placă de calcul și puteți modifica codul și puteți adăuga un card SD pentru a stoca datele, care pot fi ulterior analizate. Un astfel de exemplu este că puteți analiza tensiunea și frecvența la orele de vârf.

Circuitul pe care l-am asamblat în panou a folosit LM324 (quad opamp) în loc de LM358 (dual opamp) deoarece nu aveam acel IC în acel moment și blocarea la nivel național din cauza pandemiei COVID-19 mi-a făcut dificil să obțin un nou IC. Cu toate acestea, nu ar afecta funcționarea circuitului.

Nu ezitați să comentați mai jos pentru orice sugestii și întrebări.

Recomandat: