|
Encoder
|
Dieser Encoder erzeugt ein 1 bis 8-Kanal PPM-Summensignal. Er kann für Experimentier-Aufbauten und zur Diagnose im Modellbau Anwendung finden. Die Platine enthält 6 Potis für 6 Proportional-Kanäle (Kanal 1 bis Kanal 6) und 2 Taster für 2 Schalt-Kanäle (Kanal 7 und 8) on Board. Der Encoder kann per serieller Schnittstelle (5V-Pegel) konfiguriert werden. Ein zusätzlicher I²C-Bus ist für künftige Erweiterungen wie Mutliswitch etc. vorgesehen.Hinweis:
Der Encoder wurde nicht konzipiert, um reale Modelle zu steuern. Er dient als Diagnosemittel und kann für Experimentier-Aufbauten verwendet werden. Um Modelle im Freien zu steuern, müssen erprobte Geräte verwendet werden. Der Encoder wurde nicht mit realen Modellen unter Extrembedingungen erprobt, daher besteht die Möglichkeit eines Ausfalls, worduch Schäden entstehen könnten. Vor allem Flugmodelle sollten keinesfalls damit gesteuert werden. Es versteht sich von selbst, dass jeder selbst für eventuell entstandene Schäden verantwortlich ist.Die Firmware wurde vollständig mit BascomAVR erstellt. Diese IDE kann als Demo heruntergeladen werden.
Technische Daten Typisch Minimal Maximal Betriebsspannung (VCC) 5V DC (stabilisiert) 4,5V 5,2V DV Stromaufnahme (ohne Servos) [mA] 12,5 ca. 10 ca. 15 Anschließbare Servo 4,8V (bei VCC = 5V) 4,6V 6V Anzahl Kanäle 8 (voreingestellt) 1 8 Steckersystem JR - - Platinen-Abmessung ca. [mm] 86 x 60 - - Befestigungs-Schrauben [mm] 80 x 52 (M3) - - Gewicht [g] 38,2 (mit Distanzbolzen und Muttern) - -
Die folgenden Features bietet der PPM-Encoder:
- Serielle Schnittstelle (5V)
- I2C-Bus Schnittstelle (Interrupt-Fähig)
- ISP-Schnittstelle
- Codierung PPM
- 1 bis 8 Kanäle (seriell konfigurierbar)
- Kanalzuweisung konfigurierbar
- Reverse jeder Kanal einzel einstellbar
- 6 analoge Kanäle (Kanal 1 bis 6)
- 2 Schalt-Kanäle (Kanal 7 und 8)
- PPM-Signal invertierbar
- Frame-Intervall von 15ms bis 30ms konfigurierbar
- Stop-Puls von 0,25ms bis 0,35ms konfigurierbar
- Schutzbeschaltung aller Ein- und Ausgänge
![]()
Während der Entstehung des Encoders auf einem Steckboard (noch mit 3,686400MHz Quarz) wurden einige Oszillogramme aufgenommen. Bei der Herstellung der ersten Platine entstanden diese Bilder.
Der ATmega8 wird durch ein 8MHz Quarz mit dem notwendigen Takt versorgt. Timer1 (16 Bit) wird mit Prescaler=8 als Counter verwendet und dient zur Generierung der Kanalpulse mit einer Auflösung von einer Mikro-Sekunde (1µs).
Pulsgenerierung
Der Stop-Puls im PPM-Signal hat normalerweise eine Länge von 0,3ms bzw. 300µs. Diese Pulsbreite wird mit dem Compare1B-Wert generiert. Die restliche Pulslänge wird vom Compare1A-Wert bestimmt. Hierbei wird der Wert vor der Ausgabe eines Kanals jeweils der notwendigen Pulslänge (1ms bis 2ms) angepasst.Der Parameter Compare1B für Timer1 kann über die serielle Schnittstelle konfiguriert werden. Damit läßt sich die Breite des Stop-Impuls verändern. Da die Auflösung des Timers genau 1µs ist, läßt sich schnell erahnen, dass ein Wert von 300 in diesem Register ein Stop-Puls mit einer Länge von 300µs hat.
Der Timer2 ist als Interval-Timer für den Pulszug (Frame) verwendet. Er ist als Counter mit Prescaler=1024 konfiguriert, der sich mit erreichen des Compare1A-Werts automatisch zurücksetzt. Timer2 sorgt so für das notwendige Timing, um alle 20ms ein neues Frame auszugeben.
Der Parameter Compare1A für Timer2 bestimmt die Intervalzeit, die ebenfalls über die serielle Schnittstelle konfigurierbar ist. Hier wird die Intervalzeit allerdings nicht in µs angegeben, sondern in Ticks. Ein Tick dauert 1/(Clock/Prescaler/Compare1A) Sekunden.
Alle drei eben genannten Compare-Register lösen folgende Interrupts aus und sorgen vollständig in Hintergrund für das PPM-Timing:
Timer1 - OC1A - Interrupt
Diese Routine _ISR_Puls2 wird aufgerufen wenn Timer1 den Wert von Compare1A erreicht. Das bedeutet, dass die Pulsausgabe für einen Kanal zeitlich vorbei ist. Hier wird nun geprüft, ob der Kanalzähler einen Wert größer der zu sendenden Kanäle aufweist. Ist dies der Fall, wird der Timer1 gestoppt. Im anderen Fall wird der PPM-Ausgang getoggelt und der Kanalzähler um 1 inkrementiert. Ter Timer setzt sich hardwaremäße auf Null zurück.Timer1 - OC1B - InterruptDiese Routine _ISR_Puls1 wird immer aufgerufen, wenn der Timer den Wert von Compare1B erreicht. Normalerweise ist dies nach 300µs der Fall, der das Ende des Stop-Impuls markiert. Der PPM-Ausgang wird nun getoggelt und das Sync-Ausgangssignal zurückgesetzt.Timer2 - OC1A - Interrupt
Nun wird der Kanal-Zähler abgefragt, welcher Kanal denn ausgegeben werden muß. Dies geschieht über eine Select Case-Anweisung. Dann wird der entsprechende Kanalwert ermittelt und in das Array RC_Channels(n) geschrieben. Nun wird noch 1000 (für 1000µs) hinzuaddiert und das Ergebnis in das Compare1A-Register geschrieben um die Gesamtpulslänge anzugeben.Dieser Interrupt sorgt für ein Frame-Timing. In der Interrupt-Routine _ISR_Frame wird deshalb Timer1 auf Null gesetzt (mit Timer2 synchronisiert) und anschließend gestartet. Weiterhin wird dafür gesorgt, dass der Kanalzähler auf 1 zurückgesetzt wird. Schließlich wird am Sync-Ausgang noch ein High-Pegel ausgegeben.
Im folgenden Bild ist die Platine in der Draufsicht dargestellt. Deutlich sind die Schnittstellen zu erkennen.
![]()
Links oben befindet sich der Anschluss für I²C-Erweiterungen. Darunter liegt der PPM-Ausgang mit dem zugehörigen Sync-Signal. Am oberen Platinenrand ist die serielle Schnittstelle zu finden, die mit 38400 Baud arbeitet. Am rechten Platinenrand ist der Schraub-Anschluss für die Versorgungsspannung. Hier dürfen keinesfalls mehr als 5,5 Volt angelegt werden, sonst stirbt der Controller!
Am unteren Platinenrand befinden sich die Potentiometer und Taster für die PPM-Kanäle. Die angegebene Kanal-Nr. entspricht der Quelle beim Ändern der Kanalzuordnungen.
Sie ist als 5V-Schnittstelle ausgeführt und ist wie folgt voreingestellt: 38400 Baud, 8 Datenbits, 1 Startbit, 1 Stopbit, Parität keine, Handshake Hardware (RTS/CTS). Es wurde hier absichtlich auf einen speziellen Treiber z.B. MAX232 verzichtet, um die Schnittstelle flexiebler zu halten. Auf diese Weise kann nun das serielle Kommando auch über USB (z.B. FT232RL) empfangen werden.In der Hauptschleife wird per Polling ständig abgefragt, ob Zeichen empfangen wurden. Ist dies der Fall, wird die Routine _Progress_Rx aufgerufen. Sie prüft nun, ob der Empfang gültig ist und wenn ja, ob Parameter gelesen oder geschrieben werden sollen. Es wird dann in entsprechende Unterprogramme verzweigt, die die Decodierung des Protokolls übernehmen und die Anweisung ausführen.
Gesendet wird im ASCII-Format. Eine Übertragung endet mit einem Carriage Return (CR).
Um ein Kommando an den Encoder zu senden, wird zunächst ein Zeichen gesendet, das die Art des Kommandos spezifiziert, gefolgt von der Parameter-Nummer (keine feste Zeichenlänge). Ist das Zeichen des Kommandos ein kleiner Buchstabe, interpretiert dies der Decoder als Lese-Anweisung. In diesem Fall werden keine Parameter gesendet und die Übertragung wird mit CR abgeschlossen. Der Decoder Antwortet nun auf die Anfrage.Sollen Parameter geändert werden, muß Kommando-Typ ein Groß-Buchstabe gesendet werden, gefolgt von der Parameter-Nummer. Nun folgt ein Doppelpunkt zur Trennung des Parameters vom Kommando gefolgt von dem zu schreibenden Parameter-Wert. Die Übertragung wird mit CR abgeschlossen. Der Decoder quitiert die verstandene Anweisung.Der Kommando-Buchstabe P steht für Parameter schreiben und kleines p für Parameter lesen.
Beispiel:
P2:155<CR>
Dieses Kommando schreibt den Wert 155 in den Parameter Nr. 2 (Frame-Timing) . Setzt somit die Interval-Zeit.Beispiel:
p2<CR>
Dieses Kommando liest den Wert des Parameters Nr. 2 (Frame-Timing). Gibt somit die Interval-Zeit zurück.
Folgende Kommando-Typen werden unterstützt:
Parameter lesen Kommando-Art Parameter-Nummer Ende-Zeichen 1 Zeichen 1 bis 3 Zeichen 1 Zeichen p 2 <CR>
Parameter schreiben Kommando-Art Parameter-Nummer Trennzeichen Parameter-Wert Ende-Zeichen 1 Zeichen 1 bis 3 Zeichen : (Doppelpunkt) 1-5 Zeichen 1 Zeichen P 2 : 155 <CR> Folgende Parameter-Nummern werden für Kommando-Typ p/P unterstützt
Kommando-Typen Typ Parameter Beschreibung P erforderlich Parameter setzen p kein Parameter Parameter lesen K Kanal-Nummer Kanalwert schreiben ( Kanalnummer 1 bis 8) k Kanal-Nummer Kanal-Wert lesen (Kanalmummer 1 bis 8)
Parameter-Nummern Parameter-Nr Funktion Parameter Beschreibung 0 Restart 0 = Reset
1 = WarmstartStartet den Controller neu 1 PPM-Signal An/Aus 0 = PPM ausschalten
1 = PPM einschaltenPPM-Signal ein und ausschalten 2 FrameTime Bereich: 117 bis 233
Default: 155 (20ms)Interval-Zeit für Pulszug in Ticks 3 PulsTime Bereich: 250 bis 350
Default: 300 (300µs)Pulsbreite für Stop-Puls in µs 4 ChannelCount Bereich 1 bis 8
Default: 8Anzahl PPM-Kanäle 5 Inverted Bereich: 0 oder 1
Default: 0 (nicht invertiert)PPM-Signal invertiert ausgeben 6 Kanal-Reverse Bereich: 0 bis 255
Default: 0 (kein Reverse)Flag-Byte für Reverse Kanal-Ausgabe 7 Speichert Parametersatz keine Speichert Benutzer-Parametersatz 8 Liest Parametersatz 0 = Default-Werte laden
1 = Benutzer-Werte ladenLiest einen Parametersatz und aktiviert ihn 9 Debug-Modus aktivieren 0 = Debug aus
1 = Debug anSchalten den Debug-Modus an oder aus 10 Kanalzuweisung setzen 8 Kanalnummern werden Übergeben, die die Quelle spezifizieren Setzt die Kanalzuweisung 11 Externe Steuerung aktivieren Bereich: 0 oder 1
Default: 0Aktiviert die Steuerung der PPM-Kanäle per serieller Schnittstelle Beispiele für Parametrierung
Beschreibung Kommando Anzahl der Ausgabekanäle auf 6 setzen: P4:6<CR> PPM-Signal invertiert ausgeben: P5:1<CR> Kanal 1 Reverse
Kanal 2 Reverse
Kanal 3 Reverse
Kanal 1 und 8 ReverseP6:1<CR>
P6:2<CR>
P6:4<CR>
P6:129<CR>Parameter speichern P7<CR> Kanal 1 und 2 vertauschen P10:2;1;3;4;5;6;7;8<CR> Hinweis:
Die geänderten Parameter werden nicht automatisch im EEProm dauerhaft gespeichert. Sollten die Parameter nach dem nächsten Einschalten des Decoders wieder zur Verfügung stehen, müssen diese Werte explizit gespeichert werden (P7<CR>). Erst jetzt sind die Daten dauerhaft im EEProm.
Antwort des Decoders nach Kommandos
Als Antwort wird ein String mit abschließendem CR gesendet mit folgendem Aufbau
FehlerNummer - FehlerText<CR>Beispiel:
0 - Success<CR>
Die Ziffer vor dem Bindestrich gibt den Fehlercode an, der den Fehler identifiziert. Nach dem Bindestrich wird ein Zusätzlicher Fehlertext angegeben. Die Trennung der beiden Werten wird durch ein Bindestrich (-) gekennzeichnet. Abgeschlossen wird die Übertragung mit einem Carrige Return (CR).
Fehlercodes:
Fehlercodes der Version 1.0a Fehlercode Fehlertext Beschreibung 0 Success kein Fehler - Befehl ausgeführt 1 Reset Pending Reset wird in 2 Sekunden ausgeführt 2 Restart Pending Restart (Warmstart) wird in 2 Sekunden ausgeführt 3 Invalid Start-Code [p, P, k, K] Der Start-Code ist ungültig. Es Werden nur die Buchstaben P, p, K und k unterstützt 4 Invalid Command-Code Das Kommando vor dem Doppelpunkt wird nicht unterstützt. Falsche Parameter-Nr. 5 Invalid Parameter Der übergebene Parameter ist nicht zulässig oder außerhalb des gültigen Bereichs 6 Invalid FrameTime [117 to 233] Default 155 Es wurde versucht ein Wert für das FrameTiming zu setzen, der außerhalb des gültigen Bereichs liegt 7 Invalid PulsTime [250 to 350] Default 300 Es wurde versucht ein Wert für PulsTime zu setzen, der außerhalb des gültigen Bereichs liegt 8 Invalid Channels [1 to 8] Es wurde versucht die Anzahl der Ausgabekanäle auf einen Wert außerhalb des gültigen Bereichs zu ändern 9 Command Not Supported Das angegebene Kommando wird nicht unterstützt
Kanalwerte setzen
Es besteht die Möglichkeit, der PPM-Kanäle per serieller Schnittstelle zu setzen. Hierzu ist es wichtig, zunächst die Externe Steuerung zu aktivieren, bevor Daten an die Kanäle ausgegeben werden. Das Setzen der Kanalwerte geschieht mit dem Kommando K, gefolgt von der Kanal-Nr. (1 bis 8). Nun wird ein Doppelpunkt gesendet mit einem Zahlenwert (dezimal angegeben). Das Kommando wird mir CR abgeschlossen. Es wird keine Antwort vom Decoder zurückgesendet!Beispiel:
Aktivieren der externen Steuerung: P11:1<CR>Nun können Kanalwerte gesendet werden. Hier einige Beispiele:
K1:1000<CR>
K2:1200<CR> usw.Mit Klein-K 'k' können die eingestellten Werte zurückgelesen werden.
Der Bus ist hardware-seitig bereits voll integriert. Auf der Software-Seite ist die Interrupt-Anforderung des Bus ebenfalls integriert. Das Flag Flag_I2C_INT wird gesetzt und in der Hauptschleife abgefragt. Ist das Bit gesetzt, wird es in der Hauptschleife wieder gelöscht und die Anforderung in der Routine _I2C_Interrupt bearbeitet. Hier kann der Code für die Interrupt-Anforderung eingefügt werden.Es muss jedoch nicht auf den Interrupt geantwortet werden. Die I²C-Bus Bausteine (kann auch ein AVR sein) können auch vom Programm per Polling abgefragt werden. Dies sollte an geeigneten Programmstellen geschehen, während keine Interrupts ausgeführt werden.
Downloads als PDF Schaltbild DIN-A4 Pinning Pinbelegung des ATmega8L Layout 1:1 Bestückungsplan oben
Bestückungsplan unten1,5:1
Firmware zum Download Version Compile-Datum HEX-File / BIN-File EEP-File Source-File Bemerkung 1.0a (Beta) 28.09.2008 PPM-ENCODER.HEX
PPM-ENCODER.BINPPM-Encoder.eep Firmware 1.0a.zip ohne I²C-Bus Erweiterung Hinweis: Für die ordnungsgemäße Funktion ist es unbedingt erforderlich auch die EE-Prom-Datei (EEP-File) in den Controller zu schreiben. Ohne EEProm-Daten werden keine PPM-Signale ausgegeben!
![]()
Die Fusebits können auch per Programm-Code eingestellt werden. Fügen Sie hierzu im Modul "PPM-Encoder.bas" die folgende rot markierte Zeile ein:
' -----------------------------------------------
' Allgemeine Definitionen
' -----------------------------------------------$regfile "m8def.dat"
$Crystal = 8000000 ' intern / oder Extern (Quarz)
$hwstack = 60
$swstack = 60
$framesize = 60
$PROG &HFF,&HFF,&HD9,&H00' generated. Take care that the chip supports all fuse bytes.' -----------------------------------------------
' Konstanten
' -----------------------------------------------Das Programm muss nach der Änderung noch einmal compiliert und geflashed werden. Die Fusebits werden dann nach Übertragung der Firmware von Bascom automatisch eingestellt.
| Copyright M.Ruhwald @ 2008 |