====== Energiekostenmessgerät KD 302 ======
das KD302 ist inzwischen nichtmehr lieferbar. der grundaufbau ist jedoch bei vielen aehnlichen geraeten der gleiche, die auch auf chips von cirrus logic basieren.
===== Features =====
* preisgünstig (z.B. bei [[http://www.reichelt.de/?;ARTICLE=88135|Reichelt]] für ca. 10 €)
* hohe Messgenauigkeit
* Reverse-Engineering freundlich
* bekannt aus dem Test in [[http://www.heise.de/artikel-archiv/ct/2008/24/226_kiosk|c't 2008/24]] [[http://www.heise.de/ct/artikel/Pulsmesser-291796.html|leseprobe]] (der c't Artikel ist bei Reichelt [[http://www.reichelt.de/?ACTION=7;INDEX=0;FILENAME=D100%252FCT2408226231.pdf|kostenlos zu haben]]!)
===== Motivation =====
Seit dem c't artikel (in dem die Autoren auch schon das Gerät aufgeschraubt und die ersten Details ermittelt haben) war jedem (mir zumindest!) klar, dass das Gerät reverse-engineered und mit einer Datenschnittstelle versehen werden muss.
Leider hat das nach drei Jahren dann doch noch niemand gemacht (und Veröffentlicht!), also muss ich selber ran.
Der Umbau eines KD302 verspricht, ein günstiges und genaues Leistungsmessgeraet mit Datenschnittstelle.
Bei einem Eigenbau solch eines Gerätes währe idr. schon alleine das Gehäse (oder ein Mess-IC, so man eins verwendet) teurer, als das ganze KD302!
Der verwendete CS5460A beinhaltet A/D Konverter für Strom/Spannung mit 4k Samples/Sek. Bei 4.096Mhz Taktung, mit einer schnelleren Taktung des CS5460A ließe sich das ggfs. noch erhöhen. 4k Samples/Sek entsprechen 80 Samples/Vollwelle. Man vergleiche die ärmlichen 16 des [[http://www.ladyada.net/make/tweetawatt/parser.html|tweet-a-watt]]).
Diese Daten lassen sich auslesen, so dass man die Strom/Spannungs-kurven angeschlossener Geräte ermitteln kann.
===== Umbau =====
==== Optionen ====
Aus den [[#hardware_reverse_engineering|unten]] ermittelten Details, ergeben sich Probleme für den Einbau einer Schnittstelle:
* der Impulsausgang des CS5460A kann ohne Änderung der Programmierung nicht genutzt werden
* der vorhandene Controller (OTP) kann nicht umprogrammiert werden
* wenn man die Originalfunktionen des Geräts erhalten will, muss der Originalcontroller weiter mit dem CS5460A kommunizieren können
es ergeben sich einige Ansätze:
* Originalcontroller und Display stillegen, und:
* den CS5460A per EEPROM konfigurieren und einen S0-Ausgang einbauen
* einen eigenen Controller einbauen, der mit dem CS5460A kommuniziert
* die Originalfunktionen erhalten, und:
* einen eigenen Controller einbauen, der auch die Ansteuerung des Displays übernimmt (extremer Umbauaufwand, und braucht 25 I/O-leitungen für das Display)
* einen eigenen Controller einbauen, der nur die SPI-Kommunikation mitliest
* einen eigenen Controller als Proxy zwischen Original-Controller und CS5460A einbauen
* der Proxy könnte einfach einen Initialisierungsbefehl einfügen der den Impulsausgang nutzbar macht, das wäre aber eine unattraktive Lösung, da der eigene Controller die Daten auch über eine beliebige Schnittstelle (isolierte serielle, RF, zigbee, Bluetooth, WLAN, ...) ausgeben könnte.
Ich bevorzuge die Proxy-Variante, um alle Funktionen des CS5460A nutzen zu können.
Eine galvanische Trennung irgendwo zwischen CS5460A und Datenausgang ist erforderlich.
Es kommt manchmal die Idee auf, die SPI-Schnittstelle des CS5460A zu isolieren, dies scheint mir jedoch unattraktiv, da hier (vor allem wenn wir alle Strom/Spannungs-Momentanwerte mitlesen wollen!) relativ hohe Datenraten vorliegen, außerdem besteht die Schnittselle aus sechs Leitungen. Dies würde relativ teurere Dausteine für eine Isolierung erfordern. Gegeigneter erscheint mir, einen Controller auf der Netzpotential-Seite zu verbauen, und dann den Datenausgang selbst zu isolieren. Im Idealfall einfach dadurch, dass er selbst über Funk kommuniziert.
==== Hardware ====
=== Anschlüsse ===
Einbau eines Controllers und Durschschleifen der Signale
ich habe eine KD302 Platine umgebaut (mit Cuttermesser, Dremel und Bohrmaschine, feinem Draht, Lötkolben), und die unnützen [[#anschluesse|SIP1-3 Anschlüsse]] durch einen Anschluss ersetzt, durch den alle Verbindungen zwischen Controller und CS5460A durchgeschleift sind (bis auf den ungenutzten Impulsausgang).
Die "Präzisions"-Stift/Buchsenleisten sind... präzise, zuverlässig... und stapelbar, um einen grösseren Abstand der Platinen zu erreichen.
{{:hardware:channels:meters:power:kd320:kd302_hacked_comp.jpg?300}}
{{:hardware:channels:meters:power:kd320:kd302_hacked_sold.jpg?300}}
{{:hardware:channels:meters:power:kd320:kd302_custom_connector.png?300}}
Und eine Tochterplatine mit eigenem Controller gebaut, die auf den neuen Anschluss, sowie J1 aufgesteckt wird (auf dem Bild ist der SPI-bus noch nicht verdrahtet, das Loch war für den Elko auf der Platine gedacht, aber bei entsprechendem Abstand passt es auch ohne):
{{:hardware:channels:meters:power:kd320:kd302_addonproto_comp.jpg?450}}
{{:hardware:channels:meters:power:kd320:kd302_addonproto_sold.jpg?450}}
=== Schnittstelle ===
Eine Funkschnittstelle (rf/BT) wäre am interessantesten, ist aber etwas komplexer.
für den Anfang habe ich ein galvanisch getrenntes UART-Interface gebaut. Das ist ein eigenes Unterprojekt und werde ich an anderer Stelle zu dokumentieren. Die aktuelle Variante funktioniert nur mit maximal 9600 Baud.
{{:hardware:channels:meters:power:kd320:kd302_opto_uart.jpg?450}}
{{:hardware:channels:meters:power:kd320:kd302_opto_uart_phase.jpg?450}}
Man beachte die Glimmlampe im Phasenpruefer - die Schnittstelle auf KD302-Seite liegt auf Netzpotential! das USB-Kabel ist an einen PC angeschlossen.
In einer "fertigen" Version sollte sich natürlich der gesamte Netzpotential-Teil innerhalb des Gehäuses befinden!
===== hardware / reverse engineering =====
==== LCD Controller ====
* EM78P468N ("LCD Type")
* Datenblätter & Infos: [[http://www.emc.com.tw/eng/st_8bit.asp|1]], [[http://www.saiyimcu.com/products/upfile/2007611212810.pdf|2]], [[http://www.datasheetcatalog.org/datasheets2/15/1527527_1.pdf|3]]
* OTP (One Time Programmable) ROM
* inkl. Schutz gegen Auslesen des Programmcodes (wer Lust hat kann ausprobieren ob er benutzt wird ;))
==== EEPROM ====
{{:hardware:channels:meters:power:kd320:kd302_eeprom.jpg?450}}
{{:hardware:channels:meters:power:kd320:eeprom_pinout.png?450}}
* 24c02: Standard I2C EEPROM (2kbit)
* [[http://www.dzsc.com/uploadfile/company/51028/2007122112831434.pdf|Datenblatt]]
* hier dürften die Kalibrationsdaten für den CS5460A abgelegt sein
* speichert das gerät irgendwelche Daten über einen Wegfall der Stromversorgung hinweg?
* ist mit dem Controller verbunden, nicht mit dem CS5460A
* I2C-Bus an J1 abgreifbar.
Nach Auftrennen von SDA/SCL zwischen Controller und EEPROM zeigt das Gerät konstant 0W an.
Zugriff auf das EEPROM per [[http://dangerousprototypes.com/docs/Bus_Pirate|BusPirate]], hier in einem Gerät in dem ich SDA/SCL vom Controller getrennt habe.
Es geht auch ohne die Leitungen zu aufzutrennen (natürlich ist I2C multimaster-fähig, wenn korrekt implementiert, außerdem greift der Controller im Betrieb wohl eh nicht auf das EEPROM zu).
{{:hardware:channels:meters:power:kd320:kd302_eeprom_buspirate.jpg?450}}
{{:hardware:channels:meters:power:kd320:kd302_eeprom_buspirate_2.jpg?450}}
Das Alignment der Daten sieht etwas nach einem off-by-one in der Addresse aus?! Liegt wohl daran, dass 3-Byte Werte gespeichert werden und an chinesischen Programmierern...
I2C>[0b10100000 0 0]
I2C START BIT
WRITE: 0xA0 ACK
WRITE: 0x00 ACK
WRITE: 0x00 ACK
I2C STOP BIT
I2C>[0b10100001 r:256]
I2C START BIT
WRITE: 0xA1 ACK
READ:
Inhalt aus dem 1. Gerät:
(ich hatte beim herumspielen versehentlich die ersten drei byte ueberschrieben, scheinen aber eh immer 0x54 0xFF 0xFF zu sein )
0x?? 0x?? 0x?? 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0x00
0x24 0x24 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0x15
0x8C 0x71 0xFF 0xB5 0x62 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0x00
0x44 0xCA 0x00 0x01 0x4A 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0x3D
0x82 0xEF 0x3D 0x10 0x00 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0x00
Inhalt aus dem 2. Gerät:
0x54 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0x00
0x24 0x24 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0x16
0x5B 0xB1 0xFF 0xC0 0xF4 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0x00
0x3F 0x60 0x00 0x01 0x2F 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0x3E
0x87 0xFF 0x40 0xD9 0x86 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0x00
Inhalt aus dem 3. Gerät:
0x54 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0x00
0x24 0x24 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0x16
0x78 0x9C 0xFF 0xCC 0xE0 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0x00
0x7F 0xA4 0x00 0x01 0x3D 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0x3E
0x77 0xFF 0x3E 0x94 0x80 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0x00
==== Messcontroller ====
* CS5460A : Single-Phase, Bi-Directional Power/Energy IC, http://www.cirrus.com/en/products/cs5460a.html
* Datenblatt: http://www.cirrus.com/en/pubs/proDatasheet/CS5460A_F5.pdf
* Anbindung über serielles Interface (lt. Datenblatt SPI kompatibel)
* kalibrierung per Software
{{:cs5460a.png?600}}
{{:kd302_signals.jpg?300}}
=== Messungen ===
Bei Messungen im Betrieb ist Vorsicht geboten, mangels galvanischer Trennung liegt quasi alles im Gerät auf Netzpotential!
Es empfiehlt sich einfach die 220V Anschlüsse frei zu lassen und stattdessen eine externe 5V Versorgung anzuschliessen (z.B. einfach an die äußeren Pins von J1).\\ Dann läuft das Gerät, auch wenn es natürlich keine sinnvollen Messwerte mehr produziert. Messungen im Netzbetrieb sollte man dann darauf reduzieren können zu prüfen ob das Verhalten im Netzbetrieb übereinstimmt.
Im Betrieb ca. einmal pro Sekunde ein Signal auf INT, und (daraufhin?) eine kurze Kommunikation auf dem seriellen Interface (vermutlich signalisiert der CS5460A die Verfügbarkeit neuer Daten, die der Controller dann abholt).
{{:kd302_spi-clock.jpg?300|Messung SCLK signal... (Nachahmung dieses Aufbaus nicht empfohlen!}}
{{:kd320_sdo_safe.jpg?300|Messung SDO signal... (sichere Methode!)}}
{{:hardware:channels:meters:power:kd320:kd302_spi_buspirate.jpg?300}}
Folgende schöne Ansicht ergibt sich im [[http://dangerousprototypes.com/docs/Logic_analyzer_mode|Logic Analyzer Modus]], getriggert auf das INT Signal auf Kanal 4:
{{ :hardware:channels:meters:power:kd320:kd302_spi_cycle_v2.png?900 }}
^Controller -> CS5460A^CS5460A -> Controller^Beschreibung^
| 0x5E / 0b01011110 | - | Write Register 15 (SREG) (Datenblatt 4.1.7) |
| 0x80 / 0b10000000 ,0x00,0x00 | - | oberstes Bit im SREG = DRDY, Flag für Daten verfügbar, wird durch Schreiben einer 1 gelöscht.\\ So dass das Interruptsignal zurück gesetzt wird (siehe Kanal 4, Datenblatt 3.4 , 5.11) |
| 0x16 / 0b00010110 | - | Read Register 11 (RMS current) |
| - | 0x00,0x04,0x74 | 24-bit signed-int Wert (Datenblatt 4.6) |
| 0x18 / 0b00011000 | - | Read Register 12 (RMV voltage)
| - | 0x01,0x0C,0x94 | 24-bit signed-int Wert (Datenblatt 4.6) |
| 0x14 / 0b00010100 | - | Read Register 10 (E (energy))|
| - | 0xFF,0xFF,0xFE | 24-bit signed-int Wert (Datenblatt 4.6) |
Werte nicht sinnvoll da keine Netzspannung angeschlossen!
Irgendwann lief dann auch mal der [[http://dangerousprototypes.com/docs/SPI#SPI_Bus_sniffer|SPI Sniffer Mode]]...
$ serialclient -r 115200 /dev/ttyUSB0
HiZ>m5
Set speed:
1. 30KHz
2. 125KHz
3. 250KHz
4. 1MHz
(1)>4
Clock polarity:
1. Idle low *default
2. Idle high
(1)>
Output clock edge:
1. Idle to active
2. Active to idle *default
(2)>
Input sample phase:
1. Middle *default
2. End
(1)>
CS:
1. CS
2. /CS *default
(2)>
Select output type:
1. Open drain (H=Hi-Z, L=GND)
2. Normal (H=3.3V, L=GND)
(1)>
Ready
SPI>(0)
0.Macro menu
1.Sniff CS low
2.Sniff all traffic
SPI>(1)
Sniffer
Any key to exit
[0x00(0x5E)0x00(0x80)0x00(0x00)0x00(0x00)0x00(0x16)0x00(0xFF)0x01(0xFF)0xE9(0xFF)]
[0x00(0x18)0x00(0xFF)0x8E(0xFF)0x45(0xFF)]
[0x00(0x14)0xFF(0xFF)0xFF(0xFF)0xFF(0xFF)]
[0x00(0x5E)0x00(0x80)0x00(0x00)0x00(0x00)0x00(0x16)0x00(0xFF)0x01(0xFF)0xFA(0xFF)]
[0x00(0x18)0x00(0xFF)0x8C(0xFF)0xC8(0xFF)]
[0x00(0x14)0xFF(0xFF)0xFF(0xFF)0xFF(0xFF)]
Das sind die gleichen anfragen wie oben. Und dann nach einem Reset des Controllers, endlich die gesuchte Initialisierungssequenz (Hier aus meinem Gerät Nr. 1, dazugehöriger EEPROM Inhalt siehe oben):
[0x00(0x46)0x00(0x15)0x00(0x8C)0x00(0x71)0x00(0x42)0x00(0xFF)0x00(0xB5)0x00(0x62)]
[0x00(0x62)0x00(0x00)0x00(0x44)0x00(0xCA)0x00(0x60)0x00(0x00)0x00(0x01)0x00(0x4A)]
[0x00(0x4A)0x00(0x00)0x00(0x0F)0x00(0xA0)0x00(0x48)0x00(0x3D)0x00(0x82)0x00(0xEF)0x00(0x44)0x00(0x3D)0x00(0x10)0x00(0x00)0x00(0x40)0x00(0x01)0x00(0x00)0x00(0x01)0x00(0x5A)0x00(0x83)0x00(0x12)0x00(0x6E)0x00(0x78)0x00(0x00)0x00(0x00)0x00(0x40)0x00(0x74)0x00(0x80)0x00(0x00)0x00(0x00)0x00(0xE8)0x00(0x00)0x01(0x00)0x01(0x00)]
# und dann wieder das uebliche:
[0x01(0x5E)0x00(0x80)0x01(0x00)0x00(0x00)0x00(0x16)0x00(0xFF)0x01(0xFF)0x66(0xFF)]
[0x00(0x18)0x00(0xFF)0x67(0xFF)0x6B(0xFF)]
[0x00(0x14)0xFF(0xFF)0xFF(0xFF)0xFF(0xFF)]
(...)
Nach Datenblatt:
[
0x46 0b01000110 write register 3 (Voltage Channel DC Offset)
0x15 0b00010101
0x8C 0b10001100 : aus eeprom, offset 0x2F
0x71 0b01110001
0x42 0b01000010 write register 1 (Current Channel DC Offset)
0xFF 0b11111111
0xB5 0b10110101 : aus eeprom, offset 0x32
0x62 0b01100010
]
[
0x62 0b01100010 write register 17 (Voltage Channel AC Offset)
0x00 0b00000000
0x44 0b01000100 : aus eeprom, offset 0x3F
0xCA 0b11001010
0x60 0b01100000 write register 16 (Current Channel AC Offset)
0x00 0b00000000
0x01 0b00000001 : aus eeprom, offset 0x42
0x4A 0b01001010
]
[
0x4A 0b01001010 write register 5 (Number of A/D cycles per computation cycle)
0x00 0b00000000
0x0F 0b00001111 : dezimal 4000
0xA0 0b10100000
0x48 0b01001000 write register 4 (Voltage Channel Gain)
0x3D 0b00111101
0x82 0b10000010 : aus eeprom, offset 0x4F
0xEF 0b11101111
0x44 0b01000100 write register 2 (Current Channel Gain)
0x3D 0b00111101
0x10 0b00010000 : aus eeprom, offset 0x52
0x00 0b00000000
0x40 0b01000000 write register 0 (Configuration)
0x01 0b00000001 : phase compensation=0 (default), PGA gain = 50
0x00 0b00000000 : alles defaults... betrifft EOUT/EDIR, INT=active low,level
0x01 0b00000001 : filters disabled (?!), clock divider = 1
0x5A 0b01011010 write register 13 (Timebase Calibration)
0x83 0b10000011 : dieser wert steht NICHT im eeprom!
0x12 0b00010010 : lt. datenblatt skalierter wert zw. 0 und 2
0x6E 0b01101110 : der wert entspricht wohl 8589934/16777216*2 = 1.02398, das ist gerade 4096/4000
0x78 0b01111000 write register 28 (Control)
0x00 0b00000000 : alls nur reserved bits
0x00 0b00000000 : ebenso (und nicht relevantes autoboot bit)
0x40 0b01000000 : MECH=1 "widens EOUT and EDIR pulses for mechanical counters." ??!!
0x74 0b01110100 write register 26 (Mask)
0x80 0b10000000 : INT erzeugen wenn DRDY gesetzt
0x00 0b00000000 : alle anderen quellen aus
0x00 0b00000000 : ...
0xE8 0b11101000 start conversions! continuous mode
==== Impulsausgang ====
EOUT/EDIR ist ein Impulsausgang ("S0-Ausgang"). Im einfachsten Fall kann könnte man ihn benutzen, sofern er vom Controller sinnvoll initialisiert wird werden würde:
Zitat Datenblatt:
> 3.1 Pulse-Rate Output
> As an alternative to reading the real energy through the serial port, the EOUT and EDIR pins provide a simple interface with which signed energy can be accumulated. Each EOUT pulse represents a predetermined quantity of energy. The quantity of energy represented in one pulse can be varied by adjusting the value in the Pulse-Rate Register.
Nachdem ich bei ersten Messungen keine Impulse auf EOUT gesehen hatte, nahm ich an, dass meine Last zu klein war, und versuchte es mit mehreren kW Last. Leider ohne Erfolg. Erst dann stellte ich fest, das meine Last **zu groß** war!
Das "pulse-rate register" wird vom Controller definitiv nicht sinnvoll programmiert. Vermutlich steht es auf Null o.ä.
(**Update:** an der oben analysierten Initialisierungssequenz ist abzulesen: das pulse-rate register wird nicht beschrieben. Dazu wird netterweise noch die Pulsweite auf extra lang eingesstellt, was das Problem noch begünstigt.)
Die Impulsrate liegt über 1 Impuls pro **Wattsekunde**, schon ab ca 2 Watt laufen die Impulse aufgrund der Impulslaenge ineinander, und es entsteht ein Dauerpegel!
{{:hardware:channels:meters:power:kd320:kd320_eout_0w0.jpg?450}}
{{:hardware:channels:meters:power:kd320:kd320_eout_0w5.jpg?450}}
{{:hardware:channels:meters:power:kd320:kd320_eout_1w3.jpg?450}}
{{:hardware:channels:meters:power:kd320:kd320_eout_1w8.jpg?450}}
Somit ist der Impulsausgang ohne Änderungen an der Programmierung definitv nicht nutzbar. Andererseits bedeutet dies auch, dass er vom vorhandenen Controller wohl nicht benutzt wird (obwohl er angeschlossen ist!).
__Möglicherweise__ ist es möglich über Änderungen der Daten im EEPROM den Wert im pulse-rate register zu ändern.
(**Update:** die EEPROM Daten sehen nicht danach aus, als ob man irgendwo einen Wert für das pulse-rate register eintragen könnte.)
Ansonsten wird man um den Einbau eines eigenen Controllers nicht herum kommen. Alternativ könnte man den Standalone-Betrieb des CS5460A nutzen, bei dem er seine Konfiguration aus einem EEPROM liest: Controller (und Display) hinauswerfen, das EEPROM umprogrammieren und direkt mit dem CS5460A verbinden.
==== Netzteil ====
* nicht galvanisch getrenntes Netzteil
TODO: ausmessen, verfügbaren Strom für mögliche Einbauten ermitteln!
==== Anschlüsse ====
=== J1 ===
Steckanschluss für Huckepack-Platine? im Gehäuse ist noch genügend Platz vorhanden!
^Pin^Beschreibung^
|1|GND (bzw. je nach Stecker-Steckrichtung identisch mit 230V-Phase.\\ **Keine galvanische Trennung!** Das kann man nicht oft genug sagen)|
|2|50Hz Signal aus der gegend des netzteils (C22/ZD1)|
|3|"Power" Taste|
|4|"Function" taste|
|5|i2c SCL (EEPROM)|
|6|i2c SDA (EEPROM)|
|7|RESET Eingang des Controllers |
|8|5V Vcc|
=== SPI 1-3 ===
Nur an den Controller angeschlossen (plus jeweils einmal GND), identisch zu den Testpunkten oberhalb des Controllers. Vermutlich Schnittstelle für Test/Kalibrierung beim Hersteller, ohne Dokumentation wohl wenig brauchbar.
==== Bilder der Platine ====
{{:kd302_comp.jpg?450}}
{{:kd302_sold_2.jpg?450}}