Servo Steuerung

Gast #68468
Lesenswert?

Hallo,

ich tüftel gerad an einer Servo Steuerung für einen Roboter.
Normalerweise werden die ja über ein PWM Signal gesteuert. Für einen
Schreitroboter benötigt man nun 12 oder 18 Servos. soviele PWM Kanäle
hat aber kein Controller.
Nun die Idee:
Die Kommandos welcher Motor wohin dreht kommt z.B. über UART. In der
Hauptprogrammschleife wird nun permanent eine PWM an den Ports erzeugt.
Hmm... ich schreibs mal in Pseudo-Code:

(es gilt Standard-Servo PWM! 1.0 - 2.0 ms High, 48 ms Low)

while(1)
{
  UART KOMMANDOS AUSWERTEN;
  while(Zeit < 2 ms)
  {
     if Motor1: PINX0= HIGH;
     if Motor2: PINX1 = HIGH;
     if Motor3: PINX2 = HIGH;
     ...
     if Motor18: PIN.. = HIGH;
  }
  PINX = LOW;
  WARTE 48 ms;
}

Ich hoffe ich konnte mein Problem rüberbringen?! Gibt es hier
vielleicht noch eine Andere Lösung oder geht das so? Ich wollte auf
aufwendige Servo-IC´s verzichten. Denn so wird die Schaltung schon fast
trivial...
Der Controller wäre damit natürlich ausgelastet. Aber man könnte dafür
ja einen kleinen 2313 nehmen...

MfG Torsten
Gast #68469
Lesenswert?

du brauchst doch nicht für jeden Servoausgang einen PWM-Kanal (welche
übrigens gar nicht besonders gut dafür geeignet ist).
Der Trick besteht einfach darin, dass du nicht alle Servosignale
gleichzeitig erzeugst, sondern hintereinander (was anderes wird bei der
üblichen Fernsteuerung übrigens auch nicht gemacht).
Du programmierst dir einen Timer, beim Überlauf werden alle
Servoausgänge auf 0 gesetzt, lädst den Timer mit der entsprechenden
Wert (z.B. 1,5ms) und setzt jetzt den Ausgang für Servo1. Beim nächsten
Timerinterrupt (also nach 1,5ms) den Wert für Servo2 laden, Ausgang für
Servo2 setzen usw.
Eine extra Impulspause brauchst du gar nicht (deine 48ms sind  unüblich
viel), kannst aber auch alle einzelnen Zeiten addieren und dann eine
Pause auf konstante Zykluszeit einlegen.
Gast #68470
Lesenswert?

Problem:
Wenn Du über UART (im Interrupt) Kommandos empfängst, wird Dein
Main-Programm verzögert. Damit haut Dein Timing nicht mehr genau hin.

Lösung könnte vielleicht sein, wenn Du den UART-Empfang nur während den
48ms zulässt und während den 2ms sperrst, z.B. über eine Art Handshake.
Es wäre sinnvoll, den UART-Handshake etwas vor der nächsten PWM-Zeit zu
sperren (1ms).

Stefan
Gast #68471
Lesenswert?

Hui,
also jeden Motor nacheinander einen Impuls verpassen?
Aber damit ist das ja gar keine "echte" PWM?

Wär natürlich klasse wenn das so geht, ich dachte das ist alles sehr
zeitkritisch?

MfG Torsten
Gast #68473
Lesenswert?

die Information für das Servo steckt ausschliesslich in der
Impulsbreite, die Pausenlänge ist unkritisch. Zu lang darf sie
natürlich nicht sein, dann verlängert sich die Reaktionszeit.
Probier es so, wie ich es dir gesagt habe, funktioniert problemlos. Und
da die Impulszeiten mit einem Hardwaretimer erzeugt werden, sind die
auch exakt und stabil. Für 8 Servos habe ich das mal mit einem 2313
gemacht, irgendwo habe ich auch das Programm noch.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren