PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] PWM als Datenübertragung nutzbar ?



Langer711
07.02.2015, 10:48
Mal angenommen, man möchte zwei Arduinos "vernetzen", aber die I2C ist schon sehr stark belastet.
Trotzdem möchte man z.B. 10 mal in der Sekunde einen Integer Wert von dem einen Arduino zu anderen schicken.

Man könnte ja nun "im Sender" einen PWM Out setzen und diesen Wert "im Empfänger" wieder einlesen.
Theoretisch lassen sich damit bei 8 Bit Auflösung immerhin Werte von 0 bis 256 übertragen. (bei 8 Bit Auflösung)
Will man höhere Werte übertragen, nimmt man z.B. 2 PWM und rechnet das Ganze wieder zusammen.

Der Vorteil wäre, man braucht wenig Programmcode und damit wenig Abarbeitungszeit auf beiden Seiten der Übertragung.

Aber wenn der "Sender" nun z.B. 112 gibt, liest dann der "Empfänger" auch 112 oder kann das auch mal 114 oder 110 werden ?
Immerhin ist der Unterschied nur 19 mV je Wert.
Bei 10 Bit Auflösung entsprechend kleiner (knapp 5 mV je Step)

Wie zuverlässig wäre so ein Konstrukt ?

BMS
07.02.2015, 11:43
Hallo,
prinzipiell ist das möglich. Es gibt da zwei Möglichkeiten:
1. "Sender" gibt PWM aus und der "Empfänger" misst digital die Puls/Pausendauer.
2. "Sender" gibt PWM aus, das wird mit einem RC-Tiefpass geglättet und der "Empfänger" misst die Spannung per ADC

Bei Variante 1 kommt es auf gutes Timing an, aber auch wie die Signalflanken ankommen. Eine Abweichung kann auftreten, wird aber eher niedrig ausfallen.
Bei Variante 2 (aus deiner Formulierung mit den 19mV klingt das eher danach) hat man zwei große Probleme. Erstens kann der RC-Tiefpass nicht perfekt filtern, sodass man eine Restwelligkeit und damit schwankende ADC-Werte bekommt. Zweitens dauert es recht lange, bis sich die Spannung am RC-Tiefpass auf das neue PWM-Tastverhältnis eingestellt hat.
Einen PWM-Ausgang direkt mit dem ADC zu vermessen, macht nicht viel Sinn - die Messergebnisse sind dann ja entweder 0V oder 5V, je nach dem ob im PWM-Ablauf gerade Puls oder Pause erwischt wurde. Dann kann man's gleich digital messen.
Also lieber digital die Puls/Pausendauer messen. Frage ist nur, wie man das bei 0% Tastverhältnis (Pin dauerhaft auf Low) und 100% Tastverhältnis (Pin dauerhaft auf high) löst.

Grüße, Bernhard

Alternativ gibt es auch noch digitale Schnittstellen wie UART, SPI ...
Wenn noch viele Pins frei sind, kann man auch parallel einige Bits rüberschieben.

Peter(TOO)
07.02.2015, 12:02
Hallo Bernhard,

Also lieber digital die Puls/Pausendauer messen. Frage ist nur, wie man das bei 0% Tastverhältnis (Pin dauerhaft auf Low) und 100% Tastverhältnis (Pin dauerhaft auf high) löst.

Genau so ;-)
Bei einer 8-Bit PWM hat man bei 1 und 254 noch einen Impuls, welchen man messen kann.
Die PWM-Frequenz kennt man ja, also wenn man innerhalb einer Periodendauer keinen Impuls hat, muss man den Pegel abtasten L = 0 und H = 255.

Allerdings muss man mit einer höheren Frequenz abtasten (Oversampling), als die PWM für den Raster verwendet. Grundsätzlich ergibt sich immer ein Fehler von +/-1 des gemessenen Wertes.
Man müsste also die Werte noch mit eine Prüfsumme/CRC schützen.

Aber grundsätzlich stellt sich schon die Frage, ob dies der optimale Weg ist!

MfG Peter(TOO)

oberallgeier
07.02.2015, 14:31
... zwei Arduinos "vernetzen", aber die I2C ist schon sehr stark belastet ... PWM Out ... 8 Bit Auflösung ...In einem ähnlichen Fall - viel I²C-Traffic - habe ich als Lösung die UART-Verbindung genommen, interruptgetrieben und mit FIFO. Gerade wenns nur PtP ist macht die Sinn. Ich habe in diesem Fall bei den Platinen meist auf jeder mehrere UARTs . . . Die Verbindung geht bei meinen 20-MHz-ATmegas stabil selbst bei 1,2 MBd (UBRR = 1) ;.-.)

Langer711
08.02.2015, 13:48
Na, ich seh schon...
ganz so einfach ist es eben nicht, die Daten - und sind sie noch so gering - von A nach B zu schaufeln.
Mal eben den PWM abfragen? Läuft nicht, zu schwammig...
Pulsverhältnis ermitteln ginge zwar, aber die Synchronisation ist auch nicht ohne durch die hohen Taktraten des Senders.

Da ist es über UART vermutlich einfacher...

Ich sehe es ein :)

DANKE für die Diskussion, Freunde :)

Josef

Peter(TOO)
08.02.2015, 21:29
Hallo Josef,

Da ist es über UART vermutlich einfacher...

Ich sehe es ein :)

Das UART wurde auch genau zum Zweck der Datenübertragung entwickelt.
PWM wurde zu Leistungssteuerung entwickelt.

Eigentlich nicht verwunderlich, dass die Teile unterschiedlich gut zu deinem Problem passen ;-)

MfG Peter(TOO)

Langer711
09.02.2015, 09:25
Naja ich bin neu in Sachen Arduino oder Microcontroller allgemein.
Programmierung selbst ist kein Thema, aber der Umgang mit Ein- und Ausgängen ist mir bisher nur in Sachen SPS bekannt.

Man muss sich halt erst einen Überblick über die Möglichkeiten schaffen, bevor man was auf die Beine stellen kann.

Aber nochmal vielen Dank für die vielen Hinweise Eurerseits!

Ich wünschte mir, es hätte sich auch mal was in meiner anderen Frage rund um die 433 Mhz-Übertragung getan :(

Josef