Aus Raspberry Pi Geek 09/2025

Akkus testen mit der regelbaren Stromsenke XY-FZ35 (Seite 2)

Der Code aus Listing 2 testet den Zugriff auf die serielle Schnittstelle. Dafür genügt es, den USB-Seriell-Adapter einzustecken. Eine Verbindung zu einem Empfänger ist noch nicht erforderlich. Die Instanz ser erhält den Namen, den Sie zuvor via Dmesg ermittelt haben, hier ttyUSB0. Die Baud-Rate von 9600 Zeichen pro Sekunde ist die Geschwindigkeit, mit der auch das Testgerät kommuniziert.

Erkennt Python die Schnittstelle nicht, bricht das Programm an dieser Stelle ab. Anderenfalls bestätigt die folgende Print-Anweisung, dass die Schnittstelle Daten entgegennimmt. Die Methode ser.write() sendet alle übergebenen Bytes, hier 5000 Zeichen. Das RS232-Protokoll kennt einige Verfahren für einfache Handshakes. Bei nicht sicherheitskritischen Übertragungen wie hier kann man jedoch darauf verzichten.

Listing 2

Schnittstelle testen

import serial
ser = serial.Serial(
  port='/dev/ttyUSB0',
  baudrate=9600,
)
print(ser.isOpen())
ser.write(bytearray([4, 8, 20, 55, 100]*1000))
print('done')

Das Oszillogramm in Abbildung 4 vermittelt einen Eindruck davon, wie das Signal am Ausgang des Interface-Kabels aussieht. Bei einer Baud-Rate von 9600 Impulsen pro Sekunde dauert ein Impuls ungefähr 100 Mikrosekunden. Die Einzel-Bits dieser Länge lassen sich im Bild gut erkennen. Die Signalhöhe bestätigt den Level von 0 und 3,3 Volt.

Abbildung 4: Ein Oszillogramm des Signals an der <span class="ui-element">TX</span>-Leitung der seriellen Schnittstelle.

Abbildung 4: Ein Oszillogramm des Signals an der TX-Leitung der seriellen Schnittstelle.

Um mit der elektronischen Last zu kommunizieren, schließen Sie die drei Leitungen des USB-TTL-Kabels an das serielle Interface des XY-FZ35 an. Die schwarze Leitung stellt die gemeinsame Masse her. Die Sendeleitung TX verbinden Sie mit dem Eingang RX des Geräts, die Empfangsleitung RX der USB-Schnittstelle mit dem TX-Ausgang.

Sprechen und Hören

Zum Auslesen der Daten setzen Sie im Python-Programm readline() ein. Ähnlich wie der Befehl write() liest es Daten, gibt sie jedoch erst dann aus, wenn es auf ein Newline-Zeichen trifft. Schickt der Sender keines, verharrt der Readline-Befehl in einer Warteschleife. Aus diesem Grund erhält die Instanz für die serielle Schnittstelle den Parameter timeout=3. Wird innerhalb von drei Sekunden kein Zeilenende-Zeichen empfangen, bricht die Kommunikation ab. Empfängt der Lesebefehl readline() wie in Listing 3 oben Daten, dann arbeitet die Schnittstelle korrekt: Sie registriert den Zeilenendmarker.

Listing 3

Ausgaben des XY-FZ35

### ohne Initialisierung ----------------------
b'\x00\x00\x00\x00\x00 ...
FALL\r\n'b'FALL\r\n'b'FALL\r\n'
### im korrekten Betriebsmodus ----------------
b'OVP:25.2 V \r\n'b'OCP:1.30
 A \r\n'b'OPP:5.30 W \r\n'b'LVP:2.0 V \r\n'b'OAH:9.\xb999 Ah \r\n'b'OHP:72:00 h\r\n'b'DOWN\r\n'b' 4.91 V \r 0.26 A \r 0.004 Ah \r 00:00 h\r\n'b' 4.92 V \r 0.26 A \r 0.004 Ah \r 00:00 h\r\n'b' 4.92 V \r 0.26 A \r 0.004 Ah \r 00:00 h\r\n'

Obwohl der XY-FZ35 kein Handshake kennt, erwartet er dennoch einige Kommandos für die Vorbereitung der Datenausgabe. Ein Minimalskript für die Kommunikation könnte so aussehen wie in Listing 4. Zu Beginn legt es die Variablen fest, die das Gerät versteht: cread und cstart steuern die Ausgabe der Geräteparameter beziehungsweise der Datenausgabe.

Die Protection-Parameter bestimmen die elektrischen Grenzwerte. Die erste Programmschleife überträgt die Protection-Daten, die zweite Iteration liest n=50 Datenzeilen über die Schnittstelle ein. Das Datenformat der Stromsenke besteht aus 39 Zeichen (siehe Listing 3 unten): Spannung, Strom, Kapazität in Amperestunden und minutengenau die Zeit seit dem Start der Messung. Innerhalb einer Minute sendet das Gerät im Mittel 75 Datenzeilen. Da die serielle Schnittstelle asynchron arbeitet, lässt sich daraus eine Zeitauflösung von rund 10 Sekunden ableiten. Für die Überwachung schneller Lastwechsel ist der XY-FZ35 also nicht konzipiert.

Listing 4

Einfaches Kommunikationsprogramm

import serial
# Initialisation parameters
cread = b'read'    # initiate reading settings
cstart =b'start'   # start reading data
# Set Protection
LVP = b'LVP:02.0'  # low voltage
OVP = b'OVP:4.4'   # over voltage
OCP = b'OCP:1.30'  # over current
OPP = b'OPP:05.14' # over power
OAH = b'OAH:9.999' # max capacity
OHP = b'OHP:72:00' # max discharge time
AAA = b'0.22A'     # set current
ON = b'on'         # switch current on
OFF = b'off'       # switch current off
# Open serial port
ser = serial.Serial(
  port='/dev/ttyUSB0', # ttyUSB1?
  baudrate=9600,
  timeout=3,
)
print('Port open? ', ser.isOpen())
# Start communication
print('Start')
ser.write(cstart)
print(ser.readline())
init_list = [LVP, OVP, OCP, OPP, OAH, OHP]
for li in init_list:
  ser.write(li)
  print(ser.readline())
print('Read protection settings')
ser.write(cread)
print(ser.readline())
# switch current on
ser.write(ON)
print('Start collecting data')
ser.write(cstart)
print(ser.readline())
# read n data lines
n = 50
for i in range(1,n):
  rawResult = (ser.readline())
  print(i, rawResult)

Erste Messungen

Die Stromlast deckt ein weites Einsatzspektrum ab. Der XY-FZ35 testet Batterien und Netzgeräte mit einer Nennspannung von mehr als 1,5 Volt bis zu 24 Volt. Das genügt selbst für große Autobatterien. Da die Leistungsaufnahme auf 35 Watt begrenzt ist, würde sich das Gerät dafür allerdings einige Tage Zeit nehmen.

Im Beispiel aus Abbildung 5 untersucht der XY-FZ35 eine Noname-Li-Ion-Rundzelle der Baugröße 18650. Das Gerät beginnt mit der Aufzeichnung und dem Senden, sobald es die Last einschaltet, und protokolliert deshalb nicht die Leerlaufspannung. Das wäre jedoch ebenfalls möglich, wie wir im Folgenden noch erläutern.

Im Beispiel fließt der Strom konstant mit 700 Milliampere, weshalb Spannung und Leistung (also das Produkt aus Spannung und Strom) unmittelbar korrelieren. Bei 2,0 Volt schaltet das Gerät entsprechend seiner Voreinstellung ab. Der Spannungseinbruch in der Messkurve charakterisiert die Ladeschlussspannung, die nicht unterschritten werden sollte. Sie liegt hier bei 2,5 Volt und identifiziert den Typ als Li-Ionen-Akku. Bei einem Lithium-Polymer-Akku läge sie mit 3,3 Volt deutlich höher.

Abbildung 5: Die mit dem XY-FZ35 ermittelte Lastkurve eines Noname-Li-Ion-Akkus.

Abbildung 5: Die mit dem XY-FZ35 ermittelte Lastkurve eines Noname-Li-Ion-Akkus.

Das Integral über die Leistungskurve, also die Summe über das Produkt aus Zeitintervall und Leistung, liefert für den Energieinhalt der Rundzelle den Wert von 1,9 Wattstunden. Unter Vernachlässigung der Spannung kommt man auf den recht kleinen Kapazitätswert von 0,7 Amperestunden. Vermutlich fehlte aus diesem Grund die Beschriftung des Akkus.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 5 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Raspberry Pi Geek bei Google Play Readly Logo
Nach oben