Përmbajtje:
2025 Autor: John Day | [email protected]. E modifikuara e fundit: 2025-01-13 06:58
Prezantimi:
Qëllimi i këtij projekti është të matë frekuencën dhe tensionin e furnizimit, i cili është midis 220 deri 240 Volt dhe 50Hz këtu në Indi. Kam përdorur një Arduino për kapjen e sinjalit dhe llogaritjen e frekuencës dhe tensionit, ju mund të përdorni çdo mikrokontrollues ose bord tjetër që keni. Qarku kërkon një pjesë të vogël të përbërësve dhe është mjaft i saktë për të gjitha qëllimet praktike.
Hapi 1: Përbërësit e kërkuar
- Arduino Uno
- IC LM358
- Transformatori poshtë (220V në 12V)
-
Kondensatorët:
- 0.1uF
- 2 x 1uF
-
Rezistentët:
- 3 x 1kOhm
- 2 x 100kOhm
- 1.5kOhm
- 3.3kOhm
- 6.8kOhm
- 3 x 1N4148 diodë
- Bordi i Bukës dhe tela Jumper (opsionale)
Hapi 2: Diagrami Skematik
Në qarkun e mësipërm, transformatori kryesor është i lidhur me rrjetin e furnizimit dhe primari është i lidhur me qarkun tonë matës
Hapi 3: Kuptimi i Qarkut
Sipas funksionalitetit, ky qark mund të ndahet në katër pjesë:
Përgjigje: Qarku i Detektorit Zero të Kryqëzimit
Ky qark gjeneron një impuls katror 5V sa herë që vala e sinusit kalon nga pozitive në negative. Rezistori R1 i kombinuar me D1 dhe D2 kufizon lëvizjen e tensionit të hyrjes në kryqëzimin e diodës në -0.6V në +5.6V (duke supozuar se tensioni i diodës përpara është 0.6V). Për më tepër, ju mund të rrisni gamën e tensionit hyrës të qarkut duke rritur vlerën e R1.
Rezistenca R2 dhe R3 formojnë një ndarës të tensionit për të kufizuar lëvizjen e tensionit negativ në -0.24Volt pasi tensioni i zakonshëm i hyrjes i LM358 është i kufizuar në -0.3Volt.
Rezistenca R4, R5, kondensatori C1 dhe op-amp (këtu përdoret si krahasues) formojnë qarkun Schmitt Trigger ku rezistori R4 dhe R5 vendosin histerezën në hyrje +49.5mV mbi tokë. Prodhimi i Schmitt Trigger i jepet Arduino PIN2 për përpunim të mëtejshëm.
B: Izolimi dhe Tensioni Hapi poshtë
Siç sugjeron emri, kjo pjesë izolon dhe ul tensionin në afërsisht 12Vrms. Tensioni i zvogëluar ushqehet më tej në qarkun e instrumenteve.
C: Qarku i detektorit të pikut
Ky qark përcakton tensionin maksimal të pikut të sinjalit hyrës. Ndarësi i rezistencës R6 dhe R7 zvogëlojnë tensionin e hyrjes me një faktor prej 0.23 (12Vrms zvogëlohet në 2.76Vrms). Dioda D3 kryen vetëm gjysmën e ciklit pozitiv të sinjalit. Tensioni në C2 rritet deri në vlerën kulmore të sinjalit të korrigjuar, i cili ushqehet me pinin A0 analog Arduino për të llogaritur më tej tensionin.
Përveç kësaj, ju mund ta zëvendësoni këtë qark me një qark të detektorit të pikut të saktë, si këto të përmendura këtu. Por për qëllimet e mia demonstruese, qarku i mësipërm do të jetë i mjaftueshëm.
D: Arduino
Në këtë pjesë, Arduino kap impulset katrore të krijuara nga qarku Schmitt Trigger dhe lexon tensionin analog nga qarku i detektorit të pikut. Të dhënat përpunohen më tej për të përcaktuar periudhën kohore (pra frekuencën) e pulsit katror (i cili është i barabartë me personin e kohës së furnizimit me ac) dhe tensionin e furnizimit.
Hapi 4: Llogaritja e Frekuencës dhe Tensionit
Llogaritja e frekuencës:
Me ndihmën e Arduino, ne mund të masim periudhën kohore T të sinjalit. Impulset e valës katrore nga detektori i kalimit zero ushqehen në pin 2, prej aty mund të masim periudhën kohore të secilit impuls. Ne mund të përdorim kohëmatësin e brendshëm të Arduino (veçanërisht Timer1) për të llogaritur periudhën kohore midis dy skajeve në rritje të pulsit katror me ndihmën e ndërprerjeve. Kohëmatësi rritet me 1 për ciklin e orës (pa prescaler = 1) dhe vlera ruhet në regjistrin TCNT1. Prandaj ora 16Mhz e rrit numëruesin me 16 çdo mikrosekondë. Në mënyrë të ngjashme për prescaler = 8 kohëmatësi rritet me 2 çdo mikrosekondë. Prandaj periudha kohore midis dy skajeve në rritje
T = (vlera TCNT1) / koha e marrë për çdo numërim
Ku, koha e marrë për çdo numërim = prescaler / (shpejtësia e orës Arduino (16MHz)
Prandaj, frekuenca f = 1 / T = (shpejtësia e orës Arduino (16MHz) / (Prescaler * TCNT! Vlera)
Prandaj shpejtësia e kohëmatësit (Hz) jepet nga = (shpejtësia e orës Arduino (16MHz)) / parashkruesi
dhe frekuenca e sinjalit jepet me = (shpejtësia e orës Arduino
Në mënyrë korresponduese, ne mund të llogarisim frekuencën f nga relacioni f = 1/T.
Llogaritja e tensionit:
ADC në bord i Arduino ka një rezolutë prej 10 bitësh (vlera të mundshme = 2^10 = 1024), duke i kthyer vlerat në intervalin 0-1023. Për të llogaritur tensionin përkatës analog V ne duhet të përdorim relacionin e mëposhtëm
V = (Leximi ADC) * 5/1023
Për të llogaritur tensionin e furnizimit Vs (rms) duhet të kemi parasysh Raportin e Transformatorit, ndarësin e Rezistorit R6R7 dhe qarkun e detektorit të pikut. Ne thjesht mund t'i bashkojmë faktorët/raportet e ndryshme si:
Raporti i transformatorit = 12/230 = 0.052
Ndarësi i rezistencës = R7/(R6 + R7) = 0.23
Në pikun e detektorit qark = 1.414
Vs (rms) = V/(1.414*0.052*0.23) = (Leximi ADC)*0.289
Duhet të theksohet se kjo vlerë është larg vlerës aktuale, kryesisht për shkak të gabimit në raportin aktual të transformatorit dhe rënies së tensionit të diodës përpara. Një mënyrë për ta anashkaluar këtë është përcaktimi i faktorit pas montimit të qarkut. Kjo është duke matur tensionin e furnizimit dhe tensionin në kondensatorin C2 veç e veç me një multimetër, pastaj duke llogaritur Vs (rms) si më poshtë:
Vs (rms) = ((Tensioni i Furnizimit *5)/(Tensioni në C2 *1023)) *(Leximi ADC)
në rastin tim, Vs (rms) = 0.33*(Leximi ADC)
Hapi 5: Kodi Arduino
#përcaktoni volt_in A0 // kunja e leximit të tensionit analog
e paqëndrueshme uint16_t t_periodë; uint16_t ADC_vlera = 0; noton volt, frekuencë; void isr () {t_periodë = TCNT1; // ruani vlerën e TCNT1 në t_periodën TCNT1 = 0; // rivendos Timer1 ADC_value = analogRead (volt_in); // lexo tension analog} float get_freq () {timer uint16_t = t_periodë; nëse (kohëmatësi == 0) kthehet 0; // për të shmangur ndarjen me zero tjetër kthim 16000000.0/(kohëmatës 8UL*); // frekuenca jepet nga f = clk_freq/(prescaler*timeperiod)} void setup () {TCCR1A = 0; TCCR1B = bit (CS11); // vendos preskalerin në 8 TCNT1 = 0; // rivendos vlerën e Kohëmatësit1 TIMSK1 = bit (TOIE1); // aktivizoni ndërprerjen e tejmbushjes së Timer1 EIFR | = bit (INTF0); // pastroni flamurin e ndërprerjes INT0 Serial.begin (9600); } void loop () {attachInterrupt (0, isr, RISING); // aktivizoni vonesën e ndërprerjes së jashtme (INT0) (1000); detachInterrupt (0); freq = merrni_freq (); volt = ADC_vlera*0.33; Buzë me tela; buf += String (freq, 3); buf += F ("Hz / t"); buf += String (volt); buf += F ("Volt"); Serial.println (buf); }
Hapi 6: Përfundimi
Ju mund të mblidhni qarkun në një pjatë dhe të ndryshoni kodin dhe të shtoni një Kartë SD për të ruajtur të dhënat, të cilat më vonë mund të analizohen. Një shembull i tillë është, ju mund të analizoni tensionin dhe frekuencën në orët e pikut.
Qarku që mblodha në pjatën e bukës përdori LM324 (kuadrat opamp) në vend të LM358 (opamp të dyfishtë) pasi nuk e kisha atë IC në atë moment dhe bllokimi mbarëkombëtar për shkak të pandemisë COVID-19 e bëri të vështirë për mua të merrja një IC të ri Me Sidoqoftë, nuk do të ndikojë në funksionimin e qarkut.
Mos ngurroni të komentoni më poshtë për çdo sugjerim dhe pyetje.