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
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.
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.