Hallo,
6 Servosignale einlesen und ausgeben mit einem AVR wird sehr kritisch. Hier was mit 3 Signalen:
https://www.roboternetz.de/community...l=1#post592054
plus thread von vorne
Gruß
Searcher
Tag zusammen,
ich hänge momentan an einem kleinen Problem.
Ich möchte von einem RC-Empfänger, der mir leider kein Summensignal liefert (zumindest mit dem Oszi keins gefunden (EK2-0424))
alle 6 Servo-Signale mit einem AVR erfassen.
Diese sollen dann je nach Verwendungszweck manipuliert werden (Mischer, Teilautomatik, etc.) und dann wieder als 6 Servo-Signale ausgegeben werden.
Die Ausgabe erfolgt momentan per Timer1 im CTC Mode mit einer Frequenz von 50Hz (20ms Paketlänge des Servo Signals).
Nur die Eingabe macht mir etwas Probleme. Sobald sich nämlich Einlesen und die Ausgabe Interrupt mäßig in die Quere kommen, führt dies logischerweise zu starkem Jitter auf den Servo Kanälen, da das Timing nicht mehr stimmt.
Hat jemand von euch eine Idee wie ich das lösen könnte, oder sowas ähnliches schon mal versucht.
Grüße Basti
Hallo,
6 Servosignale einlesen und ausgeben mit einem AVR wird sehr kritisch. Hier was mit 3 Signalen:
https://www.roboternetz.de/community...l=1#post592054
plus thread von vorne
Gruß
Searcher
Hoffentlich liegt das Ziel auch am Weg
..................................................................Der Wegzu einigen meiner Konstruktionen
MfG (Mit feinem Grübeln) Wir unterstützen dich bei deinen Projekten, aber wir entwickeln sie nicht für dich. (radbruch) "Irgendwas" geht "irgendwie" immer...(Rabenauge) Machs - und berichte.(oberallgeier) Man weißt wie, aber nie warum. Gut zu wissen, was man nicht weiß. Zuerst messen, danach fragen. Was heute geht, wurde gestern gebastelt. http://www.youtube.com/watch?v=qOAnVO3y2u8 Danke!
Ich hätte villt erwähnen sollen, dass es sich um einen 2,4GHz Empfänger handelt *KopfaufTisch*
Der Emfänger IC ist ein nRF2401
https://www.sparkfun.com/datasheets/...2401rev1_1.pdf
Und danach gehen die Daten digital (meine ich zumindest dem Datenblatt des nRF zu entnehmen) an einen Controller: C8051F330 von Silicon Labs
https://www.silabs.com/Support%20Doc.../C8051F33x.pdf
Also meiner Meinung nach keine Stelle, an der ich ein Summensignal hätte.
@Searcher
Danke, diesen Thread habe ich bereits gelesen.
Das es mit 6 Kanälen recht Zeitkritisch wird, habe ich mir fast gedacht.
Villt bringt es was, die Ausgabe Frequenz auf 25Hz zu reduzieren, dadurch wird ein Servosignal 40ms lang, da dürfte sich doch dann eine genügend Lange Pause ergeben, um mal eben die Eingänge zu sampeln? Oder ist dieser Ansatz totaler Mist?
Gruß Basti
Sorry, ich habe dein Problem so verstanden, dass du alle Servoimpulse einzeln einlesen möchtest._.
MfG (Mit feinem Grübeln) Wir unterstützen dich bei deinen Projekten, aber wir entwickeln sie nicht für dich. (radbruch) "Irgendwas" geht "irgendwie" immer...(Rabenauge) Machs - und berichte.(oberallgeier) Man weißt wie, aber nie warum. Gut zu wissen, was man nicht weiß. Zuerst messen, danach fragen. Was heute geht, wurde gestern gebastelt. http://www.youtube.com/watch?v=qOAnVO3y2u8 Danke!
Hallo Basti,
Die Frage ist ob alle Servo-Impulse gleichzeitig ausgegeben werden oder zeitlich versetzt?
Der Servo-Impuls ist maximal 3ms breit. Ursprünglich wurde im Zeitmultiplex gesendet. So in der Art:
0ms Kanal1
5ms Kanal2
10ms Kanal3
15ms Kanal4
20ms Kanal5
25ms Kanal6
30ms Kanal7
40ms Kanal1
...
Zwischen Kanal 7 und 1 fehlt ein Kanal, dadurch kann Kanal1 identifiziert werden.
Entsprechend waren die Impulse an den Servos auch entsprechend zeitlich versetzt.
Also miss das mal.
MfG Peter(TOO)
Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?
Hatte ich schon mal gemessen, und auch versucht mit Diodenmatrix wieder ne Art Summensignal aus den Kanälen zu generieren.
Die Kanäle kommen zeitlich versetzt, aber direkt nacheinander, ohne Pause!
Wenn Kanal 1 wieder auf LOW zieht geht exakt im selben Moment Kanal 2 schon auf HIGH. Hinter der Diodenmatrix hatte ich dann ein langes Signal.
Gruß Basti
Hi Basti,... RC-Empfänger, der ... kein Summensignal liefert ... 6 Servo-Signale ... erfassen ... manipuliert ... als 6 Servo-Signale ausgegeben ...
So etwas hab ich noch nie versucht. Aber wenn ich das so überlege: der Stress entsteht beim Auslesen, weil Du da im worst case alle Signale gleichzeitig oder so bekommst. Und gleichzeitig einlesen geht ja nu nich - oder doch ?? *ggg*
Hintergrund: ich habe bei (wenigen) Servos die Auflösung gemessen, die liegt bestenfalls um die 4 .. 5 µs, Ähnliches steht in Herstellerangaben.
Also schlage ich vor:
- Ein controller, der die Eingangssignale an EINEM Port hat, z.B. Mega328 - Port B (am D hängt der Quarz :-/ )
- 20 MHz Takt - das kann der 328er, meine jedenfalls laufen so primstens.
- Eine schnelle Timerroutine, vielleicht 10 µs, die NUR den Port einliest, das ist EIN CPU-Takt, dazu noch ne Zeitmarke hochtickert und abspeichert. Damit wirst Du mit Overhead von den 200 verfügbaren Takten höchstens 50 für die ISR brauchen (nur meine Schätzung). Leider ist das nur die halbe theoretische Auflösung des Servos - aber schneller gibts dann sicher Zeitstress für den "Rest".
- Du erhältst also ALLE Servosignale die innerhalb einer Zeitspanne von 10µs umschlagen.
- Ausserhalb dieser ISR wird der jeweilige Portumschlag gesucht und mit Zeitmarke abgespeichert.
- Nu kannst Du auswerten - und hast dazu reichlich Zeit. Wieviel? Mal sehen:
- 6 Servosignale belegen maximal 6 x 2 ms, also 12 ms - von den standardmässigen 20. Servopuls setzen und löschen braucht höchstens die Hälfte für "alles" - siehe im Link und ähnlichen Threads ne wirtschaftliche Servoansteuerung. Und da denke ich eben bleibt genug Zeit für Deine Signalmanipulation (nicht geschätzt - nur erhofft).
- Sinn dürfte es machen die ISR´s zur Servo-Ansteuerung als nested Interrupts laufen zu lassen, damit Du Deine Einleseroutine nie ausbremst !!!
Funktion, Machbarkeit und Richtigkeit wird von mir nicht gewährleistet.
Geändert von oberallgeier (17.12.2014 um 17:40 Uhr) Grund: Hinweis auf nested Interrupts bei "Ausgabe"
Ciao sagt der JoeamBerg
Hallo,
Wirklich gleichzeitig? Oder sind da nicht ein paar CPU-Takte als Lücke vorhanden.
Dann halt mit 2 Matrixen:
Matrix1: Kanal 1,3 und 5
Matrix2: Kanal 2,4 und 6
Dann bräuchte man nur noch 2 Timer, welche die Impulsbreite messen können!
Dazu kenne ich aber die AVR zu wenig, müsste ich erst mal im Datenblatt nachsehen.
MfG Peter(TOO)
Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?
Lesezeichen