RC-Servo-Ansteuerung: Sind Digital-Servos unempfindlich ?

hi NG, wahrscheinlich bin ich hier gar nicht so ganz richtig. Ich versuch's trotzdem mal.
Das Problem: Ich möchte mit einer selbstentwickelten Elektronik bis zu 8 Servos
ansteuern. Bekanntlich werden die RC-Servos durch Impulse unterscheidlicher Länge (1-2ms) angesteuert, die alle 20ms wiederholt werden. Die Impulslänge entscheidet über die Stellung.
Meine Schaltung funktioniert soweit, allerdings komme ich mglcherweise mit der Wiederholung der Impulse alle 20ms nicht ganz hin, jedenfalls beginnen die Servos zu zittern soblad ich mehr als 6 Servos steuere. Technisch nutze ich 2 Timer, der erste startet die Sequenz alle 20ms neu, der zweite wird zunächst mit der Impulslänge des ersten Servos geladen,dann mit der zweiten usw. Theoretisch sollte am Ende der Sequenz sogar noch ein wenig Zeit übrig sein - auch bei 8 Servos.
Sind neue Digitalservos gegen eine Überschreitung der 20ms (z.B 23ms wäre schon hilfreich) robuster als meine uralten fast 20 Jahre alten Servos aus der Grabbelkiste ?
Gruss Nico
Add pictures here
<% if( /^image/.test(type) ){ %>
<% } %>
<%-name%>
Add image file
Upload
Hallo Nicolas,
Nicolas Nickisch wrote:

Wie erzeugst Du den eigentlichen Impuls? Wenn Du das nicht über ein Compare-Modul des Prozessors machen kannst, wird der von Dir erzeugte Impuls Jitter in der Größenordnung 5-10µs haben. Das reicht bewuem, um Servos zur Unruhe zu bringen. Wie schnell ist DeinProzessor, was für einen Prozessor verwendest Du?

Da könnte FailSafe zuschlagen, aber dann müsste mindestens ein Impuls ausfallen.
Gruß, Kurt
--
Kurt Harders
PiN -Präsenz im Netz GITmbH
  Click to see the full signature.
Add pictures here
<% if( /^image/.test(type) ){ %>
<% } %>
<%-name%>
Add image file
Upload
Kurt Harders schrieb:

Ich würde auch Jitter vermuten. Aber tröste Dich, Nicolas, es gibt namhafte Hersteller, die dieses Problem auch nicht vollends im Griff haben ;-)

Wenn Jitter, dann definitiv nein, im Gegenteil würde ein digitales Servo noch nervöser agieren.
Im übrigen sind die meisten Servos in weiten Grenzen unempfindlich gegen eine Veränderung der Pausezeit, solange nur die Impulsbreite hinreichend konstant ist. An dieser Stelle würde ich das Problem daher eher nicht sofort vermuten.
Gruß Hajo
--
Modellelektronik, Modellzubehör, RC-Zubehör, CNC-Technik
http://www.flugmodellbau.de - http://www.flugmodellbau.biz
  Click to see the full signature.
Add pictures here
<% if( /^image/.test(type) ){ %>
<% } %>
<%-name%>
Add image file
Upload
Ich benutze eine µC (ATMEGA16 mit 16MHz) Timer1 schlägt alle 20ms zu und startet die Impulssequenz neu (der Timer läuft genauer gesagt 10ms)
Timer2 ist für den eigentlichen Impuls zuständig, also so:
-Port-Pin1 einschalten - Timer2 mit dem für die STellung richtigen Wert laden -Timer2 starten
In der Interrupt-Routine dann ... - Port-Pin ausschalten (= Impuls beenden) - nächsten Port-Pin ein - Timer neu laden (mit Stellung für nächsten Servo) - Timer starten
Mit dem Compare habe ich noch nichts gemacht, beim Durchlesen des Manuals war ich der Meinung, dass das für mich nichts ist, weil ich sozusagen nicht genügend Timer zur Verfügung habe. Interessant wäre natürlich die Ansteuerung ganz ander zu realisieren. Wichtig ist wahrscheinlich mehr das Impuls-Pausenverhältnis, oder ? Gibt es für sowas separate Bausteine ? am besten in mit I2C-Anschluss
Gruss Nico

Add pictures here
<% if( /^image/.test(type) ){ %>
<% } %>
<%-name%>
Add image file
Upload
Hallo Nicolas,
Nicolas Nickisch wrote:

OK.
Diese Sequenz ist meist schon zu ungenau, spätestens wenn ein Interrupt dazwischen kommt. Starte den Timer2 und lass den Compare-Baustein den Pin zurücksetzen. Den Interrupt, der dann auch kommt, brauchst Du dann nur noch, um den nächsten Kanal zu starten, und nicht um den Pin zurückzusetzen.
[...]

Nein, es geht um die exakte Pulslänge, die Pause kann alles von ca. 10-25ms sein. Unter 10ms habe ich schon Servos gehabt, die Probleme hatten.
Gruß, Kurt
--
Kurt Harders
PiN -Präsenz im Netz GITmbH
  Click to see the full signature.
Add pictures here
<% if( /^image/.test(type) ){ %>
<% } %>
<%-name%>
Add image file
Upload
Mein Problem ist, ich habe 6 bzw. im Endausbau 8 Servos, aber nicht genug Pins am ATMEL. Daher hängen alle Impulsanschlüsse an einem PCF8574 ( 8-Bit I/O am TWI) Wenn es solche Bausteine mit 8x PWM Ausgängen gäbe - ich rüste sofort um. Dein Konzept klingt gut.
Nach etwas Code-Änderung läuft es jetzt ganz prima, mit ein bisschen Servobrummen allerdings. Ausserdem soll die Applikation noch einiges mehr machen und zwar ziemlich viel per Interrupt. ich sehe also einiges an Problemen auf mich zukommen.
Gruss Nico

Add pictures here
<% if( /^image/.test(type) ){ %>
<% } %>
<%-name%>
Add image file
Upload

Berechne im Hauptprogramm die Impulslaengen ( Timerstartwerte). Diese legst Du ins RAM. Die Impulserzeugung laeuft dann per Timerinterupt im Hintergrund. Solltest du aufgrund lustiger Multi- und Div-Routinen zu lange zu rechne haben weden trotzdem saubere PPM-Impulse erzeugt.
Gruss Sven
Add pictures here
<% if( /^image/.test(type) ){ %>
<% } %>
<%-name%>
Add image file
Upload
Hallo Sven,
Sven Stoecker wrote:

Das reicht, so lange kein anderer Interrupt auftritt. Wenn, wie bei meinen Servoantrieben, auch noch ein Eingangssignal dekodiert wird, klappt eine Impulserzeugung ohne Jitter nur mit Compare-Unit, also mindestens per Hardware rückgesetztem Impuls. Ich stelle gerade meine Produkte auf den ATMega um, denn der hat eine 16-Bit PWM, die bei 1µs Takt also auch 20ms Zykluszeit zulässt und auf 1µs auflöst. Damit läuft die komplette Pulserzeugung in Hardware. Am Ende des Impulses lasse ich mir einen Interrupt geben und habe dann, da ich nur einen Impuls erzeuge, 19ms Zeit. Bei der Anforderung des OP würde man die Impulszeit setzen und durch das gepufferte Vergleichsregister sofort den nächsten Impuls berechnen und setzen. Das Ganze getriggert durch den "Pulsende" Interrupt.
Gruß, Kurt
--
Kurt Harders
PiN -Präsenz im Netz GITmbH
  Click to see the full signature.
Add pictures here
<% if( /^image/.test(type) ){ %>
<% } %>
<%-name%>
Add image file
Upload

Ja, da hast Du recht, dann muesste man die Ausgabe am Eingangssignal sysncronisieren. wie immer gibt viele Wege.

Der Mega 8 hat 8, 9 und 10bit PWM. Wie siehts bei den "Grossen" aus?

20us = 50 Schritte

wie immer gibt viel Wege zum Ziel:-)
Gruss Sven
Add pictures here
<% if( /^image/.test(type) ){ %>
<% } %>
<%-name%>
Add image file
Upload
Hallo Sven,
Sven Stoecker wrote:

Autsch, bei 50µs Flankenabstand. Noe, da macht der Flankenwechsel einen Interrupt, un die PWM läuft beim ATMega8 frei (s.u.).

Nein, der ATMega8 hat 8,9,10 und 16-Bit PWM (Fast PWM).

?? 20 Millisekunden Zyklus, 1 Mikrosekunde Auflösung. Ab 2-3µs werden die Servos unruhig. Zuerst "brummen" sie, weil ständig Regelbedarf besteht, ab 5µs läuft das Servo sichtbar an.
Gruß, Kurt
--
Kurt Harders
PiN -Präsenz im Netz GITmbH
  Click to see the full signature.
Add pictures here
<% if( /^image/.test(type) ){ %>
<% } %>
<%-name%>
Add image file
Upload

Ist klar, wergen der PWM werd ich das Datasheed nochmal genauer "untersuchen" muesse.
Ich gehe immer noch mit einem LS-Modul "schwanger" Also komplette PWM einlesen und mit zwischen Graupner und Futabe konvertierter Servobelegung wieder ausgeben. Evtl noch Deltamischer und paar % Expo per Schalter. Hier klappts dann mit der Syncronisation der einund Ausgehenden Daten. Weihnachten weiss ich aber mehr.
Wer jetzt sagt, dasbraucht kein mensch versuche mal bitte ein Delta mit Expo von Schueler (MCxxx) auf Futaba FC18 zu basteln, viel Spass:-(
Gruss Sven
Add pictures here
<% if( /^image/.test(type) ){ %>
<% } %>
<%-name%>
Add image file
Upload
Woowww! Das klingt danach, als wäre es die Lösung meiner Probleme. Ich melde mich nach genauerem Studium des ATMEGA-Manuals nochmal. Das PWM habe ich bsiher völlig ignoriert (siehe oben), weil ich dachte, es würde sich nur für ein einziges Servos eignen, nicht aber für meine 6.
Nico

Add pictures here
<% if( /^image/.test(type) ){ %>
<% } %>
<%-name%>
Add image file
Upload
So in etwa mache ich das auch (siehe Antwort-Posting weiter oben)
Hast Du noch andere Ideen ? Bin für alle Weiterentwicklungen offen.

Add pictures here
<% if( /^image/.test(type) ){ %>
<% } %>
<%-name%>
Add image file
Upload

Ich glaub wir sind uns mit Kurt einig dass die Variante der PWM gut geht aber nur fuer eine Servo. Fuer 6 Servos musst Du die interupt-Variante verwenden. Ein timer laeuft endlos und startet bei Ueberlauf den 2. Timer der dann die Impulse per Interupt erzeugt. Dann darf aber keine andere Interuptroutine laufen. Die Daten fuer die Startwerte berechnest du im Hauptprogramm und legst sie im Ram ab. Hast Die 16 Bit -Werte beim Ablegen kurz die Interups sperren.
Hast du noch ander Jobs zu erledigen versuche das dann nach Erzeugung des letzten Servoimpulses legen. Einfach diese Sachen nur abarbeiten wenn Timer 2 nicht laaeuft.
Gibts einwaende Kurt?
Gruss Sven
Add pictures here
<% if( /^image/.test(type) ){ %>
<% } %>
<%-name%>
Add image file
Upload
Hallo Sven,
Sven Stoecker wrote:

Dann kannst Du aber nichts anderes mehr bearbeiten, das auch Zeitnah sein muss. Es gibt doch den "reset pin on match". s. auch meine Antwort an Nicolas.

Grundsätrzlich nicht, aber warum den Interrupt sperren und selbst den Impuls beenden, wenn die Hardware das so wunderschön kann? Ich habe in meinen PIC-Weichenbausteinen einen 1µs-Takt und dekodiere neben der Impulserzeugung noch ein Selectrixsignal mit 50µs Pulslänge :-).
Gruß, Kurt
--
Kurt Harders
PiN -Präsenz im Netz GITmbH
  Click to see the full signature.
Add pictures here
<% if( /^image/.test(type) ){ %>
<% } %>
<%-name%>
Add image file
Upload

Den Compare-Modus hab ich noch nie benutzt. Den Teil Teil des Sheeds muss ich grosszuegig ueberblaettert haben:-( Ich gelobe hiermit Besserung und werde die Funktionen gleich mal testen. Kann eigentlich mein Projekt LS-Adapter nur vereinfachen. Dank fuer Deine Hartnaeckigkeit:-)
Gruss Sven
Add pictures here
<% if( /^image/.test(type) ){ %>
<% } %>
<%-name%>
Add image file
Upload
Hallo Sven,
Sven Stoecker wrote:

Ich habe gerade noch mal alle Postings überdacht: Du hast beim Compare-Mode ja bestenfalls (ATMega8 u.ä.) zwei Impulsausgänge. Du musst also in jedem Fall einen externen Multiplexer einsetzen, der den jeweiligen Impuls auf ein en von 8 Ausgängen leitet.
Gruß, Kurt
--
Kurt Harders
PiN -Präsenz im Netz GITmbH
  Click to see the full signature.
Add pictures here
<% if( /^image/.test(type) ){ %>
<% } %>
<%-name%>
Add image file
Upload

Fuers Projekt LS-Adapter ist das schon o.K. Fuer 6 Servoimpulse gehts aber auch anders. Der Servoimpuls ist ja ein 1-2ms langer H impuls. Generiere man das L des PPM-Signales per Compare-Ausgang und ziehe damit den Servoausgang aus L. Jetzt muss man nur noch den Servoausgang Ausgang waerend der Pausenimpulses auf H-Schalten. Multiplexen mit ein paar Widerstaenden.
Gruss Sven
Add pictures here
<% if( /^image/.test(type) ){ %>
<% } %>
<%-name%>
Add image file
Upload
Danke für den Tip. So habe ich es mir gedacht. Bei 8 Servos sollte bei 2-2.2ms Impulsänge noch etwas Zeit bleiben um den rest zu machen. Daher meine Frage, ob man die 20m auch verlängern könnte.
Gruss Nico

Add pictures here
<% if( /^image/.test(type) ){ %>
<% } %>
<%-name%>
Add image file
Upload

Polytechforum.com is a website by engineers for engineers. It is not affiliated with any of manufacturers or vendors discussed here. All logos and trade names are the property of their respective owners.