Ferraris-Drehstromzähler auswerten
Im diesem HowTo wird beschrieben, wie die Daten eines analogen Drehstromzählers (Ferraris-Zähler) per Reflexlichtschranke erfasst und im RPI verarbeitet werden können. Ich habe anstelle des direkten Einlesens des Zählersignals an einem GPOI-Port absichtlich etwas mehr Hardware inkl. des Zählers PCF8583 eingesetzt. Somit es möglich, die Zählwerte mit geringer Rechenleistung des RPI nur einmal die Minute oder Stunde über eine i2c-Abfrage auszulesen.
Blockschaltbild
- Signal der „Drehscheibe“ am Drehstromzähler mit Reflexlichtschranke und Verstärker erfassen. Ein Puls je Umdrehung bei roter Markierung.
- Siganl am RPi mit Monoflop aufbereiten, da die Lichtschranke kein sauberes Signal liefert („prellen“).
- Ereigniszähler PCF 8583 ansteuern
- Zähler per i2c-Bus einlesen. Zyklus dabei frei wählbar: einmal die Minute, Stunde oder Tag.
Datenerfassung am Drehstromzähler
Zur Schaltung:
- Roter Bereich der „Drehscheibe“ am Wechselstromzähler per Reflexlichtschranke CNY 70 erfassen
- Verstärkung des Signals per zweifach Operationsverstärker LM393
- Impuls per LED anzeigen
- Spannungsversorgung erfolgt durch Platine am RPI
- Das Ausgangssignal des OP liegt bei 1,0 Volt (Drehscheibe „rot“) und 3,6 Volt (Drehscheibe „silber“).
- OP-Ausgangssignal wird an einer zweiten Platine RPI weiter verarbeitet
Einstellung der Lichtschranke
Die Einstellung der Lichtschranke am Zähler ist eine etwas knifflige Sache. Die Referenzspannung am Ausgang des Potentiometers wird auf ca. 3,5 Volt (bei 5 Volt Betriebsspannung) voreingestellt. Die Platine wird auf eine Plexiglasscheibe von ca. 30 * 98 mm montiert. Diese Plexiglasscheibe sollte genau in die untere Vertiefung des „Zählerfensters“ passen. Die Platine wird auf dem Plexiglas so befestigt, dass sie mittig über der Drehscheibe plaziert wird.
Die Plexiglasscheibe mit der Platine kann nun sehr einfach horizontal über der Drehscheibe verschoben werden. Das Potentiometer wird dabei dann so justiert, dass bei einer Positionierung über der Drehscheibe die LED aus ist. Bei geringer Verschiebung nach oben oder nach unten geht die LED an. Bei korreter Plazierung und Einstellung des Potis leuchtet die LED wenn die rote Markierung erscheint.
Signalaufbereitung am RPI
Optimierung des OP-Ausgangssignals
Da bei einem Durchlauf der roten Markierung je nach Justierung der OP mehr als einen Impuls liefert, muss das Signal „entprellt“ werden. Dazu wird der NE555-Monoflop angesteuert. Er erzeugt einen Implus von ca. 400 ms (t = R * C + 1,1). Wenn also nun bei der Durchlauf der roten Markierung kurzzeitig nacheinander mehrere Impluse erzeigt werden, „glättet“ der Monoflopp diese zu einem Impuls.
Der NE555 benötigt ein Low im Bereich von 0-1,6 Volt und ein High an Pin 2 von 3,4 -5 Volt. Die Ausgangsspannung des OP mit 1,0 Volt Low und 3,6 Volt High liefert also genau die passenden Pegel.
Ansteuerung ein i2c-Zählers PCF8583
Der PCF8583 ist ein Uhrenbaustein (RTC) der als Ereigniszähler genutzt wird. Anstelle des Uhrenquarzes wird hier am PIN 1 „OSCI“ der Zähltakt aus dem Ausgang des Monoflop eingespeist.
Datenabfrage des i2c-Ereigniszählers
Mit jeder Umdrehung des Wechselstromzählers wird nun ein Impuls erzeugt, der von dem Ereigniszähler erfasst wird.
Die i2c-Tools sind dazu auf dem RPI zu installieren. Beschreibung siehe Internet.
Nach dem Anschluss der Platine an den i2c-Bus des RPI wird zunächst getestet, ob der PCF8583 an Adresse 0x50 oder 0x51 zu finden ist:
Bei korrekter Installation der i2c-Tools und der Zusatzplatine wird der PCF8583 an Adresse 0x50 oder 0x51 im Hexdump angezeigt.
Der PCF8583 wird nun mit der Funktion „Ereigniszähler“ gesetzt. Dazu wird an Adresse 0x51 in das Funktionsregister an Speicherstelle 0x00 der Wert 0x20 geschrieben:
Im zweiten Schritt wird dann der Speicher des Zählers an Adresse 0x01 / 0x02 und 0x03 auf 0x00 gesetzt (Reset des Zählers) :
Die eingehenden Impulse werden nun gezählt.
Das Auslesen des Zählers erfolgt durch Abfrage der Werte in den 3 Speicherzellen:
Die Daten werden in den 8-Bit Speicherzellen im BCD-Code abgelegt. Das je 4-Bit große Lowerbyte und Highbyte enthält je eine Dezimalzahl. Die Speicherzelle 0x01 kann somit Werte von 00-99 zählen, also Einer und Zehner-Stelle. Speicher 0x02 : Hunderter und Tausender.
Zähler anhalten / Pause:
Weitere Verarbeitung der Daten
Zähler beim booten des RPi aktivieren
Beim booten des RPI wird über die Datei /etc/init.d/rc.local die Ereigniszählerfunktion gesetzt und der Zähler zurück gesetzt. Dazu werden folgende Shell-Befehle am Ende der Datei „rc.local“ ergänzt:
# pcf8383 als Ereigniszähler setzen. Baustein befindet sich an Adresse 51. Das Funktionsregister an Adresse 0x00 wird dazu mit dem Wert 0x20 beschrieben.
i2cset -y 1 0x51 0x00 0x20
# Zähler reset. Ram an Adresse 0x01 /0x02 /0x03 wird dazu auf 0x00 gesetzt
i2cset -y 1 0x51 0x01 0x00
i2cset -y 1 0x51 0x02 0x00
i2cset -y 1 0x51 0x03 0x00
Die Impulse am Eingang „OSZI“ werden nun gezählt.
Zähler mit python auslesen
Dazu ist zunächst smbus zu installieren:
Python-Programm Auszug
Das vollständige Programm befindet sich im Anhang.
bus = smbus.SMBus (1)
DEVICE = 0x51 # Geraete Adresse 51
CONTROL = 0x00 # Steuerregister
speicher_1 = 0x01# hier wird im BCD-Code das Zählergebnis abgelegt. je 4 Bit eine Zahl; zählt also 00 - 99
speicher_2 = 0x02
bus.write_byte_data (DEVICE,CONTROL,0x20) # Funktion "Ereigniszähler" setzen
## Zähler Reset, oder auf beliebigen Wert setzen
bus.write_byte_data (DEVICE,speicher_1,0x00)
bus.write_byte_data (DEVICE,speicher_2,0x00)
x= (bus.read_byte_data (DEVICE,speicher_1))
y= (bus.read_byte_data(DEVICE,speicher_2))
# Umwandlung BCD-Code nach Dezimal
zaehlwert= int(x & 0x0F) + int((x &0xF0)>> 4)* 10 + int(y & 0x0F)* 100 + int((y &0xF0)>> 4)* 1000
print zaehlwert
Alles anzeigen
Mit dem im Anhang beigefügten Python-Programm wird der Zähler in einer Endlosschleife abgefragt. Pro Impuls wird dann der Zählerstand, die binären Inhalte des Zählers an 0x01 und 0x02 und die Uhrzeit.
Da bei jedem Impuls eine Ausgabe erfolgt, wir eine Fehlermeldung ausgegeben, wenn sich der Zählerstand um mehr als +1 erhöht.
Fehlerhafte Zählung beim "Überlauf" der Speicherzellen
Wir der Zähler mit Dauerschleife abgefragt, so zeigt sich beim Übertrag von Speicher 0x01 auf 0x02 also Dezimal von 99 auf 100 ein Fehler. Die beiden Speichestellen werden dabei zeitlich nacheinander verändert und nicht zeitgleich. Beim Übergang von 99 auf 100 wird also der Speicher 0x02 wird auf 1 gesetzt und erst danach wird Speicher 0x01 auf 0 gesetzt, so dass kurzzeitig der Zählwert 199 angezeigt wird. Anzeige also 99, 199, 100. Bei Abfrage per Dauerschleife muss dieser Fehler per Software abgefangen werden. Gleiches gilt für den Übertrag von 0x02 auf 0x03.
Nach Anschluss an den Zähler, sollte man das Programm mal ein paar Tage laufen lassen. Der Zählerstand darf sich jeweils nur um 1 zum vorherigen Stand erhöhen. Falls der Zähler 2 oder mehr erhöht wird, zählt der Fehlerspreicher hoch. Dann ist die Signalabnahme vermutlich unsauber; so eine Art „prellen“.
Anlage:
- Schaltplan für die beiden Platinen.
- Python-Porgramm
- Bilder der Zählermontage
Hoffe die Beschreibung hilft...
Gruß
Dieter