Lesen einer variierenden Spannung in Arduino

8

Mit einem Arduino Nano und einem Stromwandler (CT) versuche ich, den Strom zu erfassen, der durch eine 120 V 60 Hz-Leitung fließt.

Schaltkreis

CT-Ausgänge 0-1 Vgemäß den Spezifikationen. Dieser Ausgang ist vorgespannt AREF/2= 2,5 V.

Geben Sie hier die Bildbeschreibung ein

analogRead Werte

Die x-Achse repräsentiert die Indexnummer des ADC-Samples, während die y-Achse den ADC-Wert (0-1024) repräsentiert. Die Abtastrate beträgt ca. 9 kHz. Die Differenz von Spitze zu Spitze beträgt etwa 1026 Proben.

Geben Sie hier die Bildbeschreibung ein

Ist diese Wellenform das, was Sie vom CT erwarten würden? Warum gibt es Regionen, in denen die Werte flach sind, anstatt sich kontinuierlich zu ändern?

Wenn wir uns den Kurventeil des Diagramms ansehen, warum liest Arduino dann abwechselnd Werte über 512und unter 512? Es liest einen Wert über 512, dann einen Wert unter 512, dann einen Wert über 512und so weiter.

Die für ein analogReadSetup benötigte Zeit betrug 110 Mikrosekunden, und zwischen den Wellenformspitzen befinden sich 1026 Abtastwerte. Das bedeutet, dass es in 1 Sekunde ungefähr 9 Peaks gibt, obwohl ich 60 Peaks erwarten würde, da wir eine 60-Hz-Linie erfassen. Was machst du daraus? Es gibt einen Kondensator C1in der Schaltung. Würde das etwas damit zu tun haben?

Sind diese analogRead-Werte zur Berechnung der Effektivspannung und damit des Effektivstroms geeignet, der durch den zu erfassenden Draht fließt? Das Endziel ist die Berechnung des Stromverbrauchs nach Bestimmung des durch den Draht fließenden Effektivstroms.

Skizze zum Abrufen von Plotwerten

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

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

Aktuelle analogReadDatenpunkte in den Unebenheiten

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

Darstellung der analogRead-Werte

Die analogRead-Werte werden jetzt in einem Puffer gespeichert, bevor sie über Serial übertragen werden. Es gibt jetzt 55 ADC-Datenpunkte, die 1 Periode bilden. Wenn man bedenkt, dass die analoge Lesezeit 110 µs beträgt, dauert jeder Zyklus 6,05 ms, was eine Frequenz von 165 Hz ergibt! Was ist möglicherweise schief gelaufen?

Geben Sie hier die Bildbeschreibung ein

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);
        }
    }
}
Nyxynyx
quelle
Können Sie Ihren Code posten? Das sieht überhaupt nicht richtig aus. Wenn wir "Angenommen, 100 ms vergehen" sagen, warum nehmen wir das an?
Cybergibbons
@Cybergibbons Veröffentlichte den Code, mit dem Werte für das Diagramm generiert wurden. Entschuldigung, ich habe gerade die Zeit gemessen, die für eine benötigt wurde, analogRead()und festgestellt, dass sie 110 Mikrosekunden beträgt. Die Frage wurde aktualisiert.
Nyxynyx
Welche Last verwenden Sie für das Stromnetz? Idealerweise möchten Sie etwas ziemlich Stabiles wie eine Glühbirne. Wenn Sie etwas Komplexes wie ein Laptop-Schaltnetzteil haben, das eine unterschiedliche Last haben kann, können Sie ein komplexes Ergebnis erwarten.
Salix alba
1
Der Großteil der Zeit in der Schleife wird für das Senden von Serien mit 9600 Bit / s aufgewendet. Sie verschieben nur 960 Zeichen / s, dh jeder Messwert dauert 4 ms.
Cybergibbons
@Salixalba Die Last ist ein Desktop-Computer mit einem Schaltnetzteil. Ich werde versuchen, eine andere Last zu messen, z. B. eine Heizung.
Nyxynyx

Antworten:

5

In Bezug auf Ihre Messungen würde ich den ersten Satz mit Serial.println () in der Schleife völlig ignorieren. Ich würde davon ausgehen, dass der Zeitpunkt dafür unzuverlässig ist.

Ihr zweiter Datensatz, den Sie in einem Puffer erfasst haben, sieht korrekt aus, aber Ihre Frequenzschätzung / Ihr Timing ist möglicherweise falsch. Ich würde bei jeder Schleifeniteration einen digitalen Ausgang invertieren. Sie können die Frequenz mit einem Multimeter messen und Ihre ADC-Abtastrate wäre doppelt so hoch.

Für ein PC- oder Laptop-Netzteil ist dies eine weit verbreitete Stromwellenform.

Ohne effektive Leistungsfaktorkorrektur wäre das unten gezeigte Stromsignal recht typisch (Quelle: http://www.nlvocables.com/blog/?p=300 ).

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

Sie müssen RMS-Werte berechnen und es ist ratsam, das Signal zu filtern.

Hier ist eine Anleitung, die ich zum Erstellen und Codieren eines auf Arduino Yun basierenden Elektrizitätsmonitors mit Cloud-Unterstützung / Temboo und Google Drive geschrieben habe. Es sollte Ihnen helfen.

Akellyirl
quelle
Vielen Dank! Der von Ihnen verwendete Stromwandler gibt -1V bis 1V aus. Verstärken Sie den SCT-Ausgang mit einem Operationsverstärker um 2,5, um den 10-Bit-ADC zu nutzen? Oder stellen Sie Ihren AREF auf 2 V ein und
spannen Sie
Nein, ich habe es nicht verstärkt oder die Aref geändert.
Akellyirl
Wie könnten Sie dieses Diagramm erhalten? Mit welcher Software?
Zgrknr
0

Wenn Sie eine ohmsche Last messen, würde ich sagen, dass der von Ihnen gewählte Lastwiderstand falsch ist. Es gibt einige billige Stromwandler bei ebay (SCT-013-xxx), die Versionen mit und ohne Lastwiderstand haben. Diese funktionieren gut für ihren Preis Sie müssen jedoch das Datenblatt lesen. Der SCT-013-000 benötigt einen 20R-Widerstand, um 1 V mit einer 100A-Last zu erzeugen. Wenn dieser Widerstand falsch ist, können Sie bei der Messung höherer Ströme (ähnlich den von Ihnen bereitgestellten) eine stark verzerrte Wellenform erhalten, die Sie vom Signal erwarten würden Je niedriger der Lastwiderstandswert, desto stärker verzerren Sie, dies ist jedoch bei Stromwandlern nicht der Fall.

Ian
quelle