Messaufbau zum Wirkungsgrad eines DCDC Wandlers
In den letzten Jahren habe ich viele der kleinen DCDC Wandler Fertigmodule eingesetzt. Aber welchen Wirkungsgrad haben diese kleinen Module ? 4 Messgeräte für Spannung/Strom anschließen wollte ich nicht und so war ich auf der Suche nach einer kleinen und schnellen Lösung. Die habe ich dann gefunden in Form der INA-219 Strommessmodule welche von einem Micropython Pyboard ausgelesen werden. Das ganze war dann auch gleich das erste Projekt in Python auf einem Microcontroller.
Auf der linken Seite das Micropython Pyboard1.1 mit USB Anschluss welches auf dem PC eine Serielle Schnittstelle und ein Flashdrive erzeugt. In der Mitte ein typisches DCDC Wandler Modul sowie links und rechts die INA Module.
Der Vorteile dieser Mini-Module ist das der INA219 mit Shunt fertig aufgelötet ist und man per I2C die Strom und die Spannungswerte auslesen kann. Mit den Lötbrücken rechts kann man noch die I2C Adresse verstellen wenn man mehrere Module zeitgleich am Bus hat.
Beispiel eines DCDC Wandlers (Buck) mit dem LM2596S. Die Dinger gibt es fertig für ein paar Euro in der Bucht.
Alles was jetzt noch fehlt ist ein kleines Python Programm welches Strom/Spannung am Ein und Ausgang ausliest und daraus die Werte Wirkungsgrad, Eingangsleistung, Ausgangsleistung, Verlustleistung, Eingangsspannung/Strom, Ausgangsspannung/Strom auf der seriellen Schnitte ausgibt.
Quellcode anbei als erster Startpunkt, es enthält keine Abfragen auf negative Werte, Teilung durch 0 u.s.w. Das kann jeder noch selbst einprogrammieren wie er möchte.
Für meine Zwecke haben diese paar Zeilen schon voll ausgereicht :
from pyb import I2C
import ustruct
import time
i2c = I2C(2) # create on bus 2 (Pins auf der rechten Seite nahe dem USB)
i2c = I2C(2, I2C.MASTER) # create and init as a master
i2c.init(I2C.MASTER, baudrate=10000) # init as a master
while True:
cur1 = (ustruct.unpack(">h", i2c.mem_read(2, 0x40, 1))[0])/10000
vol1 = ((ustruct.unpack(">H", i2c.mem_read(2, 0x40, 2))[0] & 0xFFF8) >> 3)*0.004
cur2 = (ustruct.unpack(">h", i2c.mem_read(2, 0x41, 1))[0])/10000
vol2 = ((ustruct.unpack(">H", i2c.mem_read(2, 0x41, 2))[0] & 0xFFF8) >> 3)*0.004
pow1 = vol1 * cur1
pow2 = vol2 * cur2
etapro = 100/pow1*pow2
loss = pow1-pow2
print ("Eta: %5.1f%% | Loss: %10.4fW | In: %6.3fV %6.3fA %10.4fW | Out: %6.3fV %6.3fA %10.4fW" % (etapro,loss,vol1,cur1,pow1,vol2,cur2,pow2))
time.sleep(1.0)
Und so sieht die Ausgabe der Messwerte auf der seriellen Schnittstelle aus im Sekundentakt :
Zum Pyboard gibt es ein passendes Display, das LCD160CRv1.1H zu kaufen. Ein paar Zeilen Code dazu und schon ist das autarke Messgerät fertig :
Der Code ist nur unwesentlich länger. Wer will kann natürlich noch Grafik einfügen, alles Bunt machen u.s.w. :
from pyb import I2C
import ustruct
import time
import lcd160cr
lcd = lcd160cr.LCD160CR('X')
lcd.set_orient(lcd160cr.PORTRAIT)
lcd.set_text_color(lcd.rgb(255,255,255), lcd.rgb(0,0,0))
lcd.set_font(1)
lcd.erase()
lcd.set_pos(20,10)
lcd.write('Leistungsmesser')
lcd.set_pos(50,0)
lcd.write('DG1SFJ')
i2c = I2C(2) # create on bus 2 (Pins auf der rechten Seite nahe dem USB)
i2c = I2C(2, I2C.MASTER) # create and init as a master
i2c.init(I2C.MASTER, baudrate=10000) # init as a master
while True:
cur1 = (ustruct.unpack(">h", i2c.mem_read(2, 0x40, 1))[0])/10000
vol1 = ((ustruct.unpack(">H", i2c.mem_read(2, 0x40, 2))[0] & 0xFFF8) >> 3)*0.004
cur2 = (ustruct.unpack(">h", i2c.mem_read(2, 0x41, 1))[0])/10000
vol2 = ((ustruct.unpack(">H", i2c.mem_read(2, 0x41, 2))[0] & 0xFFF8) >> 3)*0.004
pow1 = vol1 * cur1
pow2 = vol2 * cur2
etapro = 100/pow1*pow2
loss = pow1-pow2
print ("Eta: %5.1f%% | Loss: %10.4fW | In: %6.3fV %6.3fA %10.4fW | Out: %6.3fV %6.3fA %10.4fW" % (etapro,loss,vol1,cur1,pow1,vol2,cur2,pow2))
lcd.set_pos(0,30)
lcd.write("Eta : %5.1f%%" % (etapro))
lcd.set_pos(0,40)
lcd.write("Loss : %10.4fW" % (loss))
lcd.set_pos(0,60)
lcd.write("U in : %6.3fV" % (vol1))
lcd.set_pos(0,70)
lcd.write("I in : %6.3fA" % (cur1))
lcd.set_pos(0,80)
lcd.write("P in : %10.4fW" % (pow1))
lcd.set_pos(0,100)
lcd.write("U out: %6.3fV" % (vol2))
lcd.set_pos(0,110)
lcd.write("I out: %6.3fA" % (cur2))
lcd.set_pos(0,120)
lcd.write("P out: %10.4fW" % (pow2))
time.sleep(1.0)