Encoder

PPM-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.
 

Zoom
 
 
 

Technische Daten

 
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) - -

Features:

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

 

Schaltbild

 
Zoom

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.
 
 

Wie die Schaltung funktioniert

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 - Interrupt
Diese 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.
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.
Timer2 - OC1A - Interrupt
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.

Bestückung

 
Im folgenden Bild ist die Platine in der Draufsicht dargestellt. Deutlich sind die Schnittstellen zu erkennen.

Bestückungsansicht

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.
 
 

Die Serielle Schnittstelle

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.
 
 

Das Daten-Protokoll

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.
 
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.
 

Der Kommando-Buchstabe P steht für Parameter schreiben und kleines p für Parameter lesen.
 
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 Kommando-Typen werden 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)
Folgende Parameter-Nummern werden für Kommando-Typ p/P unterstützt
Parameter-Nummern
Parameter-Nr Funktion Parameter Beschreibung
0 Restart 0 = Reset
1 = Warmstart
Startet den Controller neu
1 PPM-Signal An/Aus 0 = PPM ausschalten
1 = PPM einschalten
PPM-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: 8
Anzahl 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 laden
Liest einen Parametersatz und aktiviert ihn
9
Debug-Modus aktivieren
0 = Debug aus
1 = Debug an
Schalten 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: 0
Aktiviert 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 Reverse
P6: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 I²C-Bus

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.
 
 

Baupläne und Firmware

 
Downloads als PDF
Schaltbild DIN-A4
Pinning Pinbelegung des ATmega8L
Layout 1:1
Bestückungsplan oben
Bestückungsplan unten
1,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.BIN
PPM-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!
 

Einstellung Fusebits

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