Forum: Mikrocontroller und Digitale Elektronik Servo Steuerung


von Torsten (Gast)


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

von crazy horse (Gast)


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.

von Stefan Kleinwort (Gast)


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

von Torsten (Gast)


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

von Dominik S. Herwald (Gast)


Lesenswert?

Der SD20 (eigentlich ein PIC16F876) kann genau dass was du brauchst:

http://www.roboter-teile.de/Shop/pd-116159946.htm?categoryId=3

Nur dass er über I2C angesteuert wird - kann man aber leicht
implementieren.

MfG,
Dominik S. Herwald

von crazy horse (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.