Re: Mikrokontroller mit PWM's für 13 Servos ?

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From German to

Threaded View

Quoted text here. Click to load it

Ich glaube der MSP430F14x hat recht viele. Er hat zwar nur 2 Timer,
dafuer aber hat Timer 1 drei PWM Ausgänge und Timer2 7 PWM Ausgänge.
Nunja ergibt 10; fehlen noch 3 ;-).
Du kannst die Ausgänge von Timer1 auf je 3 verschiedene Ausgänge
schalten (sozusagen muxen, wie in nem andren Artikel hier beschrieben)
und hast dann Timer1 mit virtuell 9 Ausgängen. Somit sind das dann 16
PWM Ausgänge.

Wie verhält sich eigentlich ein Servo, wenn er mal überhaupt keinen
Impuls bekommt?, also z.B. nicht alle 10ms sondern nur alle 30ms?,
zittert der dann auch? Oder ist wirklich nur die Impulsbreite eines
Impulses wichtig und die Länge der Impulspause egal?

M.
--
Bitte auf snipped-for-privacy@pentax.boerde.de antworten.

Re: Mikrokontroller mit PWM's für 13 Servos ?
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 http://www.ZZZanimatronik.de /
(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.



Quoted text here. Click to load it
ansteuern.
C-Compiler ist mir viel zu teuer.)
Quoted text here. Click to load it
die beiden debuggen (mit vertretbarem Aufwand) ?
Quoted text here. Click to load it
Verschwendung von Rechenzeit wäre.
Quoted text here. Click to load it



Re: Mikrokontroller mit PWM's für 13 Servos ?
Hallo,
Quoted text here. Click to load it

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



Re: Mikrokontroller mit PWM's für 13 Servos ?
Quoted text here. Click to load it
(...)
Quoted text here. Click to load it

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
  }

Re: Mikrokontroller mit PWM's für 13 Servos ?
Quoted text here. Click to load it
(...)
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.

Re: Mikrokontroller mit PWM's für 13 Servos ?
Quoted text here. Click to load it

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.

Re: Mikrokontroller mit PWM's für 13 Servos ?
Quoted text here. Click to load it
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.

Re: Mikrokontroller mit PWM's für 13 Servos ?
Quoted text here. Click to load it
ansteuern.
C-Compiler ist mir viel zu teuer.)
Quoted text here. Click to load it

Hallo Philip,
schau Dir mal die MB90F340 Familie
(http://www.fme.gsdc.de/products/mb903400.htm ) 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 (www.glyn.de).

Viele Grüße
Rainer











Re: Mikrokontroller mit PWM's für 13 Servos ?
Quoted text here. Click to load it
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 /
We've slightly trimmed the long signature. Click to see the full one.
Re: Mikrokontroller mit PWM's für 13 Servos ?

Quoted text here. Click to load it

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 snipped-for-privacy@pentax.boerde.de antworten.

Re: Mikrokontroller mit PWM's für 13 Servos ?
Quoted text here. Click to load it

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.

Quoted text here. Click to load it

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

Quoted text here. Click to load it

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 /
We've slightly trimmed the long signature. Click to see the full one.

Site Timeline