3-Kanal-10+-Bit-PWM

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?

Eine andere Möglichkeit könnte der PCA9685 oder etwas Ähnliches sein. Es gibt Ihnen 16 Kanäle mit 12-Bit-PWM, Frequenz bis zu 1,5 kHz, über I2C.
Diese Threads können auch hilfreich sein. Sie können MOFSETs zusammen mit etwas wie dem TLC5940 oder TLC59711 für Hochstrom-PWM-Schalten verwenden. Forumsbeitrag und islou's Project Doc

Antworten (3)

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.

Arduino Leonardo ist im Vergleich zu Arduino Nano (bei eBay) viel teurer und auch größer. Es gibt kleinere Alternativen für ein Breakout-Board für ATmega32u4, aber alle, die ich gefunden habe, sind teurer. Könnten Sie mir bezüglich der Nachahmung bitte einen Link zu einem Artikel schicken, der dies erklärt? Danke.
Ich habe Leonardo Pro Micro gefunden und es ist nicht so teuer :-)

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.

Ich werde diese Lösung in ein paar Tagen ausprobieren und hier berichten, wie sie funktioniert (+ Bewertung). Danke.
Ich habe die Lösung ausprobiert, sie funktioniert, aber für 10 Bit kann ich nur eine PWM-Frequenz von maximal ca. 150 Hz haben, was zu niedrig für die ergonomische Beleuchtung des von mir gewünschten dunklen Raums ist.
150 zu wenig? Physiologisch sollten Sie nicht mehr als 30 sehen können, außer einem Strobe-Effekt auf sich bewegende Dinge. Was machst du eigentlich?
Abgesehen von einem anderen Chip denke ich, dass die beste Lösung, um den Strobe-Effekt zu reduzieren, darin besteht, den Bit-Banged-Timer-Interrupt so schnell wie möglich laufen zu lassen und einen Tiefpass in die Hardware einzufügen. Schauen Sie sich den Ausgangsfilter eines Class-D-Audioverstärkers an, um sich inspirieren zu lassen.
150Hz sehe ich natürlich nicht, aber es ermüdet die Augen ähnlich wie Neonlicht. Ein Tiefpassfilter würde die Linearität zerstören und der Farb-RGB-Komponentenabgleich wäre schwieriger durchzuführen, um eine Farbe zu berechnen. Oder ich bin noch nicht so erfahren.
Tiefpass sollte damit nichts zu tun haben. Stellen Sie die Reaktionsgeschwindigkeit so ein, dass sie schneller ist, als das Licht sich ändern muss, und langsamer als die PWM. Alles, was es dann tut, ist, die PWM-Frequenz und ihre Harmonischen zu entfernen und den Durchschnitt zu belassen, den Ihre Augen sowieso aufnehmen.
Es funktioniert am besten, wenn die LC-Grenzfrequenz weit von diesen beiden Einschränkungen entfernt ist, mindestens um den Faktor 2 (Oktave), aber vorzugsweise um den Faktor 10 (Dekade) oder mehr. Nur als Referenz, 2 Jahrzehnte nach unten von 150 Hz PWM würde eine ungehinderte Reaktionsrate von 1,5 Hz ergeben, was wahrscheinlich für die Beleuchtung in Ordnung ist. (Sie können es natürlich schneller befehlen, aber es könnte hinterherhinken.)
In jedem Fall können Sie das geometrische Mittel anstreben und von dort aus anpassen. Anstelle eines arithmetischen Mittels, bei dem Sie die beiden Zahlen addieren und durch 2 teilen, müssen Sie bei einem geometrischen Mittel die beiden Zahlen multiplizieren und die Quadratwurzel ziehen. Nähern Sie das dann mit den verfügbaren Komponentenwerten an: LC-Cutoff (Hz) = 1 / (2 * pi * sqrt(L*C)), wobei L und C in Henry und Farad angegeben sind. (halten Sie Ihre SI-Präfixe gerade)

Meine Lösung verwendet Arduino Pro Micro und den verknüpften Code . Die Arduino-API unterstützt nur 8-Bit analogWritefür Pro Micro. Deshalb manipuliere ich die Register direkt. Der Code steuert 3x 16bit PWM Ausgänge. Relevante Funktionen aus dem genannten Code sind setupund applyRgb. Der Code enthält auch eine einfache Transformation zur nichtlinearen Lichtwahrnehmung des menschlichen Auges.

PS: Ich werde README.mdes bald hinzufügen.