www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Servo Steuerung


Autor: Torsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan Kleinwort (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Torsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dominik S. Herwald (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der SD20 (eigentlich ein PIC16F876) kann genau dass was du brauchst:

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

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

MfG,
Dominik S. Herwald

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.