Inhoudsopgave:
- Stap 1: Vereiste componenten
- Stap 2: Schematisch diagram
- Stap 3: Het circuit begrijpen
- Stap 4: Berekening van frequentie en spanning
- Stap 5: Arduino-code
- Stap 6: Conclusie
Video: Voedingsfrequentie en spanningsmeting met Arduino - Ajarnpa
2024 Auteur: John Day | [email protected]. Laatst gewijzigd: 2024-01-30 11:15
Invoering:
Het doel van dit project is het meten van de voedingsfrequentie en -spanning, die hier in India tussen 220 en 240 Volt en 50Hz ligt. Ik heb een Arduino gebruikt voor het vastleggen van signalen en het berekenen van frequentie en spanning, je kunt elke andere microcontroller of bord gebruiken die je hebt. Het circuit vereist een handvol componenten en is redelijk nauwkeurig voor alle praktische doeleinden.
Stap 1: Vereiste componenten
- Arduino Uno
- IC LM358
- Step-down transformator (220V tot 12V)
-
condensatoren:
- 0.1uF
- 2 x 1uF
-
Weerstanden:
- 3 x 1kOhm
- 2 x 100kOhm
- 1.5kOhm
- 3,3kOhm
- 6,8kOhm
- 3 x 1N4148-diode
- Broodplank en verbindingsdraad (optioneel)
Stap 2: Schematisch diagram
In het bovenstaande circuit is de primaire transformator aangesloten op het voedingsnet en de primaire is aangesloten op ons meetcircuit
Stap 3: Het circuit begrijpen
Volgens de functionaliteit kan dit circuit in vier delen worden verdeeld:
A: Het circuit van de nuldoorgangsdetectie
Dit circuit genereert een 5V-blokpuls wanneer de sinusgolf van positief naar negatief gaat. Weerstand R1 in combinatie met D1 en D2 beperkt de ingangsspanningszwaai bij de diodejunctie tot -0,6V tot +5,6V (ervan uitgaande dat de diodedoorlaatspanning 0,6V is). Bovendien kunt u het ingangsspanningsbereik van het circuit vergroten door de waarde van R1 te verhogen.
De weerstand R2 en R3 vormen een spanningsdeler om de negatieve spanningszwaai te beperken tot -0,24 Volt, aangezien de common-mode ingangsspanning van LM358 beperkt is tot -0,3 Volt.
De weerstand R4, R5, condensator C1 en de op-amp (hier gebruikt als een comparator) vormen het Schmitt-triggercircuit waar de weerstand R4 en R5 de hysterese instellen op ingang +49.5mV boven de grond. De output van de Schmitt Trigger wordt naar de Arduino PIN2 gestuurd voor verdere verwerking.
B: Isolatie en spanning omlaag
Zoals de naam al doet vermoeden, isoleert dit onderdeel en verlaagt het de spanning tot ongeveer 12Vrms. De verlaagde spanning wordt verder naar het instrumentatiecircuit gevoerd.
C: Piekdetectorcircuit
Deze schakeling bepaalt de maximale piekspanning van het ingangssignaal. Weerstandsdeler R6 en R7 verlagen de ingangsspanning met een factor 0,23 (12Vrms wordt teruggebracht tot 2,76Vrms). De diode D3 geleidt alleen de positieve halve cyclus van het signaal. De spanning over C2 neemt toe tot de piekwaarde van het gelijkgerichte signaal, dat naar Arduino analoge pin A0 wordt gevoerd om de spanning verder te berekenen.
Bovendien kunt u dit circuit vervangen door een precisiepiekdetectorcircuit zoals hier genoemd. Maar voor mijn demonstratiedoeleinden is het bovenstaande circuit voldoende.
D: Arduino
In dit deel vangt de Arduino de vierkante pulsen op die worden gegenereerd door het Schmitt-triggercircuit en leest het de analoge spanning van het piekdetectorcircuit. De gegevens worden verder verwerkt om de tijdsperiode (vandaar de frequentie) van de vierkante puls (die gelijk is aan de ac-leveringstijdpersoon) en de spanning van de voeding te bepalen.
Stap 4: Berekening van frequentie en spanning
Berekening van de frequentie:
Met behulp van Arduino kunnen we de tijdsperiode T van het signaal meten. De blokgolfpulsen van de nuldoorgangsdetector worden naar pin 2 gevoerd, van daaruit kunnen we de tijdsperiode van elke puls meten. We kunnen de interne timer van Arduino (met name Timer1) gebruiken om de tijdsperiode tussen twee stijgende flanken van de vierkante puls te berekenen met behulp van interrupts. De timer wordt met 1 verhoogd per klokcyclus (zonder prescaler = 1) en de waarde wordt opgeslagen in register TCNT1. Vandaar dat de 16Mhz-klok de teller elke microseconde met 16 verhoogt. Evenzo wordt voor prescaler = 8 de timer elke microseconde met 2 verhoogd. Vandaar de tijdsperiode tussen twee stijgende flanken
T = (TCNT1-waarde) / tijd nodig voor elke telling
Waar, tijd nodig voor elke telling = prescaler / (Arduino-kloksnelheid (16 MHz)
Vandaar, frequentie f = 1/T = (Arduino kloksnelheid (16MHz) / (Prescaler * TCNT! waarde)
Daarom wordt de timersnelheid (Hz) gegeven door = (Arduino-kloksnelheid (16 MHz)) / prescaler
en de frequentie van het signaal wordt gegeven door = (Arduino kloksnelheid
Dienovereenkomstig kunnen we frequentie f berekenen uit de relatie f = 1/T.
Berekening van spanning:
De ingebouwde ADC van Arduino heeft een resolutie van 10 bits (mogelijke waarden = 2 ^ 10 = 1024), waardoor waarden worden geretourneerd in het bereik van 0-1023. Om de overeenkomstige analoge spanning V te berekenen, moeten we de volgende relatie gebruiken:
V = (ADC-lezing) * 5/1023
Om de voedingsspanning Vs(rms) te berekenen, moeten we rekening houden met de transformatorverhouding, weerstandsdeler R6R7 en het piekdetectorcircuit. We kunnen de verschillende factoren/verhouding eenvoudig samenvoegen als:
Transformatorverhouding = 12/230 = 0,052
Weerstandsdeler = R7/(R6 + R7) = 0.23
Bij piekdetectorcircuit = 1.414
Vs(rms) = V/(1.414*0.052*0.23) = (ADC-waarde) * 0.289
Opgemerkt moet worden dat deze waarde ver verwijderd is van de werkelijke waarde, voornamelijk als gevolg van een fout in de werkelijke transformatorverhouding en de voorwaartse spanningsval van de diode. Een manier om dit te omzeilen is om de factor te bepalen na het samenstellen van de schakeling. Dat wil zeggen door de voedingsspanning en de spanning over de condensator C2 afzonderlijk te meten met een multimeter, en vervolgens Vs(rms) als volgt te berekenen:
Vs(rms) = ((Voedingsspanning * 5)/(Spanning over C2 *1023))*(ADC-aflezing)
in mijn geval Vs (rms) = 0,33 * (ADC-lezing)
Stap 5: Arduino-code
#define volt_in A0 // analoge spanning lees pin
vluchtige uint16_t t_period; uint16_t ADC_waarde = 0; vlotter volt, freq; void isr() { t_periode = TCNT1; // bewaar TCNT1-waarde in t_periode TCNT1 = 0; // reset Timer1 ADC_value = analogRead (volt_in); // lees analoge spanning} float get_freq () {uint16_t timer = t_period; if(timer==0) retourneer 0; // om deling door nul te voorkomen, retourneer anders 16000000.0/(8UL*timer); // frequentie wordt gegeven door f = clk_freq/(prescaler*timeperiod)} void setup() {TCCR1A = 0; TCCR1B = bit (CS11); // stel prescaler in op 8 TCNT1 = 0; // reset Timer1-waarde TIMSK1 = bit (TOIE1); // schakel Timer1 overlooponderbreking EIFR |= bit (INTF0) in; // wis de INT0-onderbrekingsvlag Serial.begin (9600); } void loop() { attachInterrupt(0, isr, RISING); // schakel externe interrupt (INT0) vertraging in (1000); detachInterrupt (0); freq = get_freq(); volt = ADC_waarde * 0,33; String-buf; buf += String (freq, 3); buf += F("Hz\t"); buf += String (volt); buf += F("Volt"); Serial.println(buf); }
Stap 6: Conclusie
Je kunt het circuit in een breadboard assembleren en de code aanpassen en een SD-kaart toevoegen om de gegevens op te slaan, die later kunnen worden geanalyseerd. Een voorbeeld hiervan is dat u de spanning en frequentie tijdens piekuren kunt analyseren.
Het circuit dat ik in het breadboard heb geassembleerd, gebruikte LM324 (quad opamp) in plaats van LM358 (dual opamp), omdat ik dat IC op dat moment niet had en de landelijke lockdown vanwege de COVID-19-pandemie het voor mij moeilijk maakte om een nieuwe IC te krijgen. Het zou echter geen invloed hebben op de werking van het circuit.
Voel je vrij om hieronder te reageren voor suggesties en vragen.
Aanbevolen:
Digitale klok met netwerktijd met behulp van de ESP8266: 4 stappen (met afbeeldingen)
Digitale netwerkklok met de ESP8266: we leren hoe we een schattige kleine digitale klok kunnen bouwen die communiceert met NTP-servers en de netwerk- of internettijd weergeeft. We gebruiken de WeMos D1 mini om verbinding te maken met een wifi-netwerk, de NTP-tijd te verkrijgen en deze weer te geven op een OLED-module. De video hierboven
DC-spanningsmeting met Arduino: 5 stappen
DC-spanningsmeting met Arduino: in dit project zal ik je laten zien hoe je DC-spanning tot 50v kunt meten met behulp van arduino en en weergave op OLED-displaymodule
DIY slimme weegschaal met wekker (met wifi, ESP8266, Arduino IDE en Adafruit.io): 10 stappen (met afbeeldingen)
DIY Slimme Weegschaal Met Wekker (met Wi-Fi, ESP8266, Arduino IDE en Adafruit.io): In mijn vorige project ontwikkelde ik een slimme weegschaal met Wi-Fi. Het kan het gewicht van de gebruiker meten, het lokaal weergeven en naar de cloud sturen. U kunt hier meer informatie over krijgen op onderstaande link: https://www.instructables.com/id/Wi-Fi-Smart-Scale-wi
Draadloze afstandsbediening met 2,4 GHz NRF24L01-module met Arduino - Nrf24l01 4-kanaals / 6-kanaals zenderontvanger voor quadcopter - RC Helikopter - RC-vliegtuig met Arduino: 5 stappen (met afbeeldingen)
Draadloze afstandsbediening met 2,4 GHz NRF24L01-module met Arduino | Nrf24l01 4-kanaals / 6-kanaals zenderontvanger voor quadcopter | RC Helikopter | Rc-vliegtuig met Arduino: een Rc-auto besturen | Quadcopter | Drone | RC vliegtuig | RC-boot, we hebben altijd een ontvanger en zender nodig, stel dat we voor RC QUADCOPTER een 6-kanaals zender en ontvanger nodig hebben en dat type TX en RX is te duur, dus we gaan er een maken op onze
Spanningsmeting met Arduino: 5 stappen
Spanningsmeting met Arduino: het meten van spanning is vrij eenvoudig met elke microcontroller in vergelijking met het meten van stroom. Het meten van spanningen wordt noodzakelijk als je met batterijen werkt of je eigen regelbare voeding wilt maken. Hoewel deze methode van toepassing is