Sommario:

Misurazione della frequenza e della tensione dell'alimentatore con Arduino: 6 passaggi
Misurazione della frequenza e della tensione dell'alimentatore con Arduino: 6 passaggi

Video: Misurazione della frequenza e della tensione dell'alimentatore con Arduino: 6 passaggi

Video: Misurazione della frequenza e della tensione dell'alimentatore con Arduino: 6 passaggi
Video: Tutorial Arduino ITA 28: sleep mode e risveglio tramite gli interrupt 2024, Novembre
Anonim
Misurazione della frequenza e della tensione dell'alimentatore con Arduino
Misurazione della frequenza e della tensione dell'alimentatore con Arduino

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

Diagramma schematico
Diagramma schematico
Diagramma schematico
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

Capire il circuito
Capire il circuito
Capire il circuito
Capire il circuito
Capire il circuito
Capire 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

Conclusione
Conclusione
Conclusione
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: