Ich baue einen Controller für RGB-LED-Streifen (12V 5m 5050 LED-RGB-Streifen mit gemeinsamer Anode). Meine aktuelle Lösung verwendet Arduino Uno mit 3x IRFZ44N-MOSFETs, um den Streifen mit Strom zu versorgen. Die Lösung ist teilweise von dieser Seite inspiriert .
Das Problem ist die PWM-Auflösung, bei der 256 Stufen nicht ausreichen, um eine gleichmäßige „wahre Farbe“ zu erzielen, insbesondere bei geringerer Helligkeit, da die Lichtwahrnehmung des Auges exponentiell ist. Es gibt eine Möglichkeit, die Pegel so anzupassen, dass die Helligkeit linear ist , Änderungen bei geringer Lichtintensität jedoch immer noch "sprunghaft" sind.
Nach dem, was ich gelesen habe, ist es möglich, Timer1 zu verwenden, um 10-Bit-PWM an zwei Pins zu erzeugen. Leider fehlt mir die Lösung für den dritten Pin.
Ich habe einige Artikel über TLC5940 gelesen, aber keine gute Lösung für den von mir benötigten hohen Strom gefunden.
Gibt es eine relativ einfache Lösung, um Arduino (oder AVR) 10-Bit- (oder besser 12-Bit-) PWM steuern zu lassen, die ich als Eingang für den MOSFET-Transistor verwenden könnte, um ihn mit 12 V und Strom> 1 A zu verwenden?
Wenn Sie flexibel sind, verwenden Sie einen Arduino Lenoardo, er hat einen hochauflösenden Timer, der 3 Pins ansteuern kann. 32U4, Seite 130, 10-Bit-Hochgeschwindigkeits-Timer/Counter4 BEARBEITEN: Es scheint, als ob analogWrite() dies nicht unterstützt
Sie können 10/12-Bit-Timer mit einem 8-Bit-Timer nachahmen, indem Sie Zyklen überspringen. Ich wüsste keine Möglichkeit, dies mit der Arduino PWM-Bibliothek (analogWrite()) zu tun, aber wenn Sie bereit sind, Timer-Interrupts zu handhaben, wird es machbar.
Wenn alles, was Sie tun, mehrkanalige PWM + -Kommunikation ist, können Sie es wahrscheinlich mit Interrupts bitbangen, während die Hauptschleife die Kommunikation übernimmt.
Richten Sie einen Timer-Interrupt ein, der bei [PWM Freq. * Auflösung] und darin eine Rampenvariable inkrementieren und mit jedem der gewünschten Kanäle vergleichen. Wenn weniger, schalten Sie es ein; andernfalls schalten Sie es aus. Vergessen Sie nicht, die Rampe auf Ihren Maximalwert zurückzusetzen, wenn Sie nicht den gesamten vom Datentyp zugelassenen Bereich verwenden.
Oder eine andere Möglichkeit, die es für viele Kanäle etwas beschleunigen könnte, besteht darin, die Hauptschleife ein Array von Portwerten gemäß dem befohlenen PWM-Wert für jeden Kanal/Pin verwalten zu lassen. Der Interrupt durchläuft dann einfach das Array, wobei er die Rampenvariable als Index verwendet.
Zum Beispiel, wie schnell der Interrupt sein muss, 50 Hz PWM * 10-Bit-Auflösung = 50 Hz * 1024 = 51200 Hz. In diesem Fall muss Ihr Timer-Interrupt mit 51,2 kHz ausgelöst werden, und der Code muss rechtzeitig für den nächsten beendet werden, abzüglich eines kleinen Betrags, in den sich die Hauptschleife hineinquetschen kann.
Meine Lösung verwendet Arduino Pro Micro und den verknüpften Code . Die Arduino-API unterstützt nur 8-Bit analogWrite
für Pro Micro. Deshalb manipuliere ich die Register direkt. Der Code steuert 3x 16bit PWM Ausgänge. Relevante Funktionen aus dem genannten Code sind setup
und applyRgb
. Der Code enthält auch eine einfache Transformation zur nichtlinearen Lichtwahrnehmung des menschlichen Auges.
PS: Ich werde README.md
es bald hinzufügen.
uint128_t
Aaron Schulz