Wenn Sie eine LED mit PWM betreiben, skaliert die Helligkeit (wie ich sie sehe) nicht linear mit dem Tastverhältnis. Die Helligkeit steigt langsam an und steigt dann mit dem Arbeitszyklus exponentiell an.
Kann jemand eine Faustregel zur Verwendung als Korrekturfaktor oder eine andere Problemumgehung vorschlagen?
Antworten:
Für 16 Ebenen ist es einfach, eine einfache Nachschlagetabelle "von Hand" zu erstellen und den 4-Bit-Wert in einen 8-Bit-Wert zu konvertieren, der an den PWM-Controller übergeben wird. Dies ist die Komponente, die ich in meinem FPGA-LED-Array-Treiber verwendet habe. Für einen 8-Bit-Level-Controller benötigen Sie mindestens eine 11-12-Bit-Ausgabe aus der Nachschlagetabelle.
quelle
1
Theoretisch sollte es exponentiell sein, aber ich habe die besten Ergebnisse beim Fading mit einer quadratischen Funktion erzielt.
Ich denke auch, dass Sie es falsch verstanden haben. Bei niedrigem Arbeitszyklus ist die wahrgenommene Helligkeitszunahme viel größer als bei fast vollem Arbeitszyklus, bei dem die Helligkeitszunahme fast nicht wahrnehmbar ist.
quelle
Ich habe mich in den letzten Tagen mit diesem Thema befasst, da ich das gleiche Problem habe. Ich habe versucht, LEDs mit PWM sichtbar linear zu dimmen, aber ich möchte eine volle Auflösung von 256 Schritten. Es ist keine leichte Aufgabe, 256 Zahlen zu erraten, um manuell eine Kurve zu erstellen!
Ich bin kein erfahrener Mathematiker, aber ich weiß genug, um einige grundlegende Kurven durch Kombinieren einiger Funktionen und Formeln zu erzeugen, ohne wirklich zu wissen, wie sie funktionieren. Ich finde, dass Sie mit einer Tabelle (ich habe Excel verwendet) mit einer Reihe von Zahlen von 0 bis 255 herumspielen, ein paar Formeln in die nächste Zelle einfügen und sie grafisch darstellen können.
Ich verwende pic assembler, um das Ausblenden zu erledigen, und Sie können sogar die Tabelle dazu bringen, den Assembler-Code mit einer Formel (
="retlw 0x" & DEC2HEX(A2)
) zu generieren . Dies macht es sehr schnell und einfach, eine neue Kurve auszuprobieren.Nachdem ich ein bisschen mit den LOG- und SIN-Funktionen, dem Durchschnitt der beiden und ein paar anderen Dingen herumgespielt hatte, konnte ich nicht wirklich die richtige Kurve finden. Was passiert ist, dass der mittlere Teil der Überblendung langsamer war als die unteren und oberen Ebenen. Wenn auf ein Abblenden sofort ein Abblenden folgt, war ein scharfer, wahrnehmbarer Anstieg der Intensität zu verzeichnen. Was (meiner Meinung nach) benötigt wird, ist eine S-Kurve.
Eine schnelle Suche in Wikipedia ergab die Formel für eine S-Kurve. Ich habe dies in meine Tabelle eingefügt und einige Anpassungen vorgenommen, um es über meinen Wertebereich zu multiplizieren.
Ich habe es auf meinem Rig getestet und es hat wunderbar funktioniert.
Die von mir verwendete Excel-Formel lautete wie folgt:
Dabei ist A2 der erste Wert in Spalte A, der A3, A4, ..., A256 für jeden Wert erhöht.
Ich habe keine Ahnung, ob dies mathematisch korrekt ist oder nicht, aber es liefert die gewünschten Ergebnisse.
Hier ist der vollständige Satz von 256 Levels, die ich verwendet habe:
quelle
Ich habe diesen Typen gefunden , der eine Methode verwendet, die er "Anti-Log Drive" nennt. Hier ist der direkte Download-Link für seine Infos.
quelle
Ich benutzte einen ATtiny, um mein Deck anzuzünden. Die Helligkeit wird mit einem Poti gesteuert, der an den ADC-Pin angeschlossen ist.
Versuchte Exponentialfunktion und die darauf basierende PWM-Ausgabe scheinen eine lineare Zunahme der wahrgenommenen Helligkeit zu ergeben.
Ich habe diese Formeln benutzt:
Attiny85 @ 8MHz benötigte ungefähr 210us, um die obige Berechnung durchzuführen. Erstellen Sie eine Nachschlagetabelle, um die Leistung zu verbessern. Da die Eingabe vom 10-Bit-ADC erfolgte und der ATtiny-Speicher begrenzt ist, wollte ich auch eine kürzere Tabelle erstellen.
Anstatt eine Lookup-Tabelle mit 1024 Einträgen zu erstellen, erstellen Sie eine Reverse-Lookup-Tabelle mit 256 Einträgen (512 Byte) im Programmspeicher (PGMEM). Es wurde eine Funktion geschrieben, um eine binäre Suche in dieser Tabelle durchzuführen. Diese Methode benötigt nur 28uS für jede Suche. Wenn ich eine direkte Nachschlagetabelle verwende, würde dies 2 KB Arbeitsspeicher erfordern, die Nachschlagetabelle würde jedoch nur etwa 4 US-Dollar benötigen.
Die berechneten Werte in der Nachschlagetabelle verwenden nur den Eingangsbereich 32-991, wobei der untere / obere Bereich des ADC verworfen wird, falls ein Problem mit der Schaltung vorliegt.
Unten ist, was ich jetzt habe.
quelle
Dieses PDF erklärt die benötigte Kurve, anscheinend eine logarithmische. Wenn Sie einen linearen Dimmer (Ihren PWM-Wert) haben, sollte die Funktion logarithmisch sein.
Hier finden Sie eine Nachschlagetabelle für 32 Helligkeitsstufen für 8-Bit-PWM.
Hier für 16 Schritte.
quelle
Hier ist, was ich basierend auf dieser Antwort des Arduino-Forums getan habe . Ich habe die Werte von 0 bis 255 berechnet, damit es mit pwm auf Arduino einfach zu verwenden ist
Dann verwenden Sie auf Arduino einfach so:
Hoffe, es ist hilfreich für einige Leute;)
quelle
Ich beschäftige mich jetzt damit und gehe etwas anders vor. Ich möchte 256 Helligkeitsstufen, aber die Zuordnung eines linearen Bereichs von 0 bis 255 zu einem nicht linearen Bereich von 0 bis 255 führt zum Ergebnis, wie Sie in einigen anderen Antworten sehen können, mit vielen doppelten Einträgen. (Das heißt, mehrere Ihrer Eingabewerte führen zu derselben Helligkeitsstufe.)
Ich habe versucht, den Algorithmus so zu modifizieren, dass er einen Eingangsbereich von 0 bis 256 auf einen Ausgangsbereich von 0 bis 1023 abbildet, aber selbst dieser hatte mehrere Werte, die mit 0 übereinstimmen Um nichtlineare Werte im Bereich von 0 bis 769 (das sind 1023 bis 255) zu generieren
sin()
, addieren Sie diese Werte zum Eingangspegel, um eine Ausgabe im Bereich von 0 bis 1023 ohne Duplikate zu erhalten. Ich konfiguriere einen Timer für die Verwendung eines Zählers von 1023 und setze den Komparator für die PWM-Ausgabe auf Werte aus der Nachschlagetabelle basierend auf der gewünschten Beleuchtungsstärke (0-255).Hier ist das C-Programm, mit dem ich meine Nachschlagetabelle erstellt habe:
Und hier ist die Tabelle:
Ich werde wahrscheinlich andere Funktionen (wie
log()
) untersuchen, sobald ich diese zum Laufen gebracht habe.quelle
Für mich scheint dieses Gesetz ziemlich gut zu funktionieren: http://www.pyroelectro.com/tutorials/fading_led_pwm/theory2.html
quelle