www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Servo Summensignal auswerten


Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus Leidinger (klausleidinger)
Datum:

Bewertung
0 lesenswert
nicht 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/Tes...
und hier mit AVR Code:
http://www.ulrichradig.de/home/index.php/avr/avr_-_rc

HTH,
Klaus

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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

...

Autor: Klaus Leidinger (klausleidinger)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Leidinger (klausleidinger)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan (Gast)
Datum:

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

Autor: Axel R. (axelr) Flattr this
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß.

Autor: Klaus Leidinger (klausleidinger)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.