Forum: Mikrocontroller und Digitale Elektronik Servo Summensignal auswerten


von Stefan (Gast)


Lesenswert?

Hallo an alle,
ich verwende den ATmega8 um aus einem RC-Empfänger Servosignale 
auszulesen.
Im Augenblick sind es zwei jeweils mit ext. Int0/Int1 pin. Das 
funktioniert soweit prima, allerdings benötige ich weitere Kanäle. Daher 
möchte ich das Empfänger Summensignal vor der Aufspaltung auf die 
Servobuchse auslesen, das funktioniert dann idealeweise mit nur einem 
externen Interrupt.

Frage: Gibt es ein Protokoll welches das Timing der Signale auf dem 
"Bus" definiert, oder entspricht das 1:1 der Aneinanderreihung der 
einzelnen Kanäle ?

Danke
Stefan

von Rolf Magnus (Gast)


Lesenswert?

Am besten machst du das mit "input capture".

Das Signal sieht so aus:
Immer wenn beim empfangenen Signal eine positive Flanke (oder eine 
negative - auf welche man triggert, müßte egal sein) kommt, wird im 
Empfänger ein Servokanal auf low und der nächste auf high geschaltet.
Die Pulse vom Sender sind dabei glaube ich 0.5 ms lang.
Die Servopulse können also mit einem 1-aus-n-Zähler aus dem Signal 
generiert werden (z.B. von einem 4022). Die Synchronisation erfolgt 
durch eine längere Pause am Ende des Impulstelegramms.

von Klaus L. (kllei)


Lesenswert?

Hallo Stefan,

Die Signale hängen hintereinander, es sind allerdings beim "Wechsel" 
Pulsflanken drin. Synchronisiert wird dann auf den langen "low" Puls 
nach dem letzten Kanal. (oder vor dem ersten...)

Hier beschrieben:

http://www.sprut.de/electronic/modell/allgemein/index.htm
http://www.klaus-leidinger.de/mp/RC-Elektronik/Tester/Servotest/Servotester.html
und hier mit AVR Code:
http://www.ulrichradig.de/home/index.php/avr/avr_-_rc

HTH,
Klaus

von Stefan (Gast)


Lesenswert?

Klaus, Rolf,
danke für die Info ungefähr so habe ich mir das vorgestellt.
Das schwierigste scheint mir dabei die richtige Synchronisierung zu 
sein.

Da mein Prozessor ja "nebenbei" noch ein Anstellwinkelsignal per ADC 
auswertet und Servos ansteuert muß ich ausserdem zeitkritisch arbeiten.

Werde mir mal ein Konzept ausdenken.
Stefan

von Hannes L. (hannes)


Lesenswert?

Ist zwar schon etwas älter, geht daher auch eleganter, aber vielleicht 
hilft's ja trotzdem:

http://www.hanneslux.de/avr/mobau/impdecoder/idec.html

...

von Klaus L. (kllei)


Lesenswert?

Hallo Stefan,

Rolf hatte es ja schon im Prinzip beschrieben, und in dem Code auf 
meiner Seite ist es auch so gelöst (allerdings für 8051). Im AVR ist es 
einfacher:

Timer mit mind. 3ms Überlauf starten
INT0 auf neg. Flanke triggern

bei Timer Überlauf -> Kanalzähler auf 1

bei INT0 mußt Du dann noch per Flag unterscheiden ob der Timer 
zurückgesetzt, oder der Timerwert für den aktuellen Kanal ausgewertet 
und der Kanalzähler erhöht wird.

Das sind nur wenige Instruktionen pro Interrupt.

Viele Grüße,
Klaus

von Klaus L. (kllei)


Lesenswert?

Genau,

die Seite von Hannes hatte ich in meiner Liste vergessen ;-) dabei passt 
die vermutlich am besten, wenn es Assembler sein soll.

CU,
Klaus

von Stefan (Gast)


Lesenswert?

Jo suuper, die Seite von Hannes.
Insbesondere weil ich auch in assembler (mit Workpad plus) schreibe.
Danke Euch
Stefan

von Axel R. (Gast)


Lesenswert?

Ich bin auch gerade drann, mein Summensignal auszuwerten. Bei mir sind 
es zwei Kanäle. Ich habe das in C im ICP-Interrupt hinbekommen.
Findest Du im unten genannten Link.
Leider hapert es immernoch bei Reichweitengrenzen. Hier ist das Signal 
stark gestört und die beiden Motore meines Robbe 6X6 fangen dann an, 
etwas zu "spinnen". Der Empfänger ist aber auch nur ein billiger 2Kanal 
AM, der damals mit dabei war.
Kannst es Dir ja mal ansehen. Hatte ich vor wenigen Wochen reingestellt:
Beitrag "Re: Servoausgänge verUNDen"

Gruß
AxelR.

von Karl H. (kbuchegg)


Lesenswert?

Hast du schon mal mit Heuristik probiert:
Man kann doch sicher davon ausgehen, dass sich die Kanalimpulse
von einem Telegramm zum nächsten Telegramm um nicht allzuviel
ändern werden. Tun sies doch, dann hast du eine Störung.

von Stefan (Gast)


Lesenswert?

Hallo Leute melde mich nochmal hierzu.
Habe mal im ATmega8 Datasheet nachgeschaut und festgestellt das die 
"input capture function" nur in Verbindung mit Timer1 vorhanden ist. Den 
brauche ich aber um meine Servoausgänge zu steuern. Als Alternative kann 
ich aber die externen INT0/1 oder den Analogcomparator verwenden. Bei 
steigender/fallender -Flanke kann so einen Interrupt ausgelöst werden.
Die zugehörige ISR kann ich dann zum Starten und abfragen von z.B. 
Timer0 verwenden.
Was haltet Ihr davon?

Muß jetzt leider weg - schaue heute Mittag wieder rein.

Gruß
Stefan

@Axel: Danke für deinen Link, aber mit C stehe ich (noch) auf Kriegsfuß.

von Klaus L. (kllei)


Lesenswert?

@Stefan,

das ist das vorgehen das ich hier gemeint: 
Beitrag "Re: Servo Summensignal auswerten"
und hier beschrieben hatte:
Beitrag "Re: Servoausgänge verUNDen"

Einfach die beiden Signale auf die beiden INT Eingänge, und ein Flag das 
aufpasst ob es die start oder stop Flanke des Signales war. Wenn die 
beiden Kanäle nebeneinanderliegen, ist das Stop des ersten Kanals auch 
gleichzeitig das Start des zweiten.

Das erhaltene Signal kannst Du dann auch noch auf Plausibilität prüfen 
(min und max Wert)
Mit dem Timer Überlauf triggerst Du auf Anfang.

Wenn Du den Code brauchst, ich kann ihn heute Abend mal posten...

Ciao,
Klaus

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.