Eigentlich betreibe ich keinen Modellbau. Doch ich wurde gebeten, einige im Modellbau benötigte Fernsteuer-Zusatzmodule mit AVR-Mikrocontrollern zu entwickeln, bzw. die Programme dafür zu schreiben.

Problem: Ein gekauftes Motorgeräusch-Soundmodul, welches per Kanalimpuls gesteuert wird, lief viel zu schnell. Es wurde eine Möglichkeit gebraucht, den Kanalimpuls zu verkleinern. Damit das auch für andere Zwecke geht, musste ein Modul her, mit dem Impuls-Manipulationen in weiten Grenzen vorgenommen werden können, und zwar das:

Impuls-Korrektur-Modul für RC-Kanalimpuls mit analoger Programmierung

Dieses Modul erlaubt die Korrektur der Impulsbreite eines Kanalimpulses an die von einer weiteren Komponente benötigte Impulsbreite. Damit das Modul universell einstellbar ist, ermittelt es den Neutralpunkt der Fernsteueranlage durch Autoneutralscan. Mittels zweier Trimmpotentiometer wird der Neutralpunkt des Ausgangsimpulses und die Verstärkung (Gain) eingestellt.
Die Schaltung des Moduls ist recht einfach. Herzstück ist ein AVR-Mikrocontroller vom Typ Tiny15. Die Stromversorgung erfolgt über einen im Modellbau üblichen dreipoligen Servostecker, über den auch der Eingangsimpuls geliefert wird. Dieser wird über einen Schutzwiderstand an Pin 7 des Tiny15 gelegt, der als externer Interrupt fungiert. Dies ermöglicht eine präzise Messung der Eingangs-Impulsbreite. An die beiden analogtauglichen Eingänge Pin 2 und Pin3 werden die beiden Trimmpotis angeschlossen, mit denen das Modul parametriert wird. An Pin 6 (Impulsausgang) kommt über einen Schutzwiderstand ein Steckverbinder zum Anschluss der zu steuernden Baugruppe. Pin 5 kann als Error-Ausgang genutzt werden, er wird bei Auftreten von Impulsfehlern auf H-Pegel geschaltet. Die Betriebsspannung ist mit Tantalelko und Keramik-Kondensator abgeblockt, Reset ist über einen Widerstand an Betriebsspannung gelegt.

Die Testplatine wurde für Anfertigung durch Fräsen und Oberflächenbestückung entwickelt. Das obere Bild zeigt die Leiterzüge, das untere Bild die zu fräsenden Trennlinien. Tantal-Elko und Keramik-Kondensatoren standen in SMD zur Verfügung, die Widerstände sind bedrahtet, aber auf der Oberfläche (Leiterseite) montiert. Auch die Trimmpotis und der Tiny15 wurden von der Leiterseite aufgelötet, wobei die aus Blech bestehenden Anschlüsse um 90° umgebogen wurden.

Dieses Bild zeigt den fertigen Aufbau der gefrästen und bestückten Testplatine. Diese Bauform ist mir symphatischer als Lochraster-Lötpunktplatinen. Vorteilhaft ist dabei auch, dass man die Unterseite nicht gegen Kurzschlüsse sichern braucht, denn da befinden sich keine Leiterzüge oder Lötstellen.

Falls jemand auf der Platine die ISP-Anschlüsse vermisst, das ist kein Problem, denn ich nutze zum Programmieren die Programmierzange, die einfach von oben auf den AVR gesteckt wird und die sechs benötigten Anschlüsse des AVR mit dem ISP-Brenner verbindet.

Inbetriebnahme des Moduls

  • Die Fernsteueranlage ist ausgeschaltet.
  • Das Modul wird wie ein Servo am Fernsteuer-Empfänger angeschlossen.
  • Die zu steuernde Baugruppe (Servo, Fahrtregler, Soundmodul...) wird an den Ausgang angeschlossen.
  • Beide Trimmpotis sind auf Mittelstellung einzustellen.
  • Nun den Fernsteuersender einschalten und darauf achten, dass die Steuerknüppel in Neutralstellung stehen.
  • Den Empfänger (mit Korrekturmodul) einschalten.
  • Mit dem Neutralpunkt-Poti den Neutralpunkt so einstellen, wie ihn die anzusteuernde Baugruppe braucht.
  • Steuerknüppel am Sender in Endstellung bringen.
  • Mit dem Gain-Poti die gewünschte Endstellung der zu steurnden Baugruppe einstellen, wobei die Richtung umkehrbar ist.
Damit ist das Modul betriebsbereit. Bei jeder Benutzung im Modell ist darauf zu achten, dass der Sender eingeschaltet sein muss und Neutralimpulse senden muss, ehe der Empfänger (und damit das Korrekturmodul) eingeschaltet wird. Sonst funktioniert Autoneutralscann nicht.

Durch ungeschicktes Einstellen der Potis können Impulse erzeugt werden, die nicht mehr der Norm entsprechen. Dafür ist dann nicht der Autor des Programms, sondern der Anwender selbst verantwortlich.


Funktionsbeschreibung (grob):

  • Steigende Flanke am Impulseingang (Eingangsimpulsanfang)
    • setzt Timer1 auf 0 und startet ihn mit 100kHz,
    • liest Neutraltrimmwert aus Poti (analog).
  • Fallende Flanke am Impulseingang (Eingangsimpulsende)
    • liest Timer1 aus (Eingangsimpulsbreite),
    • sorgt dafür, dass die ersten 14 empfangenen Impulse verworfen werden und der 15. Impuls als Neutralpunkt des Senders interpretiert wird,
    • erst ab 16.Impuls nach dem Einschalten Ausgangsimpulse generiert werden,
    • stoppt Timer1 erstmal,
    • liest Gaintrimmwert aus Poti (analog),
    • prüft Impulsbreite auf Gültigkeit,
    • prüft Impulsabstand auf Minimalwert,
    • schaltet ggf. Errorausgang ein/aus,
    • berechnet aus Eingangsimpuls, Neutral-Trimm und Gain-Trimm neuen Impuls-Sollwert,
    • lässt diesem den Istwert mit Hysterese nachlaufen,
    • setzt Timer0 auf Startwert (25,6ms vor Timeout),
    • setzt Timer1 mit neu berechnetem Impuls-Istwert (Zeit bis Überlauf),
    • setzt Impulsausgang auf H (Sendeimpulsbeginn),
    • aktiviert Timer1 mit 100kHz.
  • Timer1-Überlauf (Sende-Impulsende, Überlauf bei Impulsmessung wegen zu langem Impuls)
    • deaktiviert Timer1, (gemessene Eingangsimpulsbreite ist dann 0, also illegal),
    • setzt Impulsausgang auf L. (ist bei Messung sowiso L).
  • Timer0-Überlauf (Timeout vermisster Eingangsimpuls)
    • setzt Timer0 auf Startwert (25,6ms vor Timeout),
    • setzt Error-Ausgang auf H,
    • setzt Ausgangsimpulswert auf Error-Impulswert (Konstante, definierbar)
    • setzt Timer1 mit neu berechnetem Impulswert,
    • setzt Impulsausgang auf H (Sendeimpulsbeginn),
    • aktiviert Timer1 mit 100kHz.
  • Reset-Routine
    • initialisiert beim Einschalten alle benötigten Ressourcen...
  • Hauptprogramm
    • schickt den AVR in den Schlafmodus, von dem er von einem der auftretenden Interrupts geweckt wird. Dies erhöht die Genauigkeit der Timer, was aber hier keine Rolle spielt.

Im Programm lassen sich folgende Parameter als Konstanten definieren:

Konstanten (Anpassung in sinnvollen Grenzen erlaubt):

  • tsw=96 Timer0-Startwert für 25,6ms Timeout-Error (Impulsausfall)
  • tmin=tsw+90 Timer0-Vergleichswert für minimalen Impulsabstand (14,4ms)
  • imin=70 Minimale Impulsbreite für Error (0,7ms)
  • imax=231 Maximale Impulsbreite für Error (2,3ms)
  • errw=150 Error-Wert, wird bei fehlendem Eingangsimpuls gesendet (1,5ms)

Damit das Timing das Tiny15 stimmt, muss der interne RC-Generator des AVR kalibriert werden. Dazu ist vor dem Brennen mittels eines geeigneten AVR-ISP-Programms das 'Calibrationsbyte' des Exemplars auszulesen und in das L-Byte und H-Byte der letzten Speicherzelle des Flash zu schreiben (wie es ATMEL mit neuen AVRs macht). Nur dann kann das Programm das Calibrationsbyte korrekt in das Kalibrationsregister 'OSCCAL' schreiben.

Erklärung einiger hier verwendeter Begriffe bzw. Features...

Der Kanalimpuls, auch Fernsteuerimpuls, Eingangsimpuls oder Impuls genannt, ist ein Impuls, der vom Fernsteuersender für jeden Übertragungskanal getrennt generiert und vom Fernsteuerempfänger bereitgestellt wird. Er wird etwa alle 20ms wiederholt. Seine Impulsbreite trägt die Information, in welcher Stellung sich der entsprechende Steuerknüppel des Fernsteuersenders momentan befindet. Die Impulsbreite beträgt üblicherweise in Neutralstellung (auch Neutralpunkt genannt, Mitte des Steuerknüppelweges) 1,5ms. In den Endlagen des Steuerknüppelweges beträgt die Impulsbreite 1,0ms bzw. 2,0ms. Die Impulsbreite entspricht also der Steuerknüppelstellung am Sender. Bei einigen Herstellern können die hier genannten Werte etwas differieren, befinden sich aber im Bereich von 0,7ms bis 2,3ms. Und genau das ist das Problem, von Anlage zu Anlage differieren die Impulsbreiten und besonders die Neutralstellung.

Mit Autoneutralscan ist die automatische Erkennung des Neutralpunktes beim Einschalten der Anlage gemeint. Man schaltet ja zuerst den Sender ein, der darauf munter Impulse sendet, die der Neutralstellung der Steuerknüppel entsprechen, da der Sender im Moment nicht bedient wird. Danach schaltet man die Anlage im Modell ein, also Empfänger, Servos, Fahrtregler usw. - und damit auch das Schaltmodul. Dieses empfängt die Impulse und misst deren Impulsbreite. Die ersten 15 empfangenen Impulse werden als Neutralstellung interpretiert (wobei jeder Impulsbreitenwert den vorher eingelesenen ersetzt). Erst ab dem 16. empfangenen Impuls wird die eigentliche Impulsauswertung aktiviert. Dies gibt der Anlage etwa 0,3ms Zeit zum Einschwingen.

Die Verstärkung (Gain) ist die prozentuale Veränderung der Abweichung der Impulsbreite vom Neutralpunkt. Bei Gain=1 (100%) ändert sich die Abweichung von neutral nicht. Gain ist per Trimmpoti im Bereich von -2 über 0 bis +2 einstellbar. Das bedeutet, dass die Abweichung von neutral verstärkt, gedämpft und sogar umgekehrt werden kann...
Beispiel (Neutralpunkt des Eingangsimpulses sei 1,5ms):
Eingangsimpuls Gain (%) Neutralpoti Ausgangsimpuls
1,0ms 100 1,5ms 1,0ms
1,0ms -100 1,5ms 2,0ms
1,3ms 200 1,5ms 1,1ms
1,3ms -200 1,5ms 1,9ms
1,0ms 50 1,5ms 1,25ms
1,0ms -50 1,5ms 1,75ms
1,5ms 100 1,4ms 1,4ms
1,8ms 100 1,4ms 1,7ms
1,0ms 0 1,5ms 1,5ms
2,0ms 0 1,5ms 1,5ms
1,0ms 0 1,3ms 1,3ms
2,0ms 0 1,7ms 1,7ms
Wie die Beispiele zeigen, lassen sich mit Gain die Impulsabweichungen von neutral in gewissen Grenzen verfälschen und einem neuen Neutralwert zuordnen.


Dieses Programm unterliegt den allgemeinen Copyright-Regeln. Alle Rechte liegen beim Autor. Gewerbliche Nutzung des Programms bedarf einer schriftlichen Genehmigung des Autors. Nachbau dieses Schaltmoduls unter Nutzung dieses Programms für private Zwecke (Eigenbedarf) ist bei Einzelstücken erlaubt.

hannes@hanneslux.de