Hallo,

wollte neulich versuchen, Servos mit dem RN-Control-Board anzusteuern. Dazu ist im Wiki ein Beitrag, der grob zusammengefasst so etwas wie einen Software-PWM auf einem 10µs-Raster vorschlägt.

Irgendwie wollte das aber nicht so, wie es sollte, wenn ich mehrere Servos ansteuern wollte, und ich hab mir das Signal mal im Oszi angeschaut... das stimmte hinten und vorne nicht.

Letztlich kam ich mit folgendem Programm dem Problem auf die Schliche:

www.gerrylab.de/embedded/TimerIntDemo.c


Das Problem ist, dass die Timer-Interrupts nicht sauber funktionieren, wenn zwischen den Aufrufen der ISR nicht mindestens ca. 4µs vergehen (worüber ich im Datenblatt nichts gefunden hab, vielleicht hab ich's überlesen?) - und das ist bei einem 10µs-Intervall nicht der Fall, wenn man 8 Servos steuern möchte.
Bliebe also nur der Ausweg, das Intervall zu verlängern. Dann aber wird das Servo etwas grobmotorisch.

Außerdem ist das Verfahren generell a bisserl ineffektiv... wenn ich nur ein Servo anschließe, und die ISR ungefähr 3µs läuft, hab ich den Controller zu 30% ausgelastet...

Also hab ich mir was anderes überlegt, und zwar, ohne zusätzliche Hardware zu spendieren.

Jetzt scheint's zu gehen, 8 Servos mit maximaler Genauigkeit, und das ganze bei 1% Auslastung der Prozessors (solange die Servos Ihre Position nur halten müssen, die Bewegung kostet ein bisschen was extra...)

Mich würde nun interessieren, was Ihr davon haltet:

www.gerrylab.de/embedded/Servo.c

Recht ausführlich getestet hab ich's, allerdings nur "stand-alone", Wechselwirkungen mit anderen Programmteilen hab ich noch nicht unter die Lupe genommen. Insbesondere mit weiteren Interrupts wird es sicher zu Problemen kommen können (das ist bei der Lösung im Wiki aber auch so).

Vielleicht hat ja jemand Lust, sich das mal näher anzusehen - oder kann's sogar brauchen

Viele Grüße, Gerry