weidner/archives/2012/04/

USV wieder aufgegriffen

Als ich mich vor einiger Zeit mit der Signalisierung für die USV von Willy Tarreau beschäftigt hatte, war meine letzte Idee, das Signal über einen I²C-Port-Extender (wie zum Beispiel PCF8574) abzufragen. Eben jener Willy Tarreau, von dem die ursprüngliche Schaltung ohne Signalisierung stammt, brachte mich (nach etlicher Überzeugungsarbeit, ich bin schon etwas stur) auf die Idee, dass ich mit einem I²C-A/D-Wandler, wie dem PCF8591 den LM393 ganz weglassen und die Spannung direkt messen kann. Mit einem kleinen Trick kann ich auch noch eine Aussage zum Stromverbrauch des ALIX-Rechners treffen. Das war letzten Endes einer der Gründe, warum ich mich kürzlich mit diesem Schaltkreis beschäftigt hatte.

Die Schaltung

Schaltung der USV mit PCF8591

Die Schaltung selbst hat sich nur wenig geändert. Zwei analoge Eingänge werden anstelle des LM393 angeschlossen. Dabei verwende ich zwei Eingänge, die ich als Differenzeingänge verwenden kann. Auf diese Weise bekomme ich mit einem umgewandelten Wert heraus, ob der ALIX-Rechner aus dem Netz oder aus der Batterie gespeist wird.

Alternativ kann ich beide Spannungen messen und im Programm vergleichen. Dann frage ich sinnvollerweise die Batteriespannung vor der Ausgangsspannung ab.

Für die Strommessung schleife ich einen kleinen Widerstand ein, an dem eine Spannung proportional zum Strom abfällt. Dadurch ändert sich allerdings die Bezugsspannung, so dass ich die analoge Masseleitung (AGND) nicht mit der digitalen (VSS) verbinden darf. Zwar könnte ich den Widerstand in die Plus-Leitung einschleifen und die an ihm abfallende Spannung über einen dritten Spannungsteiler (analog zu R5/R2 und R4/R3) abfragen, aber dann bekäme ich neben dem erhöhten Aufwand hier nur eine sehr grobe Auflösung des detektierten Stromes.

In meiner Testschaltung betreibe ich die Eingänge AIN0 und AIN1 als normale (single ended) A/D-Wandler um den Absolutwert der Batteriespannung beziehungsweise des Stromes mit der Referenzspannung zu vergleichen. Damit könnte ich im Batteriebetrieb Voraussagen zur Restlaufzeit machen.

Die Eingänge AIN2 und AIN3 betreibe ich in Differenzschaltung und bin eigentlich nur am Vorzeichen des Wertes interessiert, welcher aussagt, ob der Strom aus der Batterie kommt oder vom Netzteil.

Die Werte frage ich dementsprechend mit

Falls ich statt der Differenz direkt die beiden Spannungen haben will, um sie im Programm zu vergleichen, frage ich diese mit

Damit ich auch einen Ausfall der Netzspannung zwischen den beiden Spannungsmessungen feststellen kann, frage ich immer die Batteriespannung vor der Ausgangsspannung ab.

Zur Dimensionierung

Die Ladeschaltung selbst hat sich nicht geändert, es gelten die Angaben aus dem ersten Artikel beziehungsweise aus dem Artikel von Willy Tarreau.

Zur Dimensionierung der Spannungsteiler R5/R2, R4/R3 und von R6 für die Stromüberwachung gehe ich auf die Beschaltung des PCF8591 ein. Die A/D-Wandler vergleichen die analoge Eingangsspannung mit der Referenzspannung (VREF) in 256 Stufen (8 Bit). Dementsprechend sollte die analoge Eingangsspannung nicht über der Referenzspannung (VREF) und nicht unter der analogen Masse (AGND) liegen.

Laut Boardbeschreibung darf die Versorgungsspannung der ALIX-Rechner 7..20 Volt betragen und die maximale Leistungsaufnahme liegt bei etwa 6 Watt.

Die Referenzspannung (VREF) kommt vom I²C-Port des ALIX-Rechners und beträgt 3,3 Volt gegenüber VSS. VSS entspricht der Masseleitung des ALIX-Rechners am heißen Ende von R6. Das bedeutet, das die analoge Referenzspannung gleich 3,3 Volt zuzüglich dem Spannungsabfall an R6 ist. Bei minimal 7 Volt Eingangsspannung und 6 Watt Verlustleistung fließt ein Maximalstrom von weniger als einem Ampere durch R6.

Um den Spannungsabfall an R6 nicht zu groß werden zu lassen, habe ich für diesen 0,27 Ohm verwendet (der war gerade verfügbar). Damit liegt der maximale Spannungsabfall bei weniger als 0,3 Volt und die Referenzspannung für die A/D-Wandler zwischen 3,3 und 3,6 Volt. Diese Spannung geteilt durch 256 ergibt eine Genauigkeit der A/D-Wandler zwischen 13 und 14 mV. Das entspricht an 0,27 Ohm einem Strom zwischen 48 und 52 mA. Das ist die Genauigkeit, mit der ich den Strom messen kann.

Bei maximal einem Ampere reicht für R6 ein Widerstand mit einer maximalen Verlustleistung von einem halben Watt.

Da die Eingangsspannung maximal 20 Volt betragen soll und die Referenzspannung bei 3,3 bis 3,6 Volt liegt, sollte das Verhältnis von R5 zu R2 und von R4 zu R3 1 zu 6 nicht überschreiten. Mit 1 zu 10 habe ich hier noch eine Sicherheitsreserve. Mit der oben angegebenen Genauigkeit der Referenzspannung kann ich damit die Batterie- und Eingangsspannung auf 0,13 bis 0,14 Volt genau messen.

Testergebnisse

Obige Schaltung habe ich auf einem Breadboard zusammengesteckt und anschließend die Werte aus dem PCF8591 im Netz- und Batteriebetrieb gemessen:

# modprobe i2c-dev
# i2cdetect -y 0
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- 48 -- -- -- 4c -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --
# i2cget -y 0 0x48 0x60
0x80

# i2cget -y 0 0x48 0x61
0x3e
# i2cget -y 0 0x48 0x62
0x07
# i2cget -y 0 0x48 0x60
0xdc

# i2cget -y 0 0x48 0x61
0x3d
# i2cget -y 0 0x48 0x62
0x0c
# i2cget -y 0 0x48 0x60
0x01

# i2cget -y 0 0x48 0x61
0x34
# i2cget -y 0 0x48 0x62
0x0d
# i2cget -y 0 0x48 0x60
0x01

# i2cget -y 0 0x48 0x61
0x33
# i2cget -y 0 0x48 0x62
0x0d
# i2cget -y 0 0x48 0x60
0x01

# i2cget -y 0 0x48 0x61
0x3c
# i2cget -y 0 0x48 0x62
0x07
# i2cget -y 0 0x48 0x60
0xdc

Entsprechend obiger Beschaltung habe ich den PCF8591 diesmal an Adresse 0x48 gefunden. Die allererste Abfrage brachte (wie im Datenblatt beschrieben) als Wert 0x80. Danach habe ich bei jeder Abfrage den Wert des Steuercodes der vorigen Abfrage bekommen. Die nächsten drei Abfragen waren mit eingeschaltetem Netzteil, danach mit abgeschaltetem Netzteil, also im Batteriebetrieb und zum Schluss noch einmal mit Strom aus dem Netzteil.

Der erste Wert im Netzbetrieb, 0x3E (dezimal 62) bei Kanal 0, entspricht einer Spannung von 8 .. 9 V an der Batterie. 0x07 bei Kanal 1 entspricht einem Strom von 300 .. 400 mA. 0xDC bei Kanal 3 ist negativ, was bedeutet, dass die Netzspannung an ist. Zum Testen hatte ich ein Labornetzteil mit 12 Volt Ausgangsspannung genommen, was zu der Differenzspannung von 3 .. 4 Volt über R1/D1 passt.

Bei abgeschaltetem Netzgerät habe ich für die Batteriespannung zunächst 0x3d, was geringfügig unter dem vorherigen Wert liegt. Der Strom ist mit ca 600 mA fast doppelt so hoch und die Spannung über R1/D1 entspricht mit 0,1 bis 0,3 V in etwa der Flussspannung der Schottky-Diode.

Bei der folgenden Messserie sinkt lediglich die Batteriespannung. Vor der letzten Serie hatte ich die Netzspannung wieder eingeschaltet und bekam wieder annährend die Ausgangswerte.

Testaufbau USV mit PCF8591

Posted 2012-04-09
Tags: