Sommario:
- Passaggio 1: componenti necessari
- Passaggio 2: diagramma schematico
- Passaggio 3: comprendere il circuito
- Passaggio 4: calcolo della frequenza e della tensione
- Passaggio 5: codice Arduino
- Passaggio 6: conclusione
Video: Misurazione della frequenza e della tensione dell'alimentatore con Arduino: 6 passaggi
2024 Autore: John Day | [email protected]. Ultima modifica: 2024-01-30 10:00
Introduzione:
L'obiettivo di questo progetto è misurare la frequenza e la tensione di alimentazione, che qui in India è compresa tra 220 e 240 Volt e 50 Hz. Ho usato un Arduino per catturare il segnale e calcolare frequenza e tensione, puoi usare qualsiasi altro microcontrollore o scheda che hai. Il circuito richiede una manciata di componenti ed è abbastanza accurato per tutti gli scopi pratici.
Passaggio 1: componenti necessari
- Arduino Uno
- CI LM358
- Trasformatore step-down (da 220V a 12V)
-
Condensatori:
- 0.1uF
- 2 x 1uF
-
resistori:
- 3 x 1kOhm
- 2 x 100 kOhm
- 1.5kOhm
- 3.3kOhm
- 6.8kOhm
- 3 x 1N4148 diodo
- Bread Board e Jumper wire (opzionale)
Passaggio 2: diagramma schematico
Nel circuito sopra, il primario del trasformatore è collegato alla rete di alimentazione e il primario è collegato al nostro circuito di misura
Passaggio 3: comprendere il circuito
In base alla funzionalità, questo circuito può essere suddiviso in quattro parti:
A: Il circuito Zero Crossing Detector
Questo circuito genera un impulso quadrato di 5V ogni volta che l'onda sinusoidale passa da positiva a negativa. Il resistore R1 combinato con D1 e D2 limita l'oscillazione della tensione di ingresso alla giunzione del diodo da -0,6 V a +5,6 V (supponendo che la tensione diretta del diodo sia 0,6 V). Inoltre, è possibile aumentare il range di tensione in ingresso del circuito aumentando il valore di R1.
Il resistore R2 e R3 formano un partitore di tensione per limitare l'oscillazione della tensione negativa a -0,24 Volt poiché la tensione di ingresso di modo comune di LM358 è limitata a -0,3 Volt.
Il resistore R4, R5, il condensatore C1 e l'amplificatore operazionale (qui usato come comparatore) formano il circuito Schmitt Trigger in cui i resistori R4 e R5 impostano l'isteresi all'ingresso +49,5 mV sopra terra. L'uscita dello Schmitt Trigger viene inviata al PIN2 di Arduino per ulteriori elaborazioni.
B: Isolamento e riduzione della tensione
Come suggerisce il nome, questa parte isola e riduce la tensione a circa 12 Vrms. La tensione ridotta viene ulteriormente alimentata al circuito della strumentazione.
C: Circuito rilevatore di picco
Questo circuito determina la tensione di picco massima del segnale di ingresso. I divisori resistivi R6 e R7 riducono la tensione di ingresso di un fattore di 0,23 (12 Vrms si riducono a 2,76 Vrms). Il diodo D3 conduce solo il semiciclo positivo del segnale. La tensione su C2 aumenta fino al valore di picco del segnale raddrizzato, che viene alimentato al pin analogico A0 di Arduino per calcolare ulteriormente la tensione.
Inoltre, è possibile sostituire questo circuito con un circuito rilevatore di picco di precisione come quelli menzionati qui. Ma per i miei scopi dimostrativi, il circuito di cui sopra sarà sufficiente.
D: Arduino
In questa parte, l'Arduino cattura gli impulsi quadrati generati dal circuito Schmitt Trigger e legge la tensione analogica dal circuito del rilevatore di picco. I dati vengono ulteriormente elaborati per determinare il periodo di tempo (quindi la frequenza) dell'impulso quadrato (che è uguale al tempo di alimentazione CA) e la tensione dell'alimentazione.
Passaggio 4: calcolo della frequenza e della tensione
Calcolo della frequenza:
Con l'aiuto di Arduino, possiamo misurare il periodo di tempo T del segnale. Gli impulsi ad onda quadra dal rilevatore di zero-crossing sono inviati al pin 2, da lì possiamo misurare il periodo di tempo di ciascun impulso. Possiamo usare il timer interno di Arduino (in particolare Timer1) per calcolare il periodo di tempo tra due fronti di salita dell'impulso quadrato con l'aiuto degli interrupt. Il timer aumenta di 1 per ciclo di clock (senza prescaler = 1) e il valore viene memorizzato nel registro TCNT1. Quindi il clock a 16Mhz incrementa il contatore di 16 ogni microsecondo. Allo stesso modo per prescaler = 8 il timer viene incrementato di 2 ogni microsecondo. Da qui il periodo di tempo tra due fronti di salita
T = (valore TCNT1) / tempo impiegato per ogni conteggio
Dove, tempo impiegato per ogni conteggio = prescaler / (velocità di clock Arduino (16MHz)
Quindi, frequenza f = 1/T = (velocità di clock Arduino (16 MHz) / (valore Prescaler * TCNT!)
Quindi la velocità del timer (Hz) è data da = (velocità di clock Arduino (16MHz)) / prescaler
e la frequenza del segnale è data da = (velocità di clock Arduino
Corrispondentemente, possiamo calcolare la frequenza f dalla relazione f = 1/T.
Calcolo della tensione:
L'ADC integrato di Arduino ha una risoluzione di 10 bit (possibili valori = 2^10 = 1024), restituendo valori nell'intervallo 0-1023. Per calcolare la tensione analogica corrispondente V dobbiamo usare la seguente relazione
V = (lettura ADC) * 5/1023
Per calcolare la tensione di alimentazione Vs(rms) dobbiamo tenere in considerazione il Transformer Ratio, il Resistor divisore R6R7 e il circuito del rivelatore di picco. Possiamo semplicemente mettere insieme i vari fattori/rapporto come:
Rapporto trasformatore = 12/230 = 0,052
Divisore resistore = R7/(R6 + R7) = 0.23
Al circuito del rivelatore di picco = 1.414
Vs(rms) = V/(1.414*0.052*0.23) = (lettura ADC) * 0.289
Va notato che questo valore è lontano dal valore effettivo, principalmente a causa dell'errore nel rapporto effettivo del trasformatore e della caduta di tensione diretta del diodo. Un modo per aggirare questo problema è determinare il fattore dopo aver assemblato il circuito. Cioè misurando separatamente la tensione di alimentazione e la tensione ai capi del condensatore C2 con un multimetro, quindi calcolando Vs(rms) come segue:
Vs(rms) = ((Tensione di alimentazione * 5)/(Tensione attraverso C2 *1023))*(Lettura ADC)
nel mio caso, Vs(rms) = 0,33*(lettura ADC)
Passaggio 5: codice Arduino
#define volt_in A0 //pin lettura tensione analogica
volatile uint16_t t_period; uint16_t ADC_value = 0; galleggiante volt, freq; void isr() { t_period = TCNT1; //memorizza il valore TCNT1 in t_period TCNT1 = 0; //reset Timer1 ADC_value = analogRead(volt_in); //leggi la tensione analogica } float get_freq() { uint16_t timer = t_period; if(timer==0) return 0; // per evitare la divisione per zero altrimenti restituisce 16000000.0/(8UL*timer); // la frequenza è data da f = clk_freq/(prescaler*timeperiod)} void setup() { TCCR1A = 0; TCCR1B = bit(CS11); //imposta il prescaler a 8 TCNT1 = 0; //reimposta valore Timer1 TIMSK1 = bit(TOIE1); //abilita l'interrupt di overflow Timer1 EIFR |= bit(INTF0); // cancella il flag di interruzione INT0 Serial.begin(9600); } void loop() { attachInterrupt(0, isr, RISING); //abilita l'interrupt esterno (INT0) delay(1000); staccaInterrupt(0); freq = get_freq(); volt = valore_ADC*0.33; Stringa bu; buf += String(freq, 3); buf += F("Hz\t"); buf += Stringa (volt); buf += F("Volt"); Serial.println(buf); }
Passaggio 6: conclusione
Puoi assemblare il circuito in una breadboard e modificare il codice e aggiungere una scheda SD per memorizzare i dati, che possono essere successivamente analizzati. Un esempio è che puoi analizzare la tensione e la frequenza nelle ore di punta.
Il circuito che ho assemblato nella breadboard utilizzava LM324 (quad opamp) invece di LM358 (doppio opamp) poiché non avevo quell'IC in quel momento e il blocco nazionale a causa della pandemia di COVID-19 mi ha reso difficile ottenere un nuovo IC. Tuttavia, non influenzerebbe il funzionamento del circuito.
Sentiti libero di commentare qui sotto per qualsiasi suggerimento e domanda.
Consigliato:
Convertitore di tensione buck in modalità interruttore di riduzione della tensione CC - CC (LM2576/LM2596): 4 passaggi
Convertitore di tensione buck in modalità interruttore di riduzione della tensione CC - CC (LM2576/LM2596): Realizzare un convertitore buck altamente efficiente è un lavoro difficile e anche gli ingegneri esperti richiedono più progetti per arrivare a quello giusto. Un convertitore buck (convertitore step-down) è un convertitore di alimentazione CC-CC, che riduce la tensione (mentre aumenta
Misurazione della tensione CC con Arduino: 5 passaggi
Misurazione della tensione CC utilizzando Arduino: in questo progetto ti mostrerò come misurare la tensione CC fino a 50 V utilizzando arduino e il display sul modulo display OLED richiede arduino UNOoled display resistore da 10 k ohm cavo jumper resistore da 1 k ohm
Alimentatore CC a tensione regolabile utilizzando il regolatore di tensione LM317: 10 passaggi
Alimentatore CC a tensione regolabile utilizzando il regolatore di tensione LM317: In questo progetto, ho progettato un semplice alimentatore CC a tensione regolabile utilizzando l'IC LM317 con uno schema elettrico dell'alimentatore LM317. Poiché questo circuito ha un raddrizzatore a ponte integrato, possiamo collegare direttamente l'alimentazione a 220 V/110 V CA all'ingresso
Misurazione della tensione con Arduino: 5 passaggi
Misurazione della tensione utilizzando Arduino: la misurazione della tensione è abbastanza semplice utilizzando qualsiasi microcontrollore rispetto alla misurazione della corrente. La misurazione delle tensioni diventa necessaria se si lavora con le batterie o se si desidera creare il proprio alimentatore regolabile. Anche se questo metodo si applica
Misurazione della tensione CC con Arduino e Node-RED: 8 passaggi (con immagini)
Misurazione della tensione CC con Arduino e Node-RED: ci sono molti tutorial sulla misurazione della tensione CC con Arduino, in questo caso ho trovato un tutorial che considero il miglior metodo funzionale per misurare la CC senza richiedere valori di resistenza in ingresso, richiede solo una certa resistenza e un multimetro