PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 24Servos per PWM mit einem Pic16F690 ansteurn



El_Salvador
17.12.2007, 11:56
Hallo,

ich hab da ein Problem. Ich habe 24 servos an meinem Bot und will alle durch einen uC ansteuern.

Ich habe einige 8bit Schieberegister geholt und will das damit realisieren. Der Pic müsste auf höchstgeschwindigkeit laufen, daher ich 20Hz(24*50Hz=700Hz). Ich habe vor die 8Schieberegister an Port A zu verwenden und per Computer oder anderen Pic die Befehle zu übertragen.

Um diesen Treiberbaustein zu realisieren muss ich wohl oder übel mit Assembler arbeiten(unter C wirds sonst ungenau).


Jetzt kommt die eigendliche Fragestellung:
Um ein PWM per Pollin zu erzeugen(was auch nötig wäre), bräuchte ich die Information, wie viele us ein NOP hat(uC hat einen 20MHz Quarz).
Und gibt es vielleicht eine Liste von Befehlen(wo der Takt dabei ist)?
Tutorials und bei spurt.de habe ich schon ne Liste gefunden, aber es enthält nicht den Takt.

Ich hoffe das mir jemand da weiterhelfen kann, da es bis Weihnachten einigermaßen laufen muss.

MfG

El_Salvador

PicNick
17.12.2007, 12:26
Bei den PICern ist es, so, daß die Quartz frequenz durch 4 zu teilen ist, das ist dann 1 Cycle.
Ein NOP braucht haarscharf 1 Cycle.
Mit 20 MegaHerzen braucht ein NOP also 0,2 µS
Was ein Befehl verbrät, steht auf jeden Fall in der "InstructionSet" Doku.

El_Salvador
19.12.2007, 13:30
Erstmal danke für die info mit den Nops.

Ich habe nun ein 74HC595(Scieberegister), die für mein projekt verwenden will. Ich hab den mal zu Testzwecken mal proversorisch mal angeschlossen(ATX Netzteil) und bemerkt, dass er nicht will, wie ich es haben will.

Bei "www.mikrocontroller.net/articles/AVR-Tutorial:_Schieberegister" gabs zwar eine Schöne beschreibung, aber ahnscheinend mach ich immer noch was falsch. Wenn ich SCK mit den Finger berühre(gibt ja auch ein impuls und bei 5V reagiert er gar nicht), sind alle pins auf High(Auch wenn ich es gerade eben unter strom setze). Problematisch ist auch, dass ab und zu mal der SCK 3V hat.

Mal sehen wie ich das angeschlossen habe,...:
pin 1 bis 7 -> LEDs
pin 8 -> masse
pin 16 -> 5V
pin 15 -> LED
pin 14 -> ist mein Signal
pin 13 -> masse
pin 12 -> ist mein Clock
pin 11 -> ist mein pin um das Signal auf das Register zu übernehmen
pin 10 -> 5V
pin 9 -> Not Connected

So wie ich das verstanden habe, ist es so dass ich mit pin 14 und pin 12 Das Signal produziere und nach den 8bit(die ich so eingebe), gebe ich kurz 5V auf pin 11.

Theroretisch müsste es ja genau so laufen^^.
Kann mir da einer weiter helfen? Die Bauteile habe ich schonmal alle für das Projekt(Platine, 2x Pic16F690, 4x Schieberegister).

El_Salvador
23.12.2007, 16:19
nach vielen Stunden des ausprobieren, hab ich endlich herrausgefunden woran es gelegen hat,... Oh man das Problem war, dass ich den Clock bzw meine Daten nicht auf masse gebracht habe. Ich bin doch nen Depp. So was einfaches, da hätte ich früher drauf kommen können. Jetzt löte ich mal alles zusammen. jetzt bin ich optimistisch, dass es klappt. obwohl mir nur noch zwei Tage bleiben^^. da muss ich mich eben rann halten;-).

deSilva
23.12.2007, 16:47
Ich will nicht unken... Ich habe vor einigen Wochen mehrere Varianten von 32-Kanal-PWM Treibern für den Parallax Propeller geschrieben (-> ewig langer Propeller Thread hier irgendwo)
Das ist nicht ganz so trivial.. Ein COG im Propeller läuft etwa 10x so schnell wie ein 20 MHz PIC; ich brauche aber für die Organisation (umsortieren der Kanäle, um sie in der richtigen Reihenfolge zu schalten) einen großen Teil der 10 ms Periode....

phaidros
23.12.2007, 19:38
Also 24 PWMs gehen bei mir mit einem PIC 18F452 @ 20 MHz.

Aber bis Weihnachten? Nie und nimmer.
Hat mich Wochen gekostet, das auszutüfteln.

deSilva
24.12.2007, 01:44
Hat mich Wochen gekostet, das auszutüfteln.
Genau, darauf wollte ich hinaus :-) Die "Organisation" ist nicht trivial, wenn man so enge Zeitbedingungen hat...

Eventuell kann man gar nicht alle 20 ms einen "update" der Pulslängen zulassen, die ein Umsortieren der Liste zur Folge hätte, sondern nur der Reihe nach immer nur eines der 24... Dann macht sich eine Änderung aber erst nach 480 ms bemerkbar, das ist eher auch nichts...

Eben viel Trickserei...

Oder man muss die Auflösung von 1/256 auf 1/128 reduzieren.. (Mit dem Propeller konnte ich mir allerdings 1/1000 leisten :-) )

--
Edit: Oops, Rechenfehler..

HannoHupmann
24.12.2007, 11:22
Tja man kann auch einfach ein SSC32 Board verwenden das kann locker 24 Servos ansteuern (sogar Synchron)

Aber für meinen Hexa hab ich auch nen Propeller genommen und damit die 18 Beinservos angesteuert, das funktioniert jetzt wunderbar und auch schnell genug um im 50Hz Rythmus Signale an die Servos zu schicken.

El_Salvador
29.12.2007, 05:01
Hallo an alle, tut mir leid, dass ich solange nichts reingeschrieben habe, aber ich war im programmieren vertieft. Schade, dass ich nicht in diesen Zeitraum geschafft habe, aber ich gebe natürlich nicht auf;-) Ich dachte eben, ich könnte es noch schaffen, wenn ich 48 stunden durscharbeite. Wollte eben nicht sein.


Also soweit erstmal meine Rechnung:


1/20MHz = 50us(0,000 000 05 s)
1/50Hz = 20ms (0,02 s)
20ms/256 (0,000 078 125s)

(20ms/256)/50us = 1562,5 Nops ---> PWM Signal

Bei so wenigen Nops, muss ich wohl ein 10bit PWM machen. 16bit hätte mich gefreut.

@phaidros kannst du mir vielleicht einen Tip geben wie ich das verwirklichen kann, dass ich alle Servos per einen Schritt aktualiseren könnte, oder wie du das gemacht hast?

Meine Idee war so, dass ich immer nach mein PORTC gefragt hätte, was ich verändern soll und mit PORTB hätte ich den dazugehörigen Servo ausgewält. Gleich danach würde der PIC den Wert in die Schieberegister speichen und den wert mit einem Schlag per RCK anzeigen lassen. Danach sollte er diese Schritte im while(1) immer wieder wiederholen.

Die Werte sollten eben Global gespeichert werden und demnach wie viele Nops vergangen sind, sollte der Pic die Pegel auf Low setzen, um ein PWM zu erhalten, nach den 50Hz muss er eben alle wieder auf High bringen.

Diese Werte müssen Global gespeichert werden, daher ich unter umständen nicht alle Servos verändere. Also PORTC --> Global --> PORTA

Soweit meine Theorie

phaidros
04.01.2008, 04:01
War im Urlaub, deshalb die späte Antwort.
Ich habe keine Schieberegister benutzt, sondern drei komplette Ports. Jedes Portbit hängt direkt an einem Servo.
Weiter benutze ich einen Timerinterrupt, der die Ports setzt. 16 Bit Auflösung für die PWMs habe ich aber nicht, sondern nur 8 Bit.
Die einzelnen PWMs werden im Hauptprogramm nach zeitlicher Dauer sortiert und in ein Array geschrieben, welches der Interrupt auswertet.
Die ganze Steuerung ist zu komplex, um sie hier kurz darzustellen.