Lettura di una tensione variabile in Arduino


8

Utilizzando un Arduino Nano e un trasformatore di corrente (CT), sto provando a percepire la corrente che scorre attraverso una linea di 120 V 60 Hz.

Circuito

Uscite CT 0-1 Vsecondo le sue specifiche. Questa uscita è distorta AREF/2= 2,5 V.

Inserisci qui la descrizione dell'immagine

analogRead Valori

L'asse x rappresenta il numero indice del campione ADC, mentre l'asse y rappresenta il valore ADC (0-1024). La frequenza di campionamento è di circa 9 kHz. La differenza picco-picco è di circa 1026 campioni.

Inserisci qui la descrizione dell'immagine

Questa forma d'onda è quella che ti aspetteresti dalla CT? Perché ci sono regioni in cui i valori sono piatti, anziché variare continuamente?

Inoltre, se osserviamo la parte curva della trama, perché Arduino legge alternativamente i valori sopra 512e sotto 512? Legge un valore sopra 512, quindi un valore sotto 512, quindi un valore sopra 512e così via.

Il tempo impiegato per un è analogReadstato misurato in 110 microsecondi per la mia configurazione e ci sono 1026 campioni tra i picchi della forma d'onda. Ciò significa che ci saranno circa 9 picchi in 1 secondo, anche se mi aspetterei 60 picchi poiché stiamo rilevando una linea a 60 Hz. Cosa ne ricava? C'è un condensatore, C1nel circuito, avrebbe qualcosa a che fare con questo?

Questi valori di analogRead sono adatti per essere utilizzati per calcolare la tensione RMS e quindi la corrente RMS che passa attraverso il filo rilevato? L'obiettivo finale di questo è calcolare il consumo di energia dopo aver determinato la corrente RMS che scorre attraverso il filo.

Schizzo utilizzato per ottenere valori per la trama

void setup() {
    Serial.begin(9600);
}

void loop() {
   double sensorValue = analogRead(1);
   Serial.println(sensorValue)
}

analogReadPunti dati effettivi nelle regioni di protuberanza

487
534
487
535
488
537
484
536
487
538
486
536
484
540
484
539
485
540
483
540
484
541
481
539
481
540
484
540
480
543
484
539
481
540
484
541
486
542
485
538
485
538
488
535
489
534
491
530
491
529
493
531
492
526
498
526
499
524
499
520
503
518
502
518
507

Grafico di valori analogici Leggi

I valori analogRead sono ora memorizzati in un buffer prima di essere trasmessi su seriale. Ora ci sono 55 punti dati ADC che compongono 1 periodo. Considerando che il tempo di lettura analogico è di 110 µs, ogni ciclo richiede 6,05 ms, dandoci una frequenza di 165 Hz! Cosa potrebbe essere andato storto?

Inserisci qui la descrizione dell'immagine

void loop() {
    double sensorValue = analogRead(1);
    char buf[32];

    dtostrf(sensorValue, 8, 2, buf);
    value = buf;

    if (stop == 0) {
        if (i < 10000) {
            message += ',';
            message += value;
            i++;
        }
        else {
            stop = 1;
            Serial.println(message);
        }
    }
}

Puoi pubblicare il tuo codice? Questo non sembra affatto giusto. Quando dici "Supponendo che passino 100ms", perché lo assumiamo?
Cybergibbons,

@Cybergibbons Inserito il codice utilizzato per generare valori per la trama. Mi dispiace, ho appena misurato il tempo impiegato per un analogRead()e ho trovato 110 microsecondi. Aggiornato la domanda.
Nyxynyx il

Qual è il carico che stai usando per la rete. Idealmente, vuoi qualcosa di abbastanza stabile come una lampadina a incandescenza. Se hai qualcosa di complesso come un alimentatore a commutazione per laptop che può avere un carico variabile, potresti aspettarti un risultato complesso.
Salix alba,

1
La maggior parte del tempo nel loop verrà impiegato per l'invio seriale a 9600 bps. Sposterai solo 960 caratteri / s, ovvero ogni lettura richiede 4ms.
Cybergibbons,

@Salixalba Il carico è un computer desktop con un alimentatore switching. Proverò a misurare un carico diverso, come un riscaldatore.
Nyxynyx,

Risposte:


5

Per quanto riguarda le tue misurazioni, ignorerei completamente il primo set con Serial.println () nel loop. Vorrei esporre i tempi di questo per essere inaffidabili.

La seconda serie di dati acquisiti in un buffer sembra corretta, ma la stima / tempistica della frequenza potrebbe essere errata. Vorrei invertire un'uscita digitale ad ogni iterazione di loop. È possibile misurare la frequenza di quella con un multimetro e la frequenza di campionamento ADC sarebbe il doppio di quel valore.

Per un alimentatore per PC o laptop questa è una forma d'onda di corrente abbastanza comune.

Senza un'efficace correzione del fattore di potenza, il segnale corrente mostrato di seguito sarebbe abbastanza tipico (fonte: http://www.nlvocables.com/blog/?p=300 )

http://www.nlvocables.com/blog/?p=300

Dovrai calcolare i valori RMS e sarebbe saggio filtrare il segnale.

Ecco un istruttore che ho scritto su come costruire e codificare un monitor di elettricità basato su Arduino Yun con supporto cloud / Temboo e Google Drive. Dovrebbe esserti di aiuto.


Grazie! Il CT che hai usato genera da -1 V a 1 V. Per utilizzare l'ADC a 10 bit, amplificherai l'uscita SCT di 2,5 usando un opamp? Oppure imposta l'AREF su 2 V e polarizza il segnale CT di 1
V

No, non l'ho amplificato o modificato l'Aref.
Akellyirl

Come hai potuto ottenere questo grafico? Con quale software?
Zgrknr,

0

se stai misurando un carico resistivo direi che il resistore di carico che hai scelto è sbagliato, ci sono alcuni CT economici su ebay (SCT-013-xxx) che hanno versioni con e senza i resistori di carico, questi funzionano bene per il loro prezzo ma devi leggere la scheda tecnica. SCT-013-000 richiede un resistore 20R per ottenere 1 V con un carico di 100A, se questo resistore è errato è possibile ottenere una forma d'onda gravemente distorta quando si misurano correnti più elevate (simili a quelle fornite), ci si aspetterebbe che il segnale distorcere maggiormente quanto più basso è il valore della resistenza di carico ma questo non è il caso dei CT.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.