Jedoch hat kaum ein Mikrokontroller so viele PWM's eingebaut. (Der Microchip PIC18F8621 zwar schon, aber der Programmer und der C-Compiler ist mir viel zu teuer.)
So suche ich Alternativen:
-Die Pulsweite jeweils in kleineren uC's "zwischenspeichern" ?
Das halte ich fuer eine brauchbare Idee. 16F627 z.B.
Und eher nicht funktioniert. Du musst fuer ein Servo den Impuls auf ca.
3us genau einhalten, sonst fangen die an zu brummen oder gar zu zittern. Dein Roboter leidet dann unter dem grossen Tatterich :-). Eine Moeglichkeit zum uC-sparen gibt es noch, einen Multiplexer. Da ja die Servos nur alle 20ms einen neuen Impuls brauchen, und manche es auch nicht viel haeufiger moegen, kann man bis zu 10 Impulse erzeugen und zum jeweiligen Servo Multiplexen. Ein 16F627 koennte das bequem erledigen. Und die serielle Schnittstelle ist dann auch noch frei. Den Code zur Pulserzeugung kann ich Dir aus meinen Fluesterantrieben zur Verfuegung stellen :-).
ein Freund von mir arbeitet in einem Unternehmen, das Servocontroller herstellt. Vielleicht ist das, was du brauchst. Mit einem Servo controller ist es sehr easy die Servos zu steuern und es ist kleiner als ein uC. Entweder snipped-for-privacy@ZZZanimatronik.de oder direkt an meinen Freund snipped-for-privacy@ZZZanimatronik.de Die web site Adresse ist
formatting link
(Produkt -> Servocontroller S10, kann bis zu 12 Servos steuern, Steuerung per RS232) Ich selbst benutze eins, und benutze ihn für meinen Roboter. Anscheinend soll die Synchronisation der Servosteuerungen sogar besser funktionieren als mit einem uC. Gruß,
Bei den Billigservos (nicht Digitalservos) wird nur in der High-Zeit des Impulses der Motor geregelt. Wenn kein Impuls anliegt kann man das Servo ohne Kraftaufwand aus der aktuellen Position wegdrücken, sendet man die Pulse öfters als 20ms wird das Servo stärker, allerdings beginnt dann die Regelung zu schwingen. Also Pausen von 20ms +- 2ms sind sicher im grünen Bereich, was genau eingehalten muss ist die High-Zeit, weil sonst das Servo ständig regelt und dann laut wird (wurde aber eh schon erwähnt)
In's Unreine gedacht: Die Servos wollen idR mit 50 Hz angesteuert werden, macht 20 ms. Da passen sechs bis sieben Servos rein, wenn man von maximal knapp 3 ms Pulsweite ausgeht. Normalerweise arbeiten die Servos im Bereich von 0.8ms bis 2.4 ms, Mitte bei 1.6 ms. Hab aber auch schon welche gehabt, die sich nicht exakt daran hielten.
Dafür reichen dann genau zwei timer. Einer tickert konstant mit 50 Hz. Der andere wird zyklisch umprogrammiert und auf die jeweiligen Ausgangsports gelegt. Das ganze sollte im interrupt laufen, damit noch Rechenzeit übrigbleibt. Möglicherweise gibt es bei dieser Lösung ein Problem mit Jitter, das wäre auszuprobieren.
Für 13 Servos sollten also vier unabhängige Timer reichen, wobei 16- bittige zu empfehlen sind, da die Servos bei 8 Bit Auflösung doch schon recht grob gerastert positionieren.
Rainer
--
Man kann andauernd wundern
(Stephan Kendzia in de.comp.hardware.drucker)
ack. Man sollte deshalb 16-Bit-Timer nehmen, auch wenn das auf den ersten Blick wie overkill aussieht. Bei der Einhaltung des 50Hz- Rasters sind die aber imho nicht so empfindlich.
Ich habe eine ähnliche Aufgabenstellung mal so gelöst:
Im Reload-Timerinterrupt des 16-bit-Timers setze ich einen Portpin, und lege im Reload-Register des Timers die Zeit ab, wie lange der Puls am Portpin dauern soll. Beim nächsten Eintritt in den Timerinterrupt setze ich den Portpin wieder auf low und setze den nächsten Portpin auf high...
Auf diese Weise werden die PWM-Signale zwar nacheinander erzeugt, aber es gibt ja auch keinen Grund, die gleichzeitig erzeugen zu müssen Bei 13 Servos wird man dann im ungünstigsten Falle ca. 25ms Pausenzeit bekommen, was noch keine Nachteile bringt.
In meinem folgenden (getesteten) Code-Beispiel für 7 Servos habe ich zwischen den PWM-Signalen immer noch eine kurze Pause gelassen - die ist allerdings hier unnötig (wurde für die Erzeugung eines Multiplex- PWM-Signals benötigt, welches ich aus dem Beispiel aber schon heraus genommen habe). Um einen jitterarmen PWM zu erhalten, dürfen weitere Interrupt- Routinen nicht zu viel Rechenzeit schlucken (ggf. in den anderen Interrupt-Routinen frühzeitig mit "sei()" Interrupts freigeben). Ein leichter Jitter ist aber unproblematisch, da Modellbau-Servos sowieso eine ziemlich große Totzeit (respektive Tot-Winkel) haben, in der sie nicht reagieren.
(...) Mein Beispiel bezog sich übrigens auf den AVR-Controller AT90S8515, Compiler ist der AVR-GCC. Beim PIC dürfte es aber vom Prinzip her sehr ähnlich aussehen.
Das kann ich nicht nachvollziehen. Die Servos haben i.A. einen recht großen Totzeitbereich (um die 20us, wenn ich mich richtig erinnere, was umgerechnet ca. 1 bis 2 Winkelgraden entspricht).
3us würde zudem eine Auflösung von ca. 400 Stufen bedeuten bzw. eine Winkelauflösung von 1/4 Grad - und die Servos, die mir untergekommen sind, sind weit davon entfernt, so fein aufzulösen. Oder welche Servos verwendest Du? Ich suche nämlich ein (günstiges) Servo mit sehr geringer - oder sogar ganz ohne - Totzeit.
Annahme: Wir haben genug (13) normale I/O-Pins . Servos kommen da dran. Im Programm steht ein ARRAY a mit (13) Sollpositionen (0..255) und ein i. i=0, Port(i)=1, Timer-Interrupt in 2*(a[i]+255) usec bestellen, mit normalem Programm weitermachen
Timer-Interrupt: Port(i)=0, i=(i+1)%13, Port(i)=1, Timer-Interrupt in 2*(a[i]+255) usec bestellen, mit normalem Programm weitermachen
Eventuell nicht gleich nach 12 kommt 0, sondern erst 25msec abwarten.
Braucht 0 (Zero, Null, keinen) PWM.
--
Manfred Winterhoff, reply-to invalid, use mawin at despammed.com
homepage: http://www.geocities.com/mwinterhoff/
de.sci.electronics FAQ: http://dse-faq.elektronik-kompendium.de/
Read 'Art of Electronics' Horowitz/Hill before you ask.
Lese 'Hohe Schule der Elektronik 1+2' bevor du fragst.
"MaWin" wrote in news:01c3c272$ac996460$0100007f@amdk6-300:
Sofern der Jitter durch die Interruptantwortzeiten nicht stört. Da kommen schon einige µs zusammen (unterschiedliche Interruptresponsezeiten, je nachdem was der uC gerade so macht) . Und den Interrupt darf man im Hauptprogramm auch nicht sperren, ansonsten wirds noch wackliger. Alles in allem nur eine Lösung, wenn der uC so gut wie nichts anderes machen soll.
Die laufende Instruktion wird abgebrochen. Sie kann 1 oder 2 Takte dauern. Also reden wir von einem Jitter von 0.025 Prozent. So was ist Irrelevant. Da ist die Flanke des TTL-Servosteuersignals mit groesserem Jitter behaftet.
Das allerdings nicht (wenn es laenger dauert), und wenn man es tun muss, wartet man auf den Uebergang von Servo 12 auf Servo 0. Aber gegen falsche Programmierung ist kein Kraut gewachsen (siehe die weitgehend fehlerhaften Programme von Microsoft).
Dann hast du ihn grob falsch programmiert. Davon ausgehend, das der Servo-Interrupt keine 10 usec Bearbeitungszeit hat und weniger als jede Millisekunde kommt, ist der Prozessor nicht mal zu 1 % belastet. Da ist unendlich viel Zeit fuer 'richtige Arbeit' uebrig.
--
Manfred Winterhoff, reply-to invalid, use mawin at despammed.com
homepage: http://www.geocities.com/mwinterhoff/
de.sci.electronics FAQ: http://dse-faq.elektronik-kompendium.de/
Read 'Art of Electronics' Horowitz/Hill before you ask.
Lese 'Hohe Schule der Elektronik 1+2' bevor du fragst.
snipped-for-privacy@tiscalinet.ch (Christian Müller) meinte am 14.12.03
das ist das, was ich mit Jitter meinte. Aber auch das ließe sich mit demselben Timer umgehen, indem man halt die Pausen ebenfalls darüber laufen läßt, so daß die folgenden Impulse ebenfalls fein im 20ms- Abstand +/- ein paar µs kommen.
snipped-for-privacy@kurt-harders.de (Kurt Harders) meinte am 14.12.03
Naja, die 20ms sind ja eigentlich relativ leicht einzuhalten, Frage ist, wie die Dinger reagieren, wenn die Zykluszeit je nach Servostellungen nicht konstant bleibt.
Rainer
--
"Well, that is my great contribution to fantasy:
dwarves don't float."
(Joel Rosenberg in de.alt.fan.tolkien)
Ich hatte bei den Servos, die ich testete, den Eindruck, dass genau wegen dieser mechanischen Hysterese auch eine elektrische Hysterese eingebaut war, die verhindern sollten, dass der Motor bei so kleinen Impulsdauer-Änderungen anläuft. Aber ich kann mich natürlich auch getäuscht haben. Zumindest hat sich nur dann etwas getan, wenn der Impuls sich um mindestens 20us änderte - bei einer PWM-Auflösung von 8us und langsamer Änderung der Pulsdauer hat das Servo dann ziemlich geruckelt. Kannst Du denn ein günstiges Servo empfehlen, welches mechanisch hochauflösend und mit geringer mechanischer Hysterese behaftet ist? Die Stellkräfte wären eher gering.
ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here.
All logos and trade names are the property of their respective owners.