PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Erfassung Pulslänge mir RN-Mega8



Hellmut
28.10.2004, 19:01
Hallo Freunde

Nachdem ich mir das Buch von C.Kühnel, AVR RISC Mikro prog mit BASCOM erworben habe jetzt etwas detaillierter gefragt:

Ich will mir der RN-Mega8 die Pulslängen der Signale eines Empfängers einer Funkfernsteuerung an die Servos erfassen. Das Ergebnis der Erfassung soll in meinem "schwimmenden Roboter" ausgewertet werden und zur Steuerung diverser Funktionen dienen. Da an einen Empfänger bis zu 8 Servos angeschlossen werden können, ohne spezielle Erweiterungen, möchte ich auch diese dekodieren.

Der mega8 soll mit 16MHz betrieben werden.

Fragen:
1. Wieviele diskrete Werte kann eine Funkfernsteuerung an einen Empfänger übertragen? 256 oder 512?

2. Zwischen welchen Werten?, 1ms bis 2ms?, Impulslängen?, werden sich die Signale bewegen?

3. Der mega8 hat 3 Timer, kann ich damit nur 3 Kanäle des Empfängers dekodieren? Und, kann ich 3 Kanäle dekodieren? Kann ich mehr Kanäle dekodieren?

4. Sollte ich nur 3 Kanäle bedienen können, wg der Timer, ich werde den Code benutzen wie er im Listing 30, Seite 166, des oben genannten Buches verwenden mit den Assembler Code, mit welcher Verzögerung muß ich bestenfalls rechnen, wenn ich den diskreten Wert der Pulslänge per Tabelle einen Binärwert zuordne, also z.B. h00 bis hFF bei 256 möglichen Werten und diesen plus 1 Byte für die Kanal-Kennung per I2C z.B. an die RN-Motor sende? Es geht mir darum zu sehen, ob der Benutzer an der Fernsteuerung eine Verzögerung wahrnehmen kann, oder ob es wie beim Einsatz eines Servos ist.

5. Wenn ich zusätzlich zu den Timern die Flanken auch ohne Timer messe, dann wird es von der Auslastung des mega8 abhängen.

Die hier genannten Fragen sind die Zielsetzung dieses ersten Teilprojektes meines schwimmenden Roboters. Leider, oder Gott sei dank, werde ich im November nicht am Projekt arbeiten können, da ich auf Tour im Ausland bin um einen Job zu finden.

Für Tips und Daten bin ich dankbar, werde aber den Fortschritt hier berichten.

Michael
28.10.2004, 23:33
Hallo Hellmut,
zu1. Die Information wird analog übertragen. Du kannst ja die Pulslänge messen und in beliebig viele Teile teilen...
zu2. ja, 1ms = linker* Anschlag, 2ms = rechter* Anschlag. Die Werte können aber bis 0,5 ms +/- abweichen.
zu3. Da ja die Kanäle nie gleichzeitig übertragen werden, brauchst du auch nur 1 Tiner :)
zu4. siehe 3. , was meinst du mit Verzögerung? Dein Servosignal kommt ca. 50 mal/sec. Die Verzögerung merkst du nicht.
zu5. ohne Timer würd ich's nicht machen, zu ungenau (siehe 1.) Zum Rechnen hast du aber zwischen den Empfangstelegrammen genug Zeit, wahrscheinlich sogar während jeden Impulses.
Gruß, Michael

*oder andersrum

PS: schau dir mal die Pulsein-Funktion an.

Frank
29.10.2004, 00:06
Obwohl ich es momentan nicht brauche, aber interessieren würde mich so ne Umsetzung auch. Gibt es schon irgendwo ein bisschen Code den man als Einstiegshilfe nutzen kann? Dürfte ja nicht ganz neu sein die Idee.

Hellmut
29.10.2004, 13:19
Hallo Michael

Erstmal danke für deine Antwort. Hier im einzelnen:
zu 1 & 2.: Die Information liegt analog vor, eine Funfernsteuerung hat allerdings nur eine diskrete Anzahl von Inkrementen die es überträgt. Daher meine Frage nach 256, bzw. 512 Schritte. Ich werde im Schiffsmodellbauforum nochmal nachfragen. Diese diskreten Schritte müssen sich in bestimmte Impulslängen-Inkremente übersetzen lassen und diese zu ermitteln ist eine meiner Zielsetzungen, da dieses die Auflösung der Impulslängenbestimmung definiert.
zu 3.: Deine Aussage ist so leider nicht richtig. Mischer im Sender z.B verändern die Werte von 2 Kanälen. Auch der Benutzer kann ja z.B. beide Steuerküppel gleichzeitig in Diagonaler Richtung bewegen, was schon das Senden auf 4 Kanälen gleichzeitig bedeutet. Außerdem muß man ja die Kanäle abfragen um festzustellen, wann etwas übertragen wird.

zu 4.: Ein Beispiel das hier meine Thematik zeigt ist die Dokumentation zu den Funkmodulen die in Robotikhardware angeboten werden. Hier wird von einer Verzögerung zwischen dem Zeitpunkt wo Daten am Sender eingelesen werden und die Daten am Empfänger-Ausgang anstehen von 20ms gesprochen. Das entspricht zwischen 20 und 10 Impulsen.

zu 5.: Das Thema Abfragen ob vom Sender etwas gesendet wird, bzw. das Erkennen wann ein Signal ansteht, bzw. sich ändert könnte zum Beispiel damit erreicht werden, das man alle 8 Signalleitungen der 8 Empfängerausgänge an die 8 AD-Ports des mega8 anschliesst. Sobald eine Flanke erkannt wird, muß die Länge ermittelt werden.

Und hier liegt ein Teil der Info die ich noch nicht habe:

1. Wenn vom Sender keine Änderung der Daten auf einem Kanal erfolgt, welcher Pegel liegt auf der Signalleitung, bzw. erfolgen trotzdem Impulse?

2. Ich vermute stark, das der Sender kontinuierlich über jeden Kanal den aktuellen am Sender anliegenden Wert überträgt. In diesem Fall muß ich laufend die Impulslänge ermitteln und mit einem abgelegten Wert vergleichen um Änderungen festzustellen. Hierzu muß man ermitteln bei welchem Schwellwert der Impulslängen-Änderung tatsächlich ein neuer Wert übertragen wird, oder ob es nur ein Rauschen ist. Dazu muß die Auflösung der Messung der Impulslängenänderung hinreichend fein sein. Und dieses bestimmt letzt endlich wieviele Kanäle vom mega8 gleichzeitig gepolt werden können.

Erst Änderungen der erkannten Impulslängen über einen zu ermittelnden Schwellwert lösen einen Übertragungsvorgang über I2C aus. Subsysteme dürfen also davon ausgehen, solange kein neuer Wert gesendet wird, hat sich der alte Wert nicht verändert.

Michael
29.10.2004, 17:30
Hallo Hellmut,


Die Information liegt analog vor

richtig, und fertig.
Heutige Sender arbeiten intern zwar digital, das Signal wird aber wie vor 20 Jahren (oder mehr) übertragen. Wenn du davon ausgehst, daß die Pulsweite ein Analogwert ist, erübrigt sich deine Frage nach den Schritten.
zu3. Lies dich doch nochmal in die Übertragungstechnik von Fernsteuerungen ein. Die Kanäle werden nie gleichzeitig übertragen.
Google z.B.: Impulstelegramm.


Verzögerung zwischen dem Zeitpunkt wo Daten am Sender eingelesen werden und die Daten am Empfänger-Ausgang anstehen von 20ms gesprochen. Das entspricht zwischen 20 und 10 Impulsen.

Das siehst du falsch. Der Abstand zwischen den Impulstelegrammen ist ca. 20ms. Also kriegst du in diese Zeit keine 10-20 Impuls(telegramm)e rein.
Zum Teil, den du noch nicht hast:
1. Es gibt keine "Pegel" auf der Signalleitung, die Information steckt in der Impulsbreite. Der Impuls hat immer Vcc (bei pos.Anlagen)
2. Ähh, was soll ich da jetzt antworten? Du kennst leider die Technik der Übertragung der Fernsteuerung nicht. Daher würden dir meine Antworten nicht passen. Später dazu sicher mehr.
Aber eines kann ich dir mit Sicherheit sagen: Dein Mega8 wird jeden Kanal einlesen können :)
Gruß, Michael

Hellmut
30.10.2004, 22:34
Hallo Michael

Kenne dich zwar nicht, aber mein Wissen zum Thema Funkfernsteuerungen wird in sehr anschaulicher Form hier vorgestellt. Kann übrigens auch anderen Benutzer dienen die sich hier informieren wollen:

www.veetail.com/HowRCWorks.shtml

Also nochmals um Mißverstände zu vermeiden, ich beziehe mich ausschliesslich mit dem Thema Signale auf jene vom Ausgangssteckker am Empfänger zum Servo. Wie du allerdings eine Flanke hin bekommst ohne mindestens 2 Pegel entzieht sich meinem Wissen.

Aber lassen wir die Polemik, dass bringt nichts.

Unter folgendem Link ist ein Fahrtregler mit dem AVR90S2323 beschrieben. Dort kann auch ein interessanter Assembler - Code eingesehen werden zu unserem Thema.

http://www.mikrocontroller-projekte.de/

Im Unterschied von den von mir genannten Code im Buch von C.Kühnel, arbeitet der Verfasser dort mit Interrupts. Meines erachtens wird beim Code von C.Kühnel der uController mit der Schleife die den DA-Port laufend auf die steigende Flanke abfragt um dann den Timer-Wert zu lesen voll beschäftigt. Eine weitere Bearbeitung wäre dann erst nach Abschluß der Auswertung aller z.B. 8 Kanäle während eines 20ms Intervalls möglich, und das kann knapp werden.

In dem Artikel den ich hier nenne könnte der mega8 in der Zeit bis mit der steigenden Flanke das Interrupt ausgelöst wird wo der Timer abgefragt wird um die Impulslänge festzustellen, andere Aufgaben lösen, das System dürfte damit zeitlich unkritisch werden.

Zum Thema Auflösung der Impulslänge, bzw. diskrete Schrittweite, der Verstellkommandos für die Servos suche ich noch. Ich fand allerdings die oben genannte Infos sehr anschaulich und mich darauf konzentriert. Allerdings empfiehlt es sich die Daten hinter den beiden Links zu studieren. Ich möchte die hier nicht bereitstellen, da ich damit fremdes geistiges Eigentum ohne Genehmigung veröffentlichen würde.

Das Thema Schwellwert der Impulslängenänderung ist für meine Anwendung wichtig, da ich sonst schon wegen der Fluktuation aus dem Rauschen laufend alle 8-Kanal-Servo Infos aktuallisieren und an die entsprechenden Subsysteme am I2C-Bus senden müßte. Ich werde bis auf weiteres von 256 diskreten Schritten über eine Impulslängen-Änderung von 1ms ausgehen, also 4 us.

Nach dem Buch von C.Kühnle braucht man 10 Takte bei 3,69 MHz 2,3Us bei Verwendung des Listings 32 mit Assembler Code. Die 4us müßten also beherrschbar sein.

Hierzu noch eine Frage: Bei einem mega8 mit einem 16MHz Taktgeber, wären dann 10Takte auf die sich C.Kühnle bezieht nur knapp ein viertel solang, also nur ,53 us? Ich dachte intern arbeiten die AVR´s immer mit 1MHz?

Michael
30.10.2004, 23:11
Hallo hellmut,
Wenn du alles hinter dem 1.Link weißt, warum fragst du dann noch?


ich beziehe mich ausschliesslich mit dem Thema Signale auf jene vom Ausgangssteckker am Empfänger zum Servo. Wie du allerdings eine Flanke hin bekommst ohne mindestens 2 Pegel entzieht sich meinem Wissen.

hmmm, du weißt doch (siehe Link) daß dort ein PWM-Signal rauskommt, ohne Pegel geht das nicht. Was wolltest du also sagen?


der uController mit der Schleife die den DA-Port laufend auf die steigende Flanke abfragt

hmmm, verstehe leider nicht, was du mit DA-Port meinst? Digital-Analog? Was soll das bringen?


Zum Thema Auflösung der Impulslänge, bzw. diskrete Schrittweite, der Verstellkommandos für die Servos suche ich noch.

geh von einem analog erzeugtem Signal aus. Die Weite des Pulses ist ein Analogwert! Schrieb ich aber schon 2 mal :(
Daher bestimmt die Auflösung am Ende die Taktfrequenz+Teiler.

Ich dachte intern arbeiten die AVR´s immer mit 1MHz?
nein, sie machen das nur, bis die Fuse-Bits umgestellt sind. Dann gehen auch 16MHz.
Gruß, Michael

Hellmut
31.10.2004, 12:03
Ach Michael, das wird mir zu bunt. Von jemand mit etwas mehr Lebenserfahrung lass dir sagen, mehr Nachdenken und zuhören verhindert Blindheit und erschliesst gelegentlich neues.

Aber danke zur Info.

Michael
31.10.2004, 12:13
Hallo Hellmut,
oh, ich kniee nieder. Mag sein, daß du Lebenserfahrung hast. 11 Jahre mehr als ich, wow. Aber ich würde mich an deiner Stelle nicht darauf ausruhen.
Ich bin gerne bereit zu helfen, aber wer sich nicht helfen lassen will, der hat schon, sorry.
Gruß, Michael

Hellmut
31.10.2004, 20:37
Lieber Michael, der Ton macht die Musik