Powerline mit AVR
Hier soll ein Projekt zur Entwicklung eines einfachen, modularen Powerline-Moduls mit einem AVR entstehen.
Bisherige Diskussion siehe: [1]
Hardware
Anforderungen
- Sollte für UP-Dose und Hutschiene geeignet sein
- Für UP-Dose kommt man vermutlich nicht um SMD Bauteile herum
- Modularer Aufbau: Einheitliches Basismodul durch Stapeln erweiterbar
- Überlastschutz (Temperaturüberwachung am Triac)
- Die Module arbeiten dezentral
- Die Abfrage und Steuerung der Module ist über ein Modem möglich
- Das Modul hat mehrere Funktionen die durch Software parametrierbar sind
- als Zeitschalter (Einschaltverzögerung, Ausschaltverzögerung)
- als Ein/Ausschalter (schaltet im Nulldurchgang)
- Eingänge: Taster
- Ausgänge: 230V Schaltausgang
Hinweise
- Stromleitungen sind keine Datenleitungen und strahlen das aufmodulierte Signal in die Umgebung ab.
- Es können Funkdienste gestört werden. (Polizei, Feuerwehr, Rettungsdienst)
- Stromleitungen werden als Datenleitungen missbraucht.
- Nicht umsonst haben sich viele Energieversorger vom PLC Markt zurückgezogen.
- (scheinbar niederfreqentes Datensignal => weniger Störung)???
- Die Module sollten so konzipiert werden dass sie die Vorschriften in DIN EN 50065-1 VDE 0808 einhalten: C-Band von 125-140 KHz, CSMA/CD - Protokoll, max. 116 dbµV (evtl Probleme durch zu hohen Sendepegel und durch evtl entstehende Oberwellen, da AVR keinen Sinus liefert, sondern dies mehr oder wenig durch das LC-Filter erledigt wird)
Mindestvoraussetzungen an den AVR
- UART
- 2 externe Interrupts
- Analogkomparator
- PWM
In Frage kommen (nicht vollständig):
AVR | Flash | UART | A-Comp | ADC | PWM | INT |
---|---|---|---|---|---|---|
ATtiny2313 | 2k | 1 | 1 | - | 4 | 2 |
ATmega8 | 8k | 1 | 1 | 8 | 3 | 2 |
ATmega128 | 128k | 2 | 1 | 8 | 8 | 8 |
neue AVR Typen low Power mit hi-speed PWM: ATtiny461
Funktionsweise (vgl TDA5051)
- Modulation:
Der AVR moduliert auf die Netzspannung ein 140 kHz Signal. Die 140 kHz werden über den PWM-Ausgang erzeugt und anschließend verstärkt. Der PWM-Ausgang wird mittels INT0 getaktet. Durch eine Verbindung mit TXD werden somit schon alle Daten der UART auf das Netz moduliert.
- Demodulation:
Über ein RC-Filter (neue Version: LC-Filter) wird die Netzspannung nach hochfrequenten Anteilen durchsucht. Die Spannung wird von einem Transistor verstärkt und dann mit 2 Schottkydioden gleichgerichtet. Eine Siliziumdiode begrenzt das Signal noch auf ca. 0,5V. Das Signal wird anschließend dem AVR-Komparator zugeführt (neue Version ADC-Konverter). Über einen (software-) PWM-Ausgang kann die Schaltschwelle eingestellt werden. Das dekodierte Signal liegt dann an PD4 an und geht in die UART.
- Phasenanschnitt:
Über 2 x 1 MOhm Widerstände wird mittels INT1 die Netzfrequenz abgetastet. Bei jedem Nulldurchgang wird ein Zähler auf 255 gesetzt. Dieser zählt mittels Timer (alle 64 µs) auf ca. 100 herunter. Stimmt der Zähler mit dem Ausgangswert des jeweiligen Kanals überein, so wird ein Zündimpuls zum Triac ausgegeben.
Module
Basismodul UP-Dose
Hier mal ein erster Vorschlag (noch nicht vollstandig) für ein UP Basismodul mit SMD-Technik:
Kann mal jemand mit OP-Amp-Kenntnissen kontrollieren, ob die Sendeendstufe so funktioniert?
- OP-Amp würde ich lieber einen Input per Spannungsteiler auf 2,5V legen. Bitte unbedingt auch mal den neuen Schaltplan im Downloadbereich meiner Projektseite ansehen (LC Input Filter)
- http://www.k13zoo.de/vdr/homeautomation/download/
- (erledigt)
Anmerkung: Der OP vom Typ 741 kann nicht bis an die Versorungsspannung ausgesteuert werden. In diesem Fall wird der Ausgang den 0V Pegel nicht erreichen. Die minimale Spannung wird bei ca. 1,5 V liegen.
- Ist das so schlimm? Die Schwankung sollte doch reichen, oder?
--> Vorschlag OP Typ Rail-to Rail Input and Output TS922 (dual, 12V 80mA out)
Warum wurde die Transistorschaltung durch einen OP ersetzt. Welche Vorteile bringt dies?
- Weniger Überkreuzungen, weniger Platzverbrauch, weniger zu löten.
Im Eingangskreis halte ich eine OP-Schaltung für geeignet. Dort könnte mit dem OP-Schaltung die aufmodulierte Frequenz durch einen Bandpass gefiltert werden. Gruß Reinhold
- Kannst du dafür einen richtig dimensionierten Schaltplan zeichnen?
Schutz vor Überspannung einplanen, z. B. Dioden -->
Evtl kann man einen 2-Fach OP verwenden und den zweiten als Eingangsverstärker bzw. Gleichrichter verwenden.
- Dann müsste die Empfangsstufe aber auch die ungeregelte Eingangsspannung als Quelle für den OP verwenden.
Update: Was haltet ihr von dem Board als Standard für UP-Dosen? Habe versucht es so zu designen, dass auch eine erweiterte Version mit ATmega8 möglich ist.
--> einfachere Stromversorgung ohne galvanische Trennung: Supertex SR086 /SR087
Das Board halte ich für zu groß, da ich glaube, dass du keinen Platz mehr zum Anklemmen der Leitungen hast.
- So besser?
Ich würde auf einen ATmega umsteigen, da dieser einen AD-Wandler hat, der dann evtl. die Abtastung des Trägers übernimmt. Außerdem hat er mehr Speicher
neue Typen: ATtiny 261, 461 im SO20 (oder ATtiny 15 im SO8)
- Ich wollte eine Ultra-Low-Cost-Version mit ATtiny2313 (hat außerdem 4 PWM!) und eine mit ATmega8.
- Mit Standard meine ich eigentlich die Abmessungen und Anschlussbelegung des Boards. Wenn es ausgereift ist, könnte man größere Mengen herstellen lassen um Kosten zu sparen.
Ist es überhaupt nötig, die Abtastung separat zu machen? Der UART tastet doch auch schon 16 mal pro Bit ab. Man müsste dann nur den Offset einstellen können.
Eagle | Eagle |
Part Value Device Package Library Reichelt
B1 B-DIL B-DIL rectifier B80C800DIP C1 220µF CPOL-EUE5-10.5 E5-10,5 rcl RAD 220/25 C2 33nF 630V C-EU102-043X133 C102-043X133 rcl MKS-4-1000 33N C3 33nF C-EUC1206 C1206 rcl X7R-G1206 33N C5 100pF C-EUC1206 C1206 rcl NPO-G1206 100P C6 10nF C-EUC1206 C1206 rcl X7R-G1206 10N C7 1nF C-EUC1206 C1206 rcl NPO-G1206 1,0N C8,C11 22µF CPOL-EUE2-5 E2-5 rcl C9,C10 100nF C-EUC1206 C1206 rcl X7R-G1206 100N D1,D4 Schottky DIODE-D-2.5 D-2.5 diode D3 1n4148 DIODE-D-2.5 D-2.5 diode 1N 4148 F1 SHK20L SHK20L fuse PL 120000 IC1 uA741D uA741D SO08 linear µA 741 SMD IC2 78L05 78XXS 78XXS v-reg µA 78L05 IC3 ATTINY2313-20S ATTINY2313-20S SO20L avr ATTINY 2313 SO JP1 AVR-ISP-6 AVR-ISP-6 AVR-ISP-6 atmel L1 47µH L-EU0204/7 0204/7 rcl SMCC 47µ L2 47µH L-EUL4532P L4532P rcl LQH3C 47µ LED1 LED3MM LED3MM led Q1 4MHz CRYTALHC49S HC49/S crystal 4-HC49U-S R1,R17 10k R-EU_0207/2V 0207/2V rcl R2 2k2 R-EU_0207/12 0207/12 rcl R3 R-EU_R1206 R1206 rcl R4,R7 10k R-EU_R1206 R1206 rcl SMD 1/4W 10K R6 470k R-EU_M1206 M1206 rcl SMD 1/4W 470K R8 1k R-EU_0207/5V 0207/5V rcl R9 20k R-EU_R1206 R1206 rcl SMD 1/4W 20K R10 51k R-EU_R1206 R1206 rcl SMD 1/4W 51K R18 100k R-EU_0207/2V 0207/2V rcl SMD 1/4W 100K SV1,SV2 FE10-1 FE10 con-lsta BL 1X10G8 2,54 T4 BC847A-NPN-SOT23-BEC SOT23-BEC transistor BC 847A SMD TR1 9V EE20-1 EE20-1 trafo EE 20/6,1 109 X1 AK500/3 AK500/3 con-ptr500 AKL 101-03
Phasenanschnitt UP-Dose
USB-Modul UP-Dose
Basismodul Hutschiene
Software
Protokoll
Das Protokoll ist multimasterfähig, jedes Paket muss quittiert werden. Kommt keine oder eine fehlerhafte Quittierung an, so wird ein paar mal versucht das Paket nochmal zu senden. Eine Sequenznummer garantiert die einmalige Verarbeitung, selbst wenn das Paket öfter empfangen wurde.
Protokollaufbau
Byte | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | Funktion |
---|---|---|---|---|---|---|---|---|---|
1 | 0 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | Header: "R" |
2 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | Header: "P" |
3 | C | C | C | C | L | L | L | L | C, wie oft das Paket wiederholt gesendet wurde (wegen ausbleibenden Ack). L: Länge der Payload bis zum CRC-Byte (also mindestens 3) |
4 | A | ID | ID | ID | ID | ID | ID | ID | Ack-Flag, Destination ID |
5 | 0 | ID | ID | ID | ID | ID | ID | ID | Source ID |
6 | x | x | x | x | x | x | x | x | Sequenznummer |
L - 3 Bytes | x | x | x | x | x | x | x | x | Daten |
L + 4 | x | x | x | x | x | x | x | x | CRC ab Byte 3 |
Zuerst wird nach dem Header gescannt (bei Manchestercodierung müssen wahrscheinlich vor dem Header noch ein paar Dummy-Daten gesendet werden, damit sich die AGC einstellt)
Dann kommt die Länge und der wievielte Versuch dies ist, dieses Paket zu übertragen.
Die Moduladresse hat momentan 7 Bit (also 128 Module), ein Bit ist zur Signalisierung, dass dies ein Ack-Paket ist. Das Gerät für welches das Ack-Paket bestimmt ist, löscht sein aktuell zu sendendes Paket aus dem Sendepuffer, da es weiß, dass seine Daten erfolgreich angekommen sind. Bleibt das Ack-Paket aus, so wird nach einer (pseudo-) zufälligen Zeit bis zu 8x versucht, das Paket erneut loszuwerden.
Es kann jetzt passieren, dass der Empfänger das Paket 8x korrekt empfängt und nur das Ack-Paket nicht korrekt zurück kommt. Die Sequenznummer (welche für das aktuell zu sendende Paket immer gleich ist) garantiert aber, dass das Paket nur 1x verarbeitet wird. Um ein Paket als gültig anzusehen muss entweder C = 0 sein (erster Versuch das Paket zu senden) oder die Sequenznummer sich von der des letzten Paketes unterscheiden (hier kann es im Moment noch zu Problemen kommen, wenn mehrere Module untereinander kommunizieren). Weiterhin muss natürlich die Destination ID Übereinstimmen.
Der Teil Daten wird dann von der nächsten Protokollebene behandelt.
Das erste Byte ist der Befehl aus dem sich auch die Länge weiter Daten ableitet
Momentan gibt es erst 2 Befehle:
"s" <Speicherstelle> <wert> //speichert Wert in entsprechenden Konfig-Ram Modul antwortet mit "!"
"q" <Speicherstelle> //Liest Wert aus Konfig-Ram Modul antwortet mit "=" <Wert>
Im Konfig-Ram werden sowohl die Phasenanschnittwerte als auch die Tastzustände gehalten. Ein Überschreiben führt also sofort dazu, dass der entsprechende Ausgang den Wert ausgibt.
Vorschläge
- Es ließe sich evtl. noch Platz sparen, wenn man einen Kondensator statt dem Trafo verwendet. Habe jetzt schon einige Schaltungen damit laufen mit bis zu 80 mA.
- Sehr interessanter Artikel im elko: http://www.elektronik-kompendium.de/public/schaerer/cpowsup.htm
- Wie soll die Adressierung aussehen?
- Jedes Modul eine Adresse mit 8 Bit
- oder jede Funktion eine Adresse mit 16 Bit
- Broadcasts für z. B. Erkennung vorhandener Geräte
- wie wäre es hier die Adresse 000 zu verwenden?
- Jedes Gerät sollte sich und seine Funktionen bekannt machen können
- Anfrage "(C)apabilities" wird mit ACK-Packet beantwortet (siehe Steuerprotokoll)
- Countdown zum automatischen Ausschalten (per Web-Oberfläche einstellbar)
- Unabhängiger Sender ohne Rechner mit z. B. Display Steuerung, Web-Oberfläche?
- VERSIONSANFRAGE Modul mit Ethernet (incl. Webserver) für die zentrale Steuerung
- Netzwerk-Protokoll: http://www.hth.com/snap/
- Steuer-Protokoll Protokoll: (s)et / g(et) / m(emory) / a(ck) / e(rror)
- als beispiel für die komponenten (s)witch / a(nalog) / p(wm) / c(apabilities)
- CSMACD fehlt noch !!
"s s0 01001100" setzt die Schalter 2,5 und 6 auf dem Modul und wird mit
"a s0 01001100" quitiert, die Header mit den Adressen,der Sequenznummer etc. hab ich mal weggelassen.
"g c" liefert
"a c s2a4p2", also 16 Schalter(2x8), 4 AD-Ports, 2 PWM Ports
- evtl. Sicherung einplanen?