PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PWM und Schieberegister



Wsk8
18.06.2013, 10:32
Hallo,
ich will mit möglichst wenigen HW-PWM-Pins viele Servos ansteuern. Im Internet habe ich dann Servoboards gefunden, wo 1 PWM Kanal auf ein 8bit Schieberegister (74HC595) geschaltet wird und man somit 8 Servos ansteuern kann. Leider blick ich da nicht so wirklich durch wie das Softwaremäßig abläuft, also was genau an das Schieberegister angelegt etc.

Könnte mir das mal einer genau und einfach erklären, damit ich es selbst machen kann? :)

mfg

PICture
18.06.2013, 11:06
Hallo!

Ich werde es gerne versuchen, aber wie magst du es haben: wörtliche Beschriebung oder skizzierten Zeitdiagramm ?

Für 8 PWM's ist nur ein 8-bittiger Schieberegister nötig ("Serial In Paralell Out" z.B. 74XX164). Für 8 unterschiedlichen PWM Frequenzen wird die Steuerung bzw. Software ziemlich kompliziert und schwer verständlich.

Übrigens, am liebsten wäre mir deine konkrete Fragen zu beantworten. ;)

Wsk8
18.06.2013, 12:49
Also wörtliche Beschreibung reicht vermutlich schon bzw. für 8 gleiche PWMs verstehe ichs ja. Wie ein Schieberegister allgemein funktioniert weiß ich. Ich bräuchte aber 8 verschiedene PWMs. Hier verstehe ich nicht wie das funktionieren soll und fertige PWM-Boards werden ja vermutlich auch 8 unterschiedliche Signale liefern?!

Wenn es anders leichter geht, dann wärs mir auch recht. (Soft-PWM?)

Prinzipiell will ich nur ein Board das 20 (verschiedene) PWM Ausgänge für Servos hat und über eine Schnittstelle (vermutlich rs232) Daten empfangen kann (Also in etwa Setze Servo 3 auf 128 ).

mfg

PICture
18.06.2013, 13:06
Hier verstehe ich nicht wie das funktionieren soll und fertige PWM-Boards werden ja vermutlich auch 8 unterschiedliche Signale liefern?!

Ich auch nicht, weil z.B. Parameter von fertigen PWM-Boards wie Frequenz, %-Bereich von PWM, usw. mir unbekannt sind.

Allgemein bei gleicher für alle Frequenz hat jeder PWM-Ausgang seine Adresse/Nummer. Alle Ausgänge werden gesetzt und ein überwachter Zähler gestatet. Die für konkreten PWM-Ausgang Zahlen werden sich in einer Tabelle befinden. Nach erreichen von bestimmter Zählerstand wird zugehöriger Ausgang gelöscht. Beim überlauf des Zählers werden wieder alle PWM Ausgänge gesetzt, usw. Alle entsprechende Werte der Ausgänge werden in ein Schieberegister bei jeder Änderung neu eingeschoben.

oberallgeier
18.06.2013, 14:25
... mit möglichst wenigen HW-PWM-Pins viele Servos ansteuern ... wo 1 PWM Kanal ... 8 Servos ansteuern kann ...Mal langsam: PWM macht man ja gerne mit Hardware - es wird ein Timersignal auf einen Controllerpin gesteuert. Wenn man mit "wenigen HW-PWM-Pins viele Servos ansteuern" möchte, dann hat man mehrere Software-Servo-Ansteuerungen. Fazit: ich habe das gleich "ohne PWM" gemacht (https://www.roboternetz.de/community/threads/61379-Kopfsache-und-ein-m1284-etliche-Servos-viel-Alu) und steuere dabei 10 (zehn) Servos an, mit gleicher Genauigkeit könnte ich bequem auch 18 oder 20 Servos ansteuern.

Stichwort (Stichwörter): TIMER1_COMPA_vect und TIMER1_COMPB_vect.

Erklärung:
Die ISR TIMER1_COMPA_vect läuft mit 1/10 der Servoperiode und immer mit gleichbleibendem OCR1A-Wert, also gleicher Länge; bei Dir wären das dann nur 1/8. Diese ISR startet die Zeit für die TIMER1_COMPB_vect-ISR und knippst einen Servo an. Der zuständige Servopointer wird mit einem rundlaufenden Zeiger bestimmt, die Länge der COMPB_vect-ISR, sprich OCR1B, wird ebenfalls mit diesem rundlaufenden Zeiger bestimmt, dieser Wert variiert je nach Servo und Deinen Wünschen. Sobald die entsprechende Zeit, sprich OCR1B, abgelaufen ist, wird durch die COMPB_vect-ISR der entsprechende Pinn abgeschaltet. Danach kommt natürlich wieder der Timer1 zu seinem Interrupt und die Geschichte beginnt mit dem nächsten Zeiger genauso. Das Ganze funktioniert sauber und quarzgenau (wenn man die Servo-ISRs nicht mit etlichen anderen Interrupts ausbremst). Einschränkung: OCR1A muss IMMER größer als OCR1B bleiben - plus der Zeiten für die Overhead-Aktionen der ISR.

Ist Dir das klar? Ausführungen dazu gibts noch im oben erwähnten Link - und auch auf Nachfrage.

Nachtrag: meinen Code gibts dazu hier (klick). (https://www.roboternetz.de/community/threads/61379-Kopfsache-und-ein-m1284-etliche-Servos-viel-Alu?p=577715&viewfull=1#post577715)

malthy
18.06.2013, 16:02
Ich habe mal das hier irgendwo aufgeschnappt (vielleicht hier?):


http://www.youtube.com/watch?v=FbyjNPC6SxI

Es scheint noch ein paar Infos dazu zu geben: http://www.photopete.com/swarm/arduino/

Ich denke unter dem Stichwort "Servomultiplexer" kannst du nochmal weitersuchen.

Gruß
Malte