Steuerung eines Servos mit einem TLC5940 (Berechnung der PWM-Einstellung)

Ich versuche, ein paar Servos und ein paar RGB-LEDs von einem Arduino-Board aus zu steuern. Dazu werde ich ein paar TLC5940-Chips verketten. Das Problem, das ich im Moment zu lösen versuche, ist, welche PWM-Einstellungen ich für die Servos benötige. Was sind insbesondere die minimalen und maximalen Rotationseinstellungen?

Mein Servo ist ein: HiTech HS-55. Diese Seite: http://www.servocity.com/html/hs-55_sub-micro.html sagt, dass das Servo auf "+Pulse Width Control 1500usec Neutral" läuft, wobei ein 600us-Puls -90 und ein 2400us-Puls +90 ist.

Um herauszufinden, wie ich mit meinem PWM-Treiber so lange Impulse erzeugen kann, muss ich die Frequenz kennen, auf der der Treiber läuft. Das Datenblatt zum Treiber: http://www.ti.com/lit/ds/symlink/tlc5940.pdf sagt zum PWM-Betrieb unten auf Seite 19:

Der Graustufen-PWM-Zyklus beginnt mit der fallenden Flanke von BLANK. Der erste GSCLK-Impuls, nachdem BLANK niedrig wird, erhöht den Graustufenzähler um eins und schaltet alle OUTn mit einem Graustufenwert ungleich Null ein. Jede folgende ansteigende Flanke von GSCLK erhöht den Graustufenzähler um eins. Der TLC5940 vergleicht den Graustufenwert jedes Ausgangs OUTn mit dem Graustufenzählerwert. Alle OUTn mit Grauwerten gleich den Zählerwerten werden abgeschaltet. Ein BLANK=H-Signal nach 4096 GSCLK-Impulsen setzt den Graustufenzähler auf Null zurück und schließt den Graustufen-PWM-Zyklus ab (siehe Fig. 21). Wenn der Zähler einen Zählwert von FFFh erreicht, hört der Zähler auf zu zählen und alle Ausgänge werden ausgeschaltet. Das Hochziehen von BLANK, bevor der Zähler FFFh erreicht, setzt den Zähler sofort auf Null zurück.

Leider habe ich keine Ahnung was das bedeutet. (Ich denke) Ich weiß, dass der PWM-Treiber eine Art Taktsignal von Arduino erhält, aber leider hilft es mir nicht, es herauszufinden.

Kann mir jemand helfen, herauszufinden, welche Einstellungen ich für den PWM-Treiber verwenden muss, um die gewünschten Impulse zu erzeugen. Der nächste Wert funktioniert. Für meine Anwendung sollte das Servo nahe genug sein, wenn es innerhalb von ein paar Grad kommt. Wird das überhaupt funktionieren? Mein Verständnis der Funktionsweise von Servos ist, dass sie im Allgemeinen alle 20 ms einen Impuls benötigen. Selbst wenn ich berechne, wie die richtige Impulsdauer erzeugt wird, bezweifle ich, dass dies auf magische Weise alle 20 ms zu einem Impuls führen wird. Akzeptiert das Servo die Eingabe?

Können Sie die Beziehung zwischen dem TLC5490 und den Servos ein wenig klären, falls es eine gibt ...
Es gibt keine Beziehung. Ich muss nur in der Lage sein, eine große Anzahl von LEDs und Servos von einem Arduino Uno-Board aus zu steuern.

Antworten (2)

Um die TLC5940-Seite der Frage zu beantworten:

Denken Sie zunächst daran, dass Ihre Intensität bei Verwendung des TLC5940 keine 12-Bit-Werte (4096 Werte) sein muss: Sie können den TLC5940 mit Intensitäten mit beliebigen Werten von 12 Bit oder weniger verwenden. Beispielsweise liefern 8-Bit-Intensitäten (256 Werte) ein sehr zufriedenstellendes Ergebnis. Zu letzterem mehr.

Unter der Annahme von 12-Bit-Intensitäten, hier ist, wie GSCLKund BLANKfunktioniert: TLC5940 hat keine eigene Uhr. So GSCLKwird verwendet, um herauszufinden, wann jede LED ein- und ausgeschaltet werden muss. Zu Beginn eines Zyklus leuchten alle LEDs. Jedes Mal, wenn eine positive Flanke GSCLKempfangen wird, wird ein interner Zähler auf dem TLC5940 inkrementiert. Jede LED, deren Intensitätswert niedriger als der Zähler ist, wird ausgeschaltet. LEDs mit Intensität werden also 1nach dem ersten Zyklus ausgeschaltet, LEDs mit Intensität 2werden nach dem zweiten Zyklus ausgeschaltet und LEDs mit Intensität 4096 werden überhaupt nicht ausgeschaltet. Am Ende des Zyklus setzt sich der Chip nicht selbst zurück, sondern erwartet eine positive Flanke, um BLANKihn zurückzusetzen, und danach beginnt der Zyklus von neuem.

Folgendes bedeutet dies für die Ansteuerung des TLC5940: Sie benötigen zwei PWM-Ausgänge; eins für GSCLKund eins für BLANK, und das eine für BLANKmuss alle 4096 Zyklen von passieren GSCLK. Beachten Sie nun, dass wir hier über die Frequenz sprechen und nicht über das Tastverhältnis, während es das Tastverhältnis ist , das analogWrite()steuert. Um den TLC5940 anzusteuern, könnten Sie eine Bibliothek verwenden , die zum Ansteuern des TLC5490 geschrieben wurde, oder Sie können das Ansteuern des TLC5940 auf niedrigerer Ebene selbst durchführen, was einen der folgenden Ansätze verwenden kann (vorausgesetzt, Sie verwenden ein ATmega-basiertes Arduino und im Maßstab). mit steigendem Schwierigkeitsgrad):

  • Programmieren Sie die beiden Timer selbst so, dass sie unterschiedliche Prescaler verwenden, sodass die BLANKLeitung mit 1/4096 der Frequenz des angesteuert wirdGSCLK
  • Programmieren Sie die CKOUTSicherung auf dem ATmega, wodurch das Taktsignal an einem seiner Ausgangspins ausgegeben wird. Verwenden Sie dies für GSCLK. Verwenden Sie dann einen Timer, um einen BLANKImpuls mit 1/4096 der Taktfrequenz zu erzeugen.
  • Takten Sie den ATmega extern und verwenden Sie dieselbe Uhr für GSCLK. BLANKLassen Sie einen ATmega-Timer den Impuls mit 1/4096 der Taktfrequenz erzeugen .

Nun zur Frage der Frequenzbeziehung zwischen der TLC5940-Taktung und der PWM. Die BLANKLeitung hat ein Tastverhältnis von 1/4096 (oder was auch immer der maximale Intensitätswert ist, den Sie verwenden), so dass es wahrscheinlich nicht für Ihre Servos funktioniert. Das GSCLKist normalerweise ein Arbeitszyklus von 50/50, muss es aber nicht sein. Nehmen wir an, Sie möchten, dass Ihre LEDs stabil erscheinen, und nehmen wir an, dass das Flackern der Schwelle 50 Hz beträgt. Dies würde bedeuten, dass Ihre Intensitäts 1-LED bei 50 Hz oder höher flackern muss, was bedeutet, dass ein 4096-Takt-langer Zyklus in 20 Millisekunden abgeschlossen sein sollte, was bedeutet, dass IhreGSCLKDer Takt sollte mindestens 204 kHz betragen. Bei 204kHz sind die Taktimpulse etwa 5uS lang. Theoretisch könnten Sie also dieselbe Uhr für Ihre Servos und den TLC5940 verwenden (ich denke, das fragen Sie): Wenn Sie die Taktfrequenz (bei 204 kHz) beibehalten und das Tastverhältnis ändern, können Sie Ihre Servos steuern und den TLC5940 takten . Wenn Sie jedoch 12-Bit-Intensitäten verwenden, wird der vom TLC5940 benötigte Graustufentakt für die Servos zu schnell sein.


Wenn 4096 Intensitätswerte jedoch zu viel sind, sollten Sie die Verwendung von 8-Bit-Intensitätswerten in Betracht ziehen. Sie müssen sie immer noch als 12-Bit-Werte senden (das erwartet die TLC5940-Schnittstelle), aber es gibt kein Gesetz, das besagt, dass Ihr BLANKPuls alle 4096 auftreten mussGSCLKUhren. Wenn es alle 256 Takte auftritt, haben Sie selbst eine 8-Bit-Intensität. Ihre 8-Bit-Intensitäten sollten also als gültige 12-Bit-Werte gesendet werden (wobei die oberen vier Bits Null sind), und Sie starten den Taktzyklus alle 256 Takte neu. Sie können auf die gleiche Weise jede andere Anzahl von Intensitätsbits verwenden, solange sie 12 oder weniger beträgt. Wenn Sie 256 Intensitäts- (=Graustufen-) Werte verwenden, beträgt Ihr minimaler Takt 12,8 kHz und die Taktdauer 78 uS. Näher am 2400uS +90 Puls, aber immer noch ziemlich weit entfernt. Wenn wir davon ausgehen, dass der +90-Impuls ein Tastverhältnis von 90/10 ist, dann berechnen wir die Taktzykluslänge mit 2,6 ms, was einem Takt von 375 Hz entspricht. Bei dieser Taktung beträgt der maximale Intensitätswert, der kein Flackern ergibt, 8 Werte (3 Bits) bei 50 Hz Nachleuchtschwelle und 16 Werte (4 Bits) bei 25 Hz.

Wow, das ist eine beeindruckende Antwort. Ich denke, hier sind alle Informationen, die ich brauche, um herauszufinden, ob ich es dazu bringen kann, das zu tun, was ich will, aber ich muss es ein paar Mal lesen, um es zu verstehen. Danke für die Hilfe!
Ich habe mir gerade die TLC-Bibliothek für Arduino angesehen und sie hat tatsächlich eine Methode zur Steuerung von Servos aus der Bibliothek. Es sieht also so aus, als ob all diese Arbeit für mich erledigt wurde (hoffentlich). Danke noch einmal.

Sie haben einen Graustufen-Takteingang (empfohlen sind 30 MHz, siehe Seite 3), und er zählt 4096 Werte durch.

Für Ihr Servo ist das viel zu schnell (die Zykluslänge beträgt ~140µs), daher müssen Sie einen langsameren Takt verwenden. Dann können Sie das Timing des Servosignals in Bezug auf Ihre Taktzyklen berechnen.