Turinys:

Maitinimo dažnio ir įtampos matavimas naudojant „Arduino“: 6 žingsniai
Maitinimo dažnio ir įtampos matavimas naudojant „Arduino“: 6 žingsniai

Video: Maitinimo dažnio ir įtampos matavimas naudojant „Arduino“: 6 žingsniai

Video: Maitinimo dažnio ir įtampos matavimas naudojant „Arduino“: 6 žingsniai
Video: Amazing $45 True RMS Digital Multimeter KAIWEET KM601 (10% discount coupon) 2024, Liepa
Anonim
Maitinimo dažnio ir įtampos matavimas naudojant „Arduino“
Maitinimo dažnio ir įtampos matavimas naudojant „Arduino“

Įvadas:

Šio projekto tikslas yra išmatuoti tiekimo dažnį ir įtampą, kuri yra Indijoje nuo 220 iki 240 voltų ir 50 Hz. Aš naudoju „Arduino“signalui fiksuoti ir dažniui bei įtampai apskaičiuoti, galite naudoti bet kurį kitą turimą mikrovaldiklį ar plokštę. Grandinei reikalingi keli komponentai ir ji yra gana tiksli visiems praktiniams tikslams.

1 žingsnis: reikalingi komponentai

  • Arduino Uno
  • IC LM358
  • Sumažinkite transformatorių (nuo 220V iki 12V)
  • Kondensatoriai:

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

    • 3 x 1 kOhm
    • 2 x 100 kOhm
    • 1,5 kOhm
    • 3,3 kOhm
    • 6,8 kOhm
  • 3 x 1N4148 diodas
  • Duonos lenta ir trumpiklis (pasirinktinai)

2 žingsnis: schema

Schema
Schema
Schema
Schema

Aukščiau esančioje grandinėje transformatoriaus pirminis yra prijungtas prie maitinimo tinklo, o pirminis - prie mūsų matavimo grandinės

3 žingsnis: Supraskite grandinę

Grandinės supratimas
Grandinės supratimas
Grandinės supratimas
Grandinės supratimas
Grandinės supratimas
Grandinės supratimas

Pagal funkcionalumą šią grandinę galima suskirstyti į keturias dalis:

A: Nulinio kirtimo detektoriaus grandinė

Ši grandinė generuoja 5 V kvadratinį impulsą, kai sinusinė banga pereina iš teigiamos į neigiamą. Rezistorius R1 kartu su D1 ir D2 riboja įėjimo įtampos svyravimus diodų sandūroje iki -0,6 V iki +5,6 V (darant prielaidą, kad diodo priekinė įtampa yra 0,6 V). Be to, galite padidinti grandinės įėjimo įtampos diapazoną, padidindami R1 vertę.

Rezistorius R2 ir R3 sudaro įtampos daliklį, kad neigiamas įtampos svyravimas būtų apribotas iki -0,24 volto, nes LM358 įėjimo bendrojo režimo įtampa yra apribota iki -0,3 voltų.

Rezistorius R4, R5, kondensatorius C1 ir op-amp (čia naudojamas kaip palyginimas) sudaro „Schmitt Trigger“grandinę, kurioje rezistorius R4 ir R5 nustato histerezę esant įėjimui +49,5 mV virš žemės. „Schmitt Trigger“išvestis tiekiama į „Arduino PIN2“tolimesniam apdorojimui.

B: Izoliacija ir įtampa sumažėja

Kaip rodo pavadinimas, ši dalis izoliuoja ir sumažina įtampą iki maždaug 12Vrms. Sumažinta įtampa toliau tiekiama į prietaisų grandinę.

C: Piko detektoriaus grandinė

Ši grandinė nustato didžiausią įėjimo signalo maksimalią įtampą. Rezistoriaus daliklis R6 ir R7 sumažina įėjimo įtampą 0,23 karto (12Vrms sumažėja iki 2,76Vrms). Diodas D3 atlieka tik teigiamą pusės signalo ciklą. C2 įtampa padidėja iki didžiausios ištaisyto signalo vertės, kuri tiekiama į „Arduino“analoginį kaištį A0, kad būtų galima toliau apskaičiuoti įtampą.

Be to, šią grandinę galite pakeisti tikslia piko detektoriaus grandine, kaip čia paminėta. Tačiau mano demonstravimo tikslais pakaks aukščiau pateiktos grandinės.

D: Arduino

Šioje dalyje „Arduino“fiksuoja kvadratinius impulsus, kuriuos sukuria „Schmitt Trigger“grandinė, ir skaito analoginę įtampą iš smailiaus detektoriaus grandinės. Duomenys toliau apdorojami, siekiant nustatyti kvadratinio impulso (kuris yra lygus kintamosios srovės tiekimo laiko asmeniui) laikotarpį ir (taigi, dažnį) ir maitinimo įtampą.

4 žingsnis: dažnio ir įtampos apskaičiavimas

Dažnio apskaičiavimas:

Arduino pagalba galime išmatuoti signalo T laikotarpį. Kvadratinių bangų impulsai iš nulio kirtimo detektoriaus tiekiami į 2 kaištį, iš ten galime išmatuoti kiekvieno impulso laikotarpį. Mes galime naudoti vidinį „Arduino“laikmatį (ypač „Timer1“), kad būtų galima apskaičiuoti laikotarpį tarp dviejų kylančių kvadratinio impulso kraštų, naudojant pertraukas. Laikmatis padidėja 1 per laikrodžio ciklą (be išankstinio skaliklio = 1) ir vertė išsaugoma TCNT1 registre. Taigi 16 MHz dažnis padidina skaitiklį 16 mikrosekundžių. Panašiai, kai prescaler = 8, laikmatis padidinamas 2 kas mikrosekundę. Taigi laikas tarp dviejų kylančių kraštų

T = (TCNT1 vertė) / laikas, reikalingas kiekvienam skaičiavimui

Kur, kiekvieno skaičiavimo laikas = prescaler / („Arduino“laikrodžio greitis (16 MHz)

Taigi dažnis f = 1 / T = („Arduino“laikrodžio greitis (16 MHz) / (prescaler * TCNT! Vertė)

Taigi laikmačio greitis (Hz) pateikiamas = („Arduino“laikrodžio greitis (16 MHz)) / prescaler

o signalo dažnis nurodomas = („Arduino“laikrodžio greitis

Atitinkamai dažnį f galime apskaičiuoti iš santykio f = 1/T.

Įtampos apskaičiavimas:

„Arduino“borto ADC skiriamoji geba yra 10 bitų (galimos vertės = 2^10 = 1024), o vertės grąžinamos nuo 0 iki 1023. Norėdami apskaičiuoti atitinkamą analoginę įtampą V, turime naudoti šį ryšį

V = (ADC skaitymas) * 5/1023

Norėdami apskaičiuoti maitinimo įtampą Vs (rms), turime atsižvelgti į transformatoriaus santykį, rezistoriaus daliklį R6R7 ir smailės detektoriaus grandinę. Mes galime tiesiog sudėti įvairius veiksnius/santykį taip:

Transformatoriaus santykis = 12/230 = 0,052

Rezistoriaus daliklis = R7/(R6 + R7) = 0,23

Piko detektoriaus grandinėje = 1.414

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

Reikėtų pažymėti, kad ši vertė yra toli nuo faktinės vertės, daugiausia dėl faktinio transformatoriaus santykio klaidos ir diodo priekinės įtampos kritimo. Vienas iš būdų tai apeiti yra veiksnio nustatymas surinkus grandinę. Tai yra, matuojant maitinimo įtampą ir įtampą per kondensatorių C2 atskirai multimetru, tada apskaičiuojant Vs (rms) taip:

Vs (rms) = ((maitinimo įtampa *5)/(įtampa per C2 *1023)) *(ADC rodmuo)

mano atveju, Vs (rms) = 0,33*(ADC skaitymas)

5 žingsnis: „Arduino“kodas

#define volt_in A0 // analoginės įtampos skaitymo kaištis

nepastovus uint16_t t_period; uint16_t ADC_value = 0; plūdinis voltas, dažnis; void isr () {t_period = TCNT1; // saugoti TCNT1 reikšmę t_periode TCNT1 = 0; // iš naujo nustatyti laikmatį1 ADC_value = analogRead (volt_in); // skaityti analoginę įtampą} float get_freq () {uint16_t timer = t_period; if (laikmatis == 0) grąžina 0; // kad būtų išvengta padalijimo iš nulio, grąžinkite 16000000.0/(8UL*laikmatis); // dažnį nurodo f = clk_freq/(prescaler*timeperiod)} void setup () {TCCR1A = 0; TCCR1B = bitas (CS11); // nustatyti prescaler į 8 TCNT1 = 0; // atstatyti Timer1 reikšmę TIMSK1 = bit (TOIE1); // įjungti Timer1 overflow interrupt EIFR | = bit (INTF0); // išvalyti INT0 pertraukimo vėliavą Serial.begin (9600); } void loop () {attachInterrupt (0, isr, RISING); // įjungti išorinio pertraukimo (INT0) uždelsimą (1000); detachInterrupt (0); dažnumas = get_freq (); voltas = ADC_value*0,33; Styginių buf; buf += Styga (dažnis, 3); buf += F ("Hz / t"); buf += Styga (voltas); buf += F („voltai“); Serial.println (buf); }

6 žingsnis: Išvada

Išvada
Išvada
Išvada
Išvada

Galite surinkti grandinę į duonos lentą ir pataisyti kodą bei pridėti SD kortelę duomenims saugoti, kuriuos vėliau bus galima analizuoti. Vienas iš tokių pavyzdžių - galite analizuoti įtampą ir dažnį piko valandomis.

Grandinėje, kurią surinkau duonos lentoje, buvo naudojamas LM324 (keturių opampų), o ne LM358 (dvigubas opampas), nes tuo metu neturėjau to IC ir dėl užrakinimo visoje šalyje dėl COVID-19 pandemijos man buvo sunku gauti naują IC. Nepaisant to, tai neturės įtakos grandinės veikimui.

Nesivaržykite komentuoti žemiau dėl bet kokių pasiūlymų ir klausimų.

Rekomenduojamas: