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" ?
-?
Philip
Didn't find your answer? Ask the community — no account required.
A
Andreas Schwarz
[...]
man die Timer schlau einsetzt und nicht in irgendwelchen Warteschleifen
kannst du immer noch einen eigenen Controller dazu abkommandieren.
K
Kurt Harders
Hallo Philip,
Philip schrieb:
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 :-).
Gruss, Kurt
Kurt Harders
http://www.pin-gmbh.com
M
Matthias Weingart
Philip wrote in news:brgcil$geu$ snipped-for-privacy@newshispeed.ch:
Ich glaube der MSP430F14x hat recht viele. Er hat zwar nur 2 Timer,
Nunja ergibt 10; fehlen noch 3 ;-).
schalten (sozusagen muxen, wie in nem andren Artikel hier beschrieben)
Impuls bekommt?, also z.B. nicht alle 10ms sondern nur alle 30ms?, zittert der dann auch? Oder ist wirklich nur die Impulsbreite eines
M.
Bitte auf mwnews2@pentax.boerde.de antworten.
O
Oliver Adria
Hi Philip,
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ß,
Oliver Adria
PS : All die YYYs und ZZZs weg'cut'ten.
ansteuern.
C-Compiler ist mir viel zu teuer.)
die beiden debuggen (mit vertretbarem Aufwand) ?
Verschwendung von Rechenzeit wäre.
J
Johannes Schöller
Hallo,
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)
MfG, Johannes
R
Rainer Knaepper
Moin Philip,
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)
R
Rainer Knaepper
Moin Kurt,
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.
Rainer
T
Thomas Rehm
(...)
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.
Thomas.
C
Christian Müller
"Rainer Knaepper" schrieb im Newsbeitrag news: snipped-for-privacy@smial.prima.de...
Dann bekommst Du aber nur beim ersten Servo immer genau die 20ms Zykluszeit hin, fragt sich, ob das bei den anderen stört...
Oder Du tickerst den ersten Timer mit 50Hz * (Anzahl Servos)
Gruss Chregu
T
Thomas Rehm
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.
Thomas.
R
Rainer Harthaus
"Philip" schrieb im Newsbeitrag news:brgcil$geu$ snipped-for-privacy@newshispeed.ch...
ansteuern.
C-Compiler ist mir viel zu teuer.)
Hallo Philip, schau Dir mal die MB90F340 Familie
formatting link
von Fujitsu an, das Teil hat
16 Stück 8Bit PWMs, und der C-Compiler ist gratis. Der Chip kostet um die 11 EUR, z.B. bei Glyn
formatting link
Viele Grüße Rainer
M
MaWin
Philip schrieb im Beitrag ...
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.
M
Matthias Weingart
"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.
M.
Bitte auf mwnews2@pentax.boerde.de antworten.
M
MaWin
Matthias Weingart schrieb im Beitrag ...
Noe.
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.
R
Rainer Knaepper
Moin moin,
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.
bei den ^ einschaltzeit programmieren, bei den # die Pasuenzeit.
evtl. geht das auch mit Capture&Compare, aber da kenne ich mich nicht so aus
Rainer
Viele die leben, verdienen den Tod. Und manche, die sterben,
verdienen das Leben. Kannst Du es ihnen geben? (JRRT)
R
Rainer Knaepper
Moin moin,
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)
T
Thomas Rehm
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.
Thomas.
Join the Discussion
Have something to add? Share your thoughts — no account required.
Didn't find your answer?
Ask the community — no account required
Report Content
You are reporting this content to the moderators. They will look at it
ASAP.