Mikrokontroller mit PWM's für 13 Servos ?

Hallo zusammen

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

Reply to
Philip
Loading thread data ...

[...]

man die Timer schlau einsetzt und nicht in irgendwelchen Warteschleifen

kannst du immer noch einen eigenen Controller dazu abkommandieren.

Reply to
Andreas Schwarz

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
Reply to
Kurt Harders

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.
Reply to
Matthias Weingart

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.

Reply to
Oliver Adria

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

Reply to
Johannes Schöller

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)
Reply to
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

Reply to
Rainer Knaepper

(...)

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.

Thomas.

// TimerInterrupt 1 (PWM-Multiplexsignal) ////////////////////////// // // SIGNAL(SIG_OUTPUT_COMPARE1A) // signal handler for tcnt1 interrupt { unsigned int delay = 0; // switch(PWMchannel) { case 1: { outp((PWM0 >> 8),OCR1AH); // Impulszeit setzen outp((PWM0 &0xFF),OCR1AL); sbi(PORTA,0); // PWM-Kanal 0 setzen break; } case 3: { outp((PWM1 >> 8),OCR1AH); // Impulszeit setzen outp((PWM1 & 0xFF),OCR1AL); sbi(PORTA,1); // PWM-Kanal 1 setzen break; } case 5: { outp((PWM2 >> 8),OCR1AH); // Impulszeit setzen outp((PWM2 & 0xFF),OCR1AL); sbi(PORTA,2); // PWM-Kanal 2 setzen break; } case 7: { outp((PWM3 >> 8),OCR1AH); // Impulszeit setzen outp((PWM3 & 0xFF),OCR1AL); sbi(PORTA,3); // PWM-Kanal 3 setzen break; } case 9: { outp((PWM4 >> 8),OCR1AH); // Impulszeit setzen outp((PWM4 & 0xFF),OCR1AL); sbi(PORTA,4); // PWM-Kanal 4 setzen break; } case 11: { outp((PWM5 >> 8),OCR1AH); // Impulszeit setzen outp((PWM5 & 0xFF),OCR1AL); sbi(PORTA,5); // PWM-Kanal 5 setzen break; } case 13: { outp((PWM6 >> 8),OCR1AH); // Impulszeit setzen outp((PWM6 & 0xFF),OCR1AL); sbi(PORTA,6); // PWM-Kanal 6 setzen break; } // case 14: // letzter Impuls beendet: // // einige ms Pause { delay = 22050 - PWM0 - PWM1 - PWM2 - PWM3 - PWM4 - PWM5; outp((delay >> 8), OCR1AH); // Wartezeit setzen outp((delay & 0xFF),OCR1AL); outp(0, PORTA); // Impulse rcksetzen PWMchannel = 0; // Kanalabfolge da capo break; } default: // Pausenzeit: { outp(1,OCR1AH); // Pausenzeiten 500us setzen outp(244,OCR1AL); outp(0, PORTA); // Impulse rcksetzen break; } } // PWMchannel++; // n?chsten PWM-Kanal vorbereiten }

Reply to
Thomas Rehm

(...) 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.

Reply to
Thomas Rehm

"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

Reply to
Christian Müller

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.

Reply to
Thomas Rehm

"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

Reply to
Rainer Harthaus

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.
Reply to
MaWin

"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.
Reply to
Matthias Weingart

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.
Reply to
MaWin

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.

t0 +------------------------------------------+ | |

----+ +-----------------....

t1 +---+ +-------+ +------+ +--+ +-----+ +- | | | | | | | | | | |

----+ +------+ +--+ +----+ +---------+ +-----+ ...

^ ^ ^ ^ ^ # # # # #

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)
Reply to
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)
Reply to
Rainer Knaepper

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.

Reply to
Thomas Rehm

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.