Forum: Mikrocontroller und Digitale Elektronik Komplexe Leistungsmessung mit einem Mikrocontroller


von Plumbus (Gast)


Lesenswert?

Guten Morgen,

ich bin auf der Suche nach der günstigsten Möglichkeit die komplexe 
Eingangsleistung eines fertigen Produkts zu bestimmen und die erfassten 
Daten im µC abrufbar abzulegen. Das Bauteil wird an 230 V Netzspannung 
angeschlossen. Es sollen möglichst keine zusätzlichen Komponenten 
gekauft werden müssen.

Über einen Spannungsteiler könnte man die Netzspannung so 
dimensionieren, dass am µC IO Pin eine Spannung zwischen 0-5 V 
vorliegt...(realisiert hab ich das noch nicht)

Über einen sehr kleinen Shunt Widerstand könnte man indirekt den 
Eingangsstrom bestimmen.

Die Spannungs- und Stromverläufe werden abgetastet und am ADC eingelesen 
(12 Bit). Die Momentanwerte beider Signale multipliziert und gemittelt 
-> Wirkleistung

Für die Scheinleistung werde ich entweder Wurzelfunktionen lösen müssen, 
was auf dem µC unschön ist oder folgendes:

Da es sich um ein Signal mit Oberwellenanteil und Verzerrungen handelt, 
läuft es wohl auf einen digitalen Filter und eine FFT raus. Hat jemand 
sowas schon im Mikrocontroller realisiert? Habt ihr andere Ideen wie man 
auf die netzseitige Schein-, Blind-, Wirkleistung, Power Faktor und 
Phasenwinkel schließen kann?

LG

von c r (Gast)


Lesenswert?

Plumbus schrieb:
> Es sollen möglichst keine zusätzlichen Komponenten gekauft werden
> müssen.

Dann wird das auch mit der Shunt-Messung nichts, oder willst du, dass am 
Shunt bis zu 5 V abfallen, nur um dir den Verstärker zu sparen?

Plumbus schrieb:
> Für die Scheinleistung werde ich entweder Wurzelfunktionen lösen müssen,
> was auf dem µC unschön is

Warum? Ob die Rechenleistung ausreicht kann man erst sagen wenn du uns 
verrätst wie schnell das ganze werden soll.

von Patrick L. (plumbus)


Lesenswert?

c r schrieb:
> Dann wird das auch mit der Shunt-Messung nichts, oder willst du, dass am
> Shunt bis zu 5 V abfallen, nur um dir den Verstärker zu sparen?

Es soll das nötigste umgesetzt werden um eine Genauigkeit von 5% 
hinzukriegen. 5% Toleranz zu den Werten eines digitalen 
Leistungsmessers.

c r schrieb:
> Warum? Ob die Rechenleistung ausreicht kann man erst sagen wenn du uns
> verrätst wie schnell das ganze werden soll.

Die Softwaregeschichte hab ich mir noch nicht angeschaut, habe nur mal 
gehört dass "Wurzel ziehen" auf dem µC unschön ist. Bei dem µC handelt 
es sich um den SAM D20, welcher einen 12-Bit ADC mit 350 Kilosamples per 
Second zur Verfügung stellt.

In erster Linie möchte ich es hinkriegen, dass die Werte überhaupt beim 
µC ankommen ohne dass der Mikrocontroller durch die negative Halbwelle 
der Netzspannung flöten geht. Eventuell Brückengleichrichter? -> Dann 
wird die Masse jede zweite Halbwelle immernoch negativ, weiß noch nicht 
wie ich das umgehen kann.

von c r (Gast)


Lesenswert?

Unter "DIY energy meter" findest du Projekte zuhauf.

von Patrick L. (plumbus)


Lesenswert?

c r schrieb:
> Unter "DIY energy meter" findest du Projekte zuhauf.

Danke dir!
Habe dadurch ein hilfreiches Video gefunden, mal sehen was sich machen 
lässt.

https://training.ti.com/build-your-own-energy-meter

von Pandur S. (jetztnicht)


Lesenswert?

Allenfalls mal den ADE7758 anschauen. Dazu gibt's eine Appnote.

von tnsz (Gast)


Lesenswert?

...aber Dir ist schon klar, dass dein Controller dann auf Netzpotential 
liegt. Kann man machen, muss man ggf. nur beachten wenn man die Daten 
weiterübertragen möchte.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Plumbus schrieb:
> Über einen Spannungsteiler könnte man die Netzspannung so
> dimensionieren, dass am µC IO Pin eine Spannung zwischen 0-5 V
> vorliegt...(realisiert hab ich das noch nicht)
>
> Über einen sehr kleinen Shunt Widerstand könnte man indirekt den
> Eingangsstrom bestimmen.

Wie ich sehe willste im Gegensatz zu mir den minimalen Weg gehen.
Für den Shunt brauchste aber noch dringend eine Verstärkung wenn dein 
ADC kein integrierten PGA hat.
Aber ansonsten hängt dann das Gerät am Netz, da empfehle ich dir den ADC 
noch über einen ADUMxxxx galvanisch zu trennen damit du dich nicht 
selber grillst.

Patrick L. schrieb:
> Die Softwaregeschichte hab ich mir noch nicht angeschaut, habe nur mal
> gehört dass "Wurzel ziehen" auf dem µC unschön ist. Bei dem µC handelt
> es sich um den SAM D20, welcher einen 12-Bit ADC mit 350 Kilosamples per
> Second zur Verfügung stellt.

Der D20 dürfte mit seinen 48MHz M0 für eine FFT grenzwertig zu langsam 
sein.
(Eine fertige FFT gibts übrigens direkt von ARM im CMSIS DSP Paket)
Vor allem musst du ja 350kS/s erstmal irgendwo speichern und dann musste
über die Rechnen. Klingt erstmal nicht nach viel aber das läppert sich.

Mit einem STM32F205 auf 120MHz kann ich jede dritte Vollwelle messen.
DIe Zwischenzeit geht für die GUI drauf. Aber das reicht auch, jede 
Vollwelle muss nicht sein.
Hier der Link zum Gerät: 
Beitrag "Re: Zeigt her eure Kunstwerke (2019)"

Zum Wurzelrechnen gibts auch integercode, siehe hier:
http://www.codecodex.com/wiki/Calculate_an_integer_square_root

Oder du nimmst einen größeren Prozessor mit FPU, der kann dann in 
Hardware Wurzeln mit floats:
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0439b/BEHJADED.html

Zum Auslesen empfehle ich Modbus, dafür brauchste am PC nur einen 
USB->UART->RS485 Wandler und für Python gibts dann Libs.
So habe ich mit meinem Eigenbau Wirkleistungsmessgerät und einer 
Eigenbau E-Last einen Netzteiltester geschrieben wo am Ende ein schöner 
Graph des Wirkungsrgrads des Netzteils rausfällt.

Hier dann noch Lesestoff zur Berechnung:
https://de.wikipedia.org/wiki/Effektivwert
https://en.wikipedia.org/wiki/Power_factor#Non-sinusoidal_components
https://de.wikipedia.org/wiki/Blindleistung#Nichtsinusf%C3%B6rmige_Str%C3%B6me
https://de.wikipedia.org/wiki/Scheinleistung#Scheinleistung_bei_nicht_sinusf%C3%B6rmigen_Gr%C3%B6%C3%9Fen
https://de.wikipedia.org/wiki/Verzerrungsblindleistung
https://de.wikipedia.org/wiki/Total_Harmonic_Distortion
https://www.allaboutcircuits.com/technical-articles/the-importance-of-total-harmonic-distortion/
https://www.allaboutcircuits.com/technical-articles/understanding-thd-total-harmonic-distortion-in-power-systems/

von Udo S. (urschmitt)


Lesenswert?

Patrick L. schrieb:
> welcher einen 12-Bit ADC mit 350 Kilosamples per
> Second zur Verfügung stellt.

Und welche Samplefrequnez BRAUCHST du?
Kläre das erst mal, bis zu welcher Frequenz musst du die Oberwellen 
erfassen?

Patrick L. schrieb:
> Es soll das nötigste umgesetzt werden um eine Genauigkeit von 5%
> hinzukriegen.

Dann fang mal an mit Fehlerrechnung. Bei welchen Werten brauchst du die 
5%. Bei 100% des möglichen Messbereichs oder bei 1% des max. 
Messbereichs?

Wenn du das spezifiziert hast, dann kannst du dir Gedanken an die 
Hardware und die notwendige Rechenleistung machen, vorher ist das 
Zeitverschwendung.

von Info (Gast)


Lesenswert?


von Patrick L. (plumbus)


Lesenswert?

Udo S. schrieb:
> Und welche Samplefrequnez BRAUCHST du?
> Kläre das erst mal, bis zu welcher Frequenz musst du die Oberwellen
> erfassen?
>

Wenn ich bis zu 39ten Oberwelle messen möchte, bräuchte ich nach Nyquist 
eine Samplefrequenz von 4kHz. Sollte doch mit 350 kSps kein Problem 
sein?


> Dann fang mal an mit Fehlerrechnung. Bei welchen Werten brauchst du die
> 5%. Bei 100% des möglichen Messbereichs oder bei 1% des max.
> Messbereichs?
>
> Wenn du das spezifiziert hast, dann kannst du dir Gedanken an die
> Hardware und die notwendige Rechenleistung machen, vorher ist das
> Zeitverschwendung.

5% Toleranz der Eingangsleistung
Also ca. 2,4-2,5 % des Eingangsstroms und 2,4-2,5% der Eingangsspannung.

Die 230V Eingangsspannung werden mithilfe eines Spannungsteilers 
erfasst.
Nur beim Netzstrom tu ich mir noch schwer.
Shunt wäre am einfachsten, es fehlt dann aber eine galvanische Trennung,
Die erste negative Halbwelle zerschießt mir den µC...
Shunt -> PGA -> ADC

Energy Metering ICs messen via Shunt differentiell mit einem ADC und 
mehreren OPs..verstehe das leider nicht richtig.

Andere Möglichkeit wäre ein Hall-Sensor der gleiche eine galvanische 
Trennung bietet oder ein digitaler PFC der die Strom und Spannungswerte 
sowieso misst und via EEPROM und I²C/SPI zur Verfügung stellen kann.

Oder eben ein einzelnes Energy Metering IC

Hat jemand eine Netzstrommessung via Shunt + galvanischer Trennung 
umgesetzt?

Sägezahnsignal ----  + |\
                       | |- PWM Signal -> Optokoppler -> Tiefpass -> µC
Netzstromsignal ---- - |/

wäre doch auch eine Möglichkeit? Hat jemand noch Ideen?

von FloMann (Gast)


Angehängte Dateien:

Lesenswert?

Zur Spg. Messung siehe Bild als ein Beispiel.
ADC im Diff. Eingangsmodus, die Vref/2 über einen internen
DAC erzeugen, wenn dieser einen Ausgangs OP aufweißt der
auch etwas Strom treiben kann reicht das.
Sonst noch einen ext. Buffer. Spg. Teiler/Filter
nach  deinem Bedarf anpassen.

Ist deine Schaltung am Gnd geerdet? ggf. auch erst
durch die Kommunikation zum PC?
Versorgung der Schaltung durch L/N immer sichgergestellt 
"Phasenrichtig"?
Durch die "differenzielle" Messung oben über weite Bereiche
i.r. aber auch dann kein Problem.

Zur Strommessung nimm was Hall Effekt basierendes, z.b. LEM HLSR-xxP.
Per Spg.Teiler am Ausgang auf deine Pegel für den ADC bringen.
Auch hier ggf. differenziell Messen mit der VOut(+) und VRef(-)
des HLSR anden ADC Eingängen, dann kompensiert man dessen VRef drifts.

So als ein weiteres Beispiel.
Achja für deine statistischen Messwerte ist eine FFT auch nicht nötig,
das geht auch mit weit weniger Rechenleistung über entsprechende
intervalle zu integrieren für die RMS Werte.

von Klaus (Gast)


Lesenswert?

Plumbus schrieb:
> Die Spannungs- und Stromverläufe werden abgetastet und am ADC
> eingelesen (12 Bit). Die Momentanwerte beider Signale multipliziert
> und gemittelt -> Wirkleistung

Und das Produkt der Absolutwerte von Spannung und Strom ergibt die 
Scheinleistung. Ich kann da keine Wurzel erkennen.

MfG Klaus

von FloMann (Gast)


Lesenswert?

Das Produkt der "Effektivwerte" von U und I ist S.
https://de.wikipedia.org/wiki/Effektivwert
Da musst du dann schon ne Wurzel ziehen

Beim rechnen von i(t) * u(t) bekommst du "P"(t)
also den "Wirk"leistungsverlauf über die Zeit

von FloMann (Gast)


Lesenswert?

mahh...
"Wirk"leistungsverlauf ist hier blöd/missverständlich/falsch 
ausgedrückt,
nennen wir es einfach Leistungsverlauf dessen mittel über ein Interval x
die Wirkleistung in dem Interval ist. hier brauchts keine wurzel.

von Axel S. (a-za-z0-9)


Lesenswert?

Ich kann die Wurzelphobie ohnehin nicht nachvollziehen. Wenn das in C 
programmiert wird, dann ist das ein simpler Aufruf von sqrt() bzw. 
sqrtf(). Denn eine libm wird es für die Zielarchitektur ja wohl geben.

Eine andere Frage ist es dann, ob das auch schnell genug ist. Bei einem 
Cortex-M0+ wird es auf jeden Fall schon mal nicht in Hardware gehen. 
Aber das heißt nicht, daß es nicht trotzdem schnell genug sein kann.

von Klaus (Gast)


Lesenswert?

FloMann schrieb:
> Beim rechnen von i(t) * u(t) bekommst du "P"(t)
> also den "Wirk"leistungsverlauf über die Zeit

Und wenn du statt i(t) |i(t)| und statt u(t) |u(t)| nimmst, hast du die 
Scheinleistung.

MfG Klaus

von FloMann (Gast)


Angehängte Dateien:

Lesenswert?

Nicht wirklich oder hab ich da jetzt einen Knoten im Hirn.
Im Anhang drei fälle (0°/45°/90°) von P(t) und ABS(P(t)) und deren
mittel über eine Periode (20ms = 100 Werte a 0,2ms)
UEff und IEff ist jeweils 1, S wäre dann auch immer 1VA..

Was man machen kann U "oder" I über einen Filter zuvor um 90°
zu verschieben dann bekommt man die Blindleistung. Das ist aber
vom Rechenaufwand deutlich mehr als eine simple Wurzel am Ende
eines Messintervall

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Axel S. schrieb:
> Ich kann die Wurzelphobie ohnehin nicht nachvollziehen. Wenn das in C
> programmiert wird, dann ist das ein simpler Aufruf von sqrt() bzw.
> sqrtf(). Denn eine libm wird es für die Zielarchitektur ja wohl geben.

Vor allem gibts im Internet auch Code für integer Wurzeln:
http://www.codecodex.com/wiki/Calculate_an_integer_square_root

Zitat: ---
For an explanation as to how the previous and following algorithms work, 
see Integer Square Roots by Jack W. Crenshaw 
(http://www.embedded.com/98/9802fe2.htm) - specifically, Figure 2 of 
that article.
The fastest integer square root C algorithm yet is possibly below
--- Zitat Ende

Wird von einer FPU aber komplett abgeledert (wenn vorhanden).

von Chris (Gast)


Lesenswert?

STPM32 !!! (nicht STM!)

von FloMann (Gast)


Lesenswert?

Die Wurzel Rechnung vor allem bei Integer ist kein wirkliches Problem.
Ich hatte das hier:
https://www.mikrocontroller.net/articles/AVR_Arithmetik#Wurzel
mir mal für einen 8051 "portiert". Auf einem EFM8LB @72Mhz brauchte
das mit 32bit und Runden irgendwo zwischen 10 und 12"µs".
Da brauchte auf selber Platform das dividieren von 32bit Zahlen i.r. 
länger.

Es reicht ja auch am Ende des Intervals(z.b. Netzperiode 20ms)
einmal die Wurzel zu ziehen für jeweils die Effektivwerte U,I und
ggf. für  Q über  Q= Sqrt(S²-P²) also dann drei mal.
Da sehe ich nicht wo ein M0 ein problem haben könnte.

von Frank K. (fchk)


Angehängte Dateien:

Lesenswert?

Patrick L. schrieb:

> Energy Metering ICs messen via Shunt differentiell mit einem ADC und
> mehreren OPs..verstehe das leider nicht richtig.

nicht einem ADC, sondern zwei ADCs. Die allgemeine Form der Wirkleistung 
ist das Integral des Produkts der Augenblickswerte von Strom und 
Spannung über eine Periode, und das geteilt durch die Periodendauer.

Und dafür musst Du Strom und Spannung gleichzeitig messen, weil Du sonst 
einen Fehler hineinbringst. Die üblichen Metering-Bausteine machen das 
so.

Schau Dir das an:

https://master-nq.webp2.cirrus.com/products/cs5490/

Bei mir sieht das so aus (siehe Bild). Das funktioniert dann auch.

fchk

von FloMann (Gast)


Lesenswert?

Die Ansprüche sind ja jetzt nicht exorbitant mit 5%, wobei ich jetzt 
noch nicht
weiß auf Fullscale oder Messwert und wenn letzteres über welche Dynamik
des Messbereich hinweg.

Wenn er jetzt seine Abtastung  zb. so gestaltet das zwischen dem I und U 
Sample
z.b 20us liegen macht das auf eine 50hz Netzperiode eine Verschiebung um 
0,36°.
Fehler der Grundwelle ist damit vll. Noch tollerabel.
Bsp: Bleiben wir bei 1V, 1A und absolut betrachtet mit:
0° -> P = 0,99998W, Q = 0,006VAr       (1W/0VAr)
45° -> P = 0,70265W, Q = 0,71154VAr (0,70711W/VAr)
90° -> P = 0,006W, Q = 0,99998VAr

Nehmen wir 500Hz dann sind es 3,6°
0° -> P = 0,998W, Q = 0,06VAr
45° -> P = 0,661W, Q = 0,750VAr
90° Spar ich mal.

Netzspannung ist dominierend 50Hz und Wirkleistung gibt es nur bei fu = 
fi.
Hält sich die verschiebe Blindleistung (von der Grundwelle) in Grenzen
Zb. Phi < 70° bleibt der Fehler auf die Erwartung von P unter 
2%(Grundwelle).
Mit S= U×I und  Q= Sqrt(S^2 - P^2)  bekommt man noch eine Recht 
brauchbare
Gesamt Blindleistung ( Verschiebung und Verzerrung).
Kommen halt noch die weiteren üblichen Fehler obendrauf.

Also ja ein Kanal Sample Delay ist nicht schön für den Fehler aber je 
nach Anspruch,
was man für Signale i(t) und u(t) bei seinem Gerät erwartet und welche 
Werte einem
besonders wichtig sind eventuell auch noch tollerabel.
Aber ja wenn möglich sind 2 Adc's schon besser. Es gibt im Prinzip auch
Genug Power Monitor ICs die alles was nötig ist mitbringen und nicht die 
Welt kosten.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.