Dieses Repository enthält die Trums C ++ - Bibliothek für Arduino. Mit dieser Bibliothek ist es möglich, den Durchschnittswert und das RMS (Wurzelmittelquadrat) oder den effektiven Wert des ADC -Eingangssignals zu berechnen. Diese Bibliothek berechnet auch die reale , scheinbare Leistung und den Leistungsfaktor sowohl der Spannung als auch der Stromeingangssignale. Aus Version 1.3 wurde dem Projekt eine Energiemessung hinzugefügt.
Die Spannung und die Spannungsdarstellung eines Stroms können mit dem ADC des Arduino gemessen werden, indem die geeignete Eingangskreis für die Skalierung der gemessenen Größen auf den 0-5V-konformen Spannungsbereich des ADC verwendet wird. Die bereitgestellte Lösung verwendet eine einfache Methode zur Skalierung der gemessenen Größen. Der Benutzer muss nur den Peak-to-Peak-Wert der Wechselstrom-Eingangsspannung und des Stroms definieren. Wenn die Einheiten der gemessenen Größen in Volt und Ampere definiert sind, ist die berechnete Leistung in Watt und die Energie in WS (Joules). Diese Bibliothek ist für andere Plattformen einfach tragbar.
Die folgenden Bibliotheksklassen werden implementiert:
AverageRmsRms2PowerPower2Der Durchschnitt berechnet den Durchschnittswert aus einer Reihe von Eingangsproben (normalerweise) aus dem ADC. RMS oder RMS2 soll den Wurzel-Mittelwerte-Wert eines Signals und Power oder Power2 berechnen, um die Leistung sowohl aus Spannung als auch von Stromeingang zu berechnen.
RMS2 und Power2 werden besser abschneiden, wenn sie in einer Interrupt -Service -Routine verwendet werden, indem die Verarbeitungsbelastung über die Probenzeitfenster ausbreitet. Die Anzahl der Proben für einen RMS -Erfassungslauf (Scan) ist als Fenster definiert. RMS2 und Power2 belegen einen zusätzlichen Beispiel -Zeitfenster (Fensterlänge +1), wenn die automatische Option zur Wiederherstellung der Basislinien eingeschaltet ist (BLR_ON).
Die folgenden Methoden existieren:
begin()start()stop()update()update1()update2()publish() Überprüfen Sie zum schnellen Start die Beispiele für Arduino -Skizzen, die mit der Bibliothek geliefert werden.
Dies sind die Schritte für eine erfolgreiche Implementierung:
begin() definiert. Diese Methode dient zum Initialisieren und benötigt Eingabe, um die Skalierung der Messeinheiten, die Größe des Stichprobenfensters, die Anzahl der Bits des gebrauchten ADC (oder ein Eingangssignal) und der Erfassungsmodus (kontinuierlicher Scan/Einzel -Scan) festzulegen.start() , um die Akquisition zu starten.update() (oder update1() + update2() für Power2 ) wiederholt mit konstanter Geschwindigkeit.publish() , um die Ergebnisse zu erhalten. Für das Power2 -Klasse update () wird in update1() und update2() unterteilt. update1() muss zuerst aufgerufen werden, um die Stichprobe aus der Eingangsspannung und update2() zu verarbeiten, um die Stichprobe aus dem Eingangsstrom oder Vica Versa (Spannungsstrom) zu verarbeiten. Die Abtastspannung und der Strom erfolgen normalerweise nacheinander für einen Multiplexed ADC.
Für die durchschnittliche Verwendung der Klassen:
void begin(float range, unsigned char window, unsigned char nob, bool mode);
Mit:
range ist der maximal erwartete vollständige Schwung des Wechselstromeingangssignals (Peak-to-Peak-Wert).window Die Länge des Probenfensters, ausgedrückt in einer ganzen Anzahl von Proben.nob ist die Bitauflösung des Eingangssignals (ADC -Bit -Tiefe). Verwenden Sie die vordefinierten Konstanten: ADC_8BIT , ADC_10BIT oder ADC_12BIT .mode legt den Modus auf kontinuierliches Scan oder Einzelscan fest. Verwenden Sie die prädifinierten Konstanten CNT_SCAN oder SGL_SCAN . void start(void); Diese Methode startet die Akquisition für den kontinuierlichen Scan und den Einzel -Scan -Modus.
void stop(void); Diese Methode stoppt den Akquisition.
void update(int instVal); Weisen Sie den aktuellen Beispielwert zu.
void publish(void); Veröffentlichen Sie die Ergebnisse aus dem zuletzt abgeschlossenen Akquisitionslauf. Die Ergebnisse sind in der Ausgangsvariablen (n) im Sinne als nächstes festgelegt.
Die öffentlich definierten Variablen sind:
int instVal - Der Wert der zuletzt erworbenen Stichprobe
float average - das Ergebnis des Durchschnittswertwerts
bool acquire - Statusbit, wahr, wenn der Scan anhängig ist.
Für die Klasse RMS oder RMS2 verwenden Sie:
void begin(float range, unsigned char window, unsigned char nob, bool blr, bool mode);
Mit:
range ist der maximal erwartete Full-Swing des AC-Signal (Peak-to-Peak-Wert).window Die Länge des Probenfensters in einer ganzen Anzahl von Proben.nob ist die Bitauflösung des Eingangssignals, normalerweise ist dies die ADC -Bit -Tiefe. Verwenden Sie die vordefinierten Konstanten: ADC_8BIT , ADC_10BIT oder ADC_12BIT .blr legt die automatische Basisrestaurinierungsfunktion ein oder aus. Verwenden Sie die prädifinierten Konstanten BLR_ON oder BLR_OFF .mode legt den Modus auf kontinuierliches Scan oder Einzelscan fest. Verwenden Sie die prädifinierten Konstanten CNT_SCAN oder SGL_SCAN . void start(void); Diese Methode startet die Akquisition für den kontinuierlichen Scan und den Einzel -Scan -Modus.
void stop(void); Diese Methode stoppt den Akquisition.
void update(int instVal); Weisen Sie den aktuellen Beispielwert zu.
void publish(void); Veröffentlichen Sie die Ergebnisse aus dem zuletzt abgeschlossenen Akquisitionslauf. Die Ergebnisse sind in der Ausgangsvariablen (n) im Sinne als nächstes festgelegt.
Die öffentlich definierten Variablen sind:
int instVal - Der Wert der zuletzt erfassten Stichprobe, die bei Blr_on in die Grundlinie wiederhergestellt wurde
float rmsVal - Das RMS -Wertergebnis
int dcBias - Der DCBIAS -Wert in ADC -Einheiten. Nur relevant, wenn Blr_on
bool acquire - Statusbit, wahr, wenn der Scan anhängig ist
Für den Klassenmachtgebrauch :
void begin(float range1, float range2, unsigned char window, unsigned char nob, bool blr, bool mode);
Mit:
range1, range2 ist der maximal erwartete Full-Swing der Wechselstrom-Signale (Spitzenwert des Peaks) der Spannung und des Stroms.window Die Länge des Probenfensters in einer ganzen Anzahl von Proben.nob ist die Bitauflösung des Eingangssignals, normalerweise ist dies die ADC -Bit -Tiefe. Verwenden Sie die prädifinierten Konstanten: ADC_8BIT , ADC_10BIT oder ADC_12BIT .blr legt die automatische Basisrestaurinierungsfunktion ein oder aus. Verwenden Sie die prädifinierten Konstanten BLR_ON oder BLR_OFF .mode legt den Modus auf kontinuierliches Scan oder Einzelscan fest. Verwenden Sie die prädifinierten Konstanten CNT_SCAN oder SGL_SCAN . void start(void); Diese Methode startet die Akquisition für den kontinuierlichen Scan und den Einzel -Scan -Modus.
void stop(void); Diese Methode stoppt den Akquisition.
void update(int instVal1, int instVal2); Weisen Sie die aktuellen Stichprobenwerte (z. B. Spannung und Strom) gleichzeitig zu.
void publish(void); Veröffentlichen Sie die Ergebnisse aus dem zuletzt abgeschlossenen Akquisitionslauf. Die Ergebnisse sind in der Ausgangsvariablen (n) im Sinne als nächstes festgelegt.
Die öffentlich definierten Variablen sind:
int instVal1 - Der Wert der zuletzt erfassten Probe (Spannung), der bei Blr_on zur Grundlinie wiederhergestellt wurde
int instVal2 - Der Wert der zuletzt erfassten Probe (Strom), der bei BLR_ON an der Grundlinie zurückgeführt wird
float rmsVal1 - rms value1 (Spannung)
float rmsVal2 - rms value2 (Strom)
int dcBias1 - Der DCBIAS1 -Wert in ADC -Einheiten. Nur relevant, wenn Blr_on
int dcBias2 - Der DCBIAS2 -Wert in ADC -Einheiten. Nur relevant, wenn Blr_on
float apparentPwr - die scheinbare Kraft
float realPwr - echte Kraft
float pf - Leistungsfaktor
float energy - Netto Energy
bool acquire - Statusbit, wahr, wenn der Scan anhängig ist
Für die Klassenpower2 -Verwendung:
void begin(float range1, float range2, unsigned char window, unsigned char nob, bool blr, bool mode);
Mit:
range1, range2 ist der maximal erwartete Full-Swing der Wechselstrom-Signale (Spitzenwert des Peaks) der Spannung und des Stroms.window Die Länge des Probenfensters in einer ganzen Anzahl von Proben.nob ist die Bitauflösung des Eingangssignals, normalerweise ist dies die ADC -Bit -Tiefe. Verwenden Sie die prädifinierten Konstanten: ADC_8BIT , ADC_10BIT oder ADC_12BIT .blr legt die automatische Basisrestaurinierungsfunktion ein oder aus. Verwenden Sie die prädifinierten Konstanten BLR_ON oder BLR_OFF .mode legt den Modus auf kontinuierliches Scan oder Einzelscan fest. Verwenden Sie die prädifinierten Konstanten CNT_SCAN oder SGL_SCAN . void start(void); Diese Methode startet die Akquisition für den kontinuierlichen Scan und den Einzel -Scan -Modus.
void stop(void); Diese Methode stoppt den Akquisition.
void update1(int instVal); Weisen Sie den aktuellen Stichprobenwert beispielsweise für die Spannung zu.
void update2(int instVal); Weisen Sie den aktuellen Beispielwert zum Beispiel für den Strom zu. Rufen Sie update1() und update2() abwechselnd in der Stichprobenschleife.
void publish(void); Veröffentlichen Sie die Ergebnisse aus dem zuletzt abgeschlossenen Akquisitionslauf. Die Ergebnisse sind aus den Ausgangsvariablen (n) im Sinne als nächstes verfügbar.
Die öffentlich definierten Variablen sind:
int instVal1 - Der Wert der zuletzt erfassten Probe (Spannung), der bei Blr_on zur Grundlinie wiederhergestellt wurde
int instVal2 - Der Wert der zuletzt erfassten Probe (Strom), der bei BLR_ON an der Grundlinie zurückgeführt wird
float rmsVal1 - rms value1 (Spannung)
float rmsVal2 - rms value2 (Strom)
int dcBias1 - Der DCBIAS1 -Wert in ADC -Einheiten. Nur relevant, wenn Blr_on
int dcBias2 - Der DCBIAS2 -Wert in ADC -Einheiten. Nur relevant, wenn Blr_on
float apparentPwr , die scheinbare Kraft
float realPwr - echte Kraft
float pf - Leistungsfaktor
float energy - Netto Energy
bool acquire - Statusbit, wahr, wenn der Scan anhängig ist
Rms gridVolt;
void setup() {
...
gridVolt.begin(700, 40, ADC_10BIT, BLR_ON, CNT_SCAN);`
...
}
Die Argumente bedeuten:
Der vollständige ADC-Bereich (0 bis 5 Volt) repräsentiert einen Signalspitzenwert von 700 V. Dies entspricht einer Signalamplitude von 350 V oder 247,5 VRMs für eine Sinuswelle.
Das RMS -Fenster besteht aus 40 Proben, was bedeutet, dass das Fenster zwei 50 -Hz -Zyklen abdeckt, wenn die Stichprobenrate bei 1000 Proben/s ausgewählt wurde.
Die ADC -Bitauflösung ist 10bit (Arduino Uno).
Blr_on bedeutet, dass die Basisrestauration eingeschaltet ist. Um ein AC-Signal mit dem ADC zu erfassen, muss der Nullwert des Signals durch Zugabe einer DC-Offset-Spannung mit der ADC-Eingangsschaltung in Richtung des mittleren Punktes des ADC-Bereichs verschoben werden. Dieser Offset muss anschließend in der Software korrigiert werden, indem ein konstanter Wert vom erfassten ADC -Wert subtrahiert. Diese Korrektur kann automatisch mit Blr_on durchgeführt werden und es ist keine Kalibrierung erforderlich. In Abbildung 1 zeigt die blaue Linie das maximale skalierte Eingangssignal mit einer Spannungsschwung von 5 V an und verzerrt auf 2,5 V. Die grüne Linie zeigt ein Eingangssignal mit einer Amplitude von 1 V und misst 1 V/sqrt (2) = 0,71 VRM.

Mit der Option CNT_SCAN wird die Erfassung im kontinuierlichen Modus festgelegt. Die Akquisition wird nach Abschluss des letzten Scans automatisch neu gestartet.
Call gridVolt.update(adcVal); Aus der Hauptschleife oder aus einer Interrupt -Service -Routine (ISR). Stellen Sie sicher, dass sich die Schleife mit einer konstanten Geschwindigkeit wiederholt.
Holen Sie sich die Ergebnisse mit gridVolt.publish() und erhalten Sie den RMS -Wert: float Voltage = gridVolt.rmsVal;
void loop() { // loop must run at 1kHz
...
adcValue = analogRead(AN0); // read the ADC.
gridVolt.update(adcValue);
counter++;
if(counter >= 500) { // publish every 0.5s
gridVolt.publish();
Voltage = gridVolt.rmsVal;
counter = 0;
}
...
while(loop_timer_not_expired) {1}
...
}
Measure_avg.ino - Dieses Beispiel zeigt, wie der Durchschnittswert eines mit dem ADC gemessenen Signal berechnet wird.
Measure_rms.ino - In diesem Beispiel wird der RMS -Wert der ADC -Eingangsspannung bestimmt.
AC_powermeter.ino - Dieses Beispiel zeigt eine vollständige Anwendung von AC -Power -Messungen. Es benötigt sowohl Spannung als auch eine Spannungsdarstellung des Stroms als Eingang auf zwei ADC-Kanälen. Es berechnet die RMS-Werte der Spannung und des Stroms, der scheinbaren Leistung, der realen Leistung und des Leistungsfaktors.
AC_powermeter_advanced.ino - Dieses Beispiel zeigt auch eine vollständige Anwendung von AC -Power -Messungen. Es läuft unter Interrupt -Basis, um bessere stabile Lesungen zu erhalten. Spannung und Strom werden beide bei 3 kHz abgetastet. Wenn die Arduino -LED beleuchtet ist, verzerren die ADC -Clips (zu hohe Eingangspeakspannung) oder die Gleichstromauslagerung aus dem Bereich aus dem Bereich.
Energy_metering.ino zeigt die Spannung, den Strom, die reale Leistung und die Nettoenergie in WH.
Der einfachste Weg, um AC-Hochspannungen mit dem Arduino ADC zu verknüpfen, besteht darin, einen Spannungswandler zu verwenden, beispielsweise der LV 25-P -Spannungswandler von LEM USA Inc. Dieser Wandler bietet eine galvanische Isolierung, Skalierung und Pegelverschiebung in einem einzelnen Paket. Für die Stromerfassung stellt LEM auch den LEM_LA55-P mit den gleichen Vorteilen wie für den Spannungswandler her.
Wenn man es vorzieht, Eingangskalkuiten aus diskreten Komponenten zu erstellen, finden Sie eine detaillierte Entwurfsbeschreibung in der Anwendungsnotiz Tiduay6c.pdf, die zur Spannungsquelle -Inverter -Referenzdesign von Texas Instruments Incorporated gehört. Beachten Sie die Warnungen! Die vorgeschlagenen Schaltungen können leicht an den 0-5-V-Bereich für den Arduino angepasst werden.
Verwenden Sie zu jeder Zeit einen Isolationstransformator zur Sicherheit!
3-Phasen-Leistungsmessung.
In der Entwicklung dieser Bibliothek wurde viel Zeit mit dem alternativen Arduino-ide-Sloeber gespeichert. Sloeber ist ein wunderbares Arduino -Plugin für Eclipse. Vielen Dank an Jantje und seine Mitwirkenden!