Hallo! Ich möchte eine LED gern Faden. Jetzt gibt es einen wunderbaren Artikel dazu, der wirklich gut ist. Auch die zur Verfügung gestellte Excel-Tabelle, mit der ich mir die logarithmischen Werte meiner PWM ausrechnen lassen kann ist klasse und habe ich genutzt, vielen Dank an der Stelle dafür. Nun zu meinem kleinen Problem. Ich möchte, dass die LED etwa mit der halben Leuchtkraft beginnt, bis zur vollen Leuchtkraft fadet und direkt anschließend wieder zur halben Leuchtkraft zurück fadet. Im Prinzip habe ich das ohne größere Probleme hinbekommen, aber es sieht nicht wirklich flüssig aus. Die LED wird heller und es gibt einen deutlichen Knick, wenn die LED wieder dunkler wird. Aber das ist auch klar, meine logarithimschen PWM-Werte sind auf einer Geraden und haben einen klaren Knick, wenn die volle Leuchtkraft erreicht ist. Ich bräuchte also im logarithmischen Diagramm eher eine Kurve statt einer Geraden, die bei halber Leuchtkraft beginnt, in der Mitte bei voller Leuchtkraft ist und dann wieder schön in einer Kurve bis zur halben Leuchtkraft absinkt. Meine 10. Klasse Mathekenntnisse sind damit aber überfordert, wie ich das ausrechnen kann. Könnt ihr mir etwas auf die Sprünge helfen? Ich nutze eine 16bit PWM und habe bis jetzt immer mit 256 Stufen gearbeitet. Danke für eure Hilfe Dennis
Hallo, mit dem üblichen exponentiellen PWM-Verlauf ist das nicht zu machen, weil die Exponentialfunktion konvex ist, d.h. eine „Linkskurve“ beschreibt (die zweite Ableitung ist positiv). Wenn die LED aber erst heller und dann wieder dunkler werden soll, muss sich ja „in der Mitte“ der PWM-Kurve ein Maximum befinden, wo der Anstieg gleich null und die zweite Ableitung negativ ist. Die einfachste „glatte“ Funktion mit einem Maximum an der Stelle 255/2 und den gewünschten Fixpunkten wäre die Parabel
Du kannst gerne die Tabelle teilen, dann kann man das mit z.B. einem Sinus multiplizieren. Für Auf- und Abblenden mit Start bei 1/2 sollte aber eine einfache lineare Funktion genau liefern, was Du möchtest: am Anfang sehr große Helligkeitszuwächse, die langsam kleiner werden. Und am hellsten Punkt wird es langsam, dann schneller dunkler. Also für x=0..255 Steps: y=32768+ 258*(x<128?x:256-x)
:
Bearbeitet durch User
Puh, ganz schön kompliziert. Ich habe mal die Excel aus dem Artikel hier angehangen, mit meinen jetzigen Werten. Ich nutze die Werte aus der Spalte PWM1. Im mittleren Diagramm sieht man gut die Gerade, die die Werte im logarithmischen Diagramm darstellt. Denis
> Puh, ganz schön kompliziert.
Willst du fauler Bursche eine einfache Loesung? :-)
Kauf dir einen LP5810 von TI. Der kann das voll super! Und sogar
auf Wunsch selbstaendig, einfach einen Schwung Register
programmieren und der macht alles fuer dir. Ich vermute mal
das diese Teile sonst in RGB-Tastaturen oder auf Mainboard drauf sind.
Aeh..Haken ist aber das du einen grossen Schwung Register programmieren
musst, aber irgendwas ist ja immer. :-D
Vanye
Dennis H. schrieb: > Die LED wird heller und es gibt einen deutlichen Knick, > wenn die LED wieder dunkler wird. Dann bleib einfach etwas länger auf dem Endwert. Bei 16 Bit PWM sollte der Logarithmus fein genug sein. Stufen sieht man nur bei den geringen Helligkeiten (Rundungsfehler).
Statt einer geraden Rampe (Dreieck) eine Sinusform verwenden. Da deine PWM keine unendliche Auflösung haben wird, reicht hier eine bessere Handvoll vorberechneter Werte für eine Viertelwelle aus, das muss man also nicht im Code selbst berechnen.
Peter D. schrieb: > Dann bleib einfach etwas länger auf dem Endwert. Aber mindestens 10 Zeiteinheiten auf dem Endwert ruhen, damit sich das Auge daran gewöhnt und somit der ruckelige Umkehrpunkt vom Auge nicht mehr wahrgenommen wird.
Dennis H. schrieb: > Ich möchte, dass die LED etwa mit der halben Leuchtkraft beginnt, bis > zur vollen Leuchtkraft fadet und direkt anschließend wieder zur halben > Leuchtkraft zurück fadet. Das ist eine Sinuswelle zwischen den Helligkeiten.
Multipliziere den Sinus mit dem Logarithmus um den PWM Registerwert zu erhalten.
Bruno V. schrieb: > Für Auf- und Abblenden mit Start bei 1/2 sollte aber eine einfache > lineare Funktion genau liefern, was Du möchtest ... Linear ist der falsche Weg, weil die Helligkeitsempfindung (ziemlich) logarithmisch ist. https://de.wikipedia.org/wiki/Weber-Fechner-Gesetz Beim gleichmäßigen Faden muss der Quotient aus Änderung und aktuellem Wert konstant sein. Langsamer Start und Ende des Fade-Vorgangs, z.B. Anschmiegen mit sin()-ähnlichem Verlauf kommt dann noch dazu. Dann gibt es am Umkehrpunkt auch kein Ruckartig mehr.
:
Bearbeitet durch User
Rainer W. schrieb: > Linear ist der falsche Weg, weil die Helligkeitsempfindung (ziemlich) > logarithmisch ist. > https://de.wikipedia.org/wiki/Weber-Fechner-Gesetz Genau deshalb funktioniert linear genau hier sehr gut: Start bei halber Helligkeit und längere Verweildauer im Maximum (wegen späterem runterfaden). Wenn Du das Produkt aus Sinus und Logharithmus mit der Gerade vergleichst, ist das in Anbetracht der Einfachheit schon recht ideal.
Dennis H. schrieb: > Meine 10. Klasse Mathekenntnisse sind damit aber überfordert, wie ich > das ausrechnen kann. Das muss nicht mathematisch sein, sondern subjektiv schön. Du schreibst doch selbst: > LED Fading in schön
Georg M. schrieb: > Das muss nicht mathematisch sein, sondern subjektiv schön. Falls man nicht endlos rumprobieren will, ist es aber einfacher, die Zahlen mit eine mathematischen Beschreibung zu erzeugen, z.B. als
1 | y = 0.75-cos(w)/4 mit w=0 .. +360° |
Bei einer Helligkeitsvariation über lediglich einen Faktor 2 kann man sich den Logarithmus auch schenken, wenn es nur hübsch aussehen soll.
:
Bearbeitet durch User
Viele Antworten hier sind ein bisschen ungeschickt, weil sie dir nicht helfen, das Problem zu verstehen, sondern deine Frage direkt beantworten wollen. Ich versuche es mal ganz kurz. Du baust dir eine Tabelle, die dazu dient, einen Helligkeitswert in einen Wert für die LED-Ansteuerung umzurechnen. Aus verschiedenen Gründen ist die Helligkeitswahrnehmung der LED nicht linear, sondern eher logarithmisch, daher brauchst du diese Tabelle. Wenn das ordentlich gemacht ist, hast du dann von einem Helligkeitswert zum nächsten immer gleiche (wahrgenommene) Helligkeitsunterschiede. So weit, so gut. Nun willst du das aber animieren, d.h. du brauchst noch zusätzlich eine Funktion, die den Helligkeitsverlauf über die Zeit ausdrückt. Die Funktion gibt dir dann Helligkeitswerte von 0 bis 256 aus, die du in deine Tabelle steckst, um den Ansteuerungswert für die LED-PWM zu erhalten. An der Tabelle muss sich nichts ändern, die ist gut so. Deine aktuelle Helligkeitsverlaufsfunktion ist ein Dreieck, es geht konstant nach oben und dann wieder konstant nach unten. Du brauchst jetzt eine Helligkeitsverlaufsfunktion, die diese Umkehrpunkte abflacht. Da dein Helligkeitsverlauf symmetrisch sein soll, d.h. die LED genauso schnell hell wird wie sie nachher dunkel wird, können wir das ausnutzen. Zur Animation brauchst du einen Zähler, der der Helligkeitsverlaufsfunktion übergeben wird. Das kann ruhig auch eine 16-Bit-Zahl sein, letztendlich ist es aber unerheblich. Mit diesem Wert berechnet die Helligkeitsverlaufsfunktion die Helligkeit zum jeweiligen Zeitpunkt. Den Zähler lässt du fürs heller Dimmen nach oben laufen, fürs dunkler Dimmen nach unten. Was sich da als Helligkeitsverlaufsfunktion anbietet? Viel, zum Beispiel: 1) Abschnittsweise definierte lineare Funktionen. Die Steigung in der Nähe der Umkehrpunkte kann z.B. deutlich geringer ausfallen. Abschnittsweise definiert wird die Funktion, indem du in Fallunterscheidungen schaust, wo sich dein Zähler befindet und dementsprechend die Steigung anpasst. 2) Der Extremfall der abschnittsweise definierten Funktion ist eine Tabelle, die für jeden Eingabewert einen Ausgabewert bereitstellt :) 3) Die bereits erwähnte Sinusfunktion 4) Denkbar wäre auch eine kubische Funktion 4) etc.
Hab sowas in ASM für eine RGB programmiert eigentlich ist das nur eine Schleife in der Schleife... nix dickes...
Mein lieber Scholli, hier hab ich ja was losgetreten. Peter D. schrieb: > Dann bleib einfach etwas länger auf dem Endwert. Das hab ich schon probiert, auch mit der Zeit gespielt, so wirklich glücklich macht das nicht. Harald K. schrieb: > Statt einer geraden Rampe (Dreieck) eine Sinusform verwenden. Genau das suche ich > Da deine PWM keine unendliche Auflösung haben wird, reicht hier eine > bessere Handvoll vorberechneter Werte für eine Viertelwelle aus, das > muss man also nicht im Code selbst berechnen. Um nichts anderes geht es mir. Ich habe jetzt auch einfach ein Array mit 256 16-bit Werten, die ich nacheinander in ein OCRxA lade. Vielen Dank für die anderen Antworten. Ich habe es mir doch etwas einfacher gemacht. Die ersten 242 Stufen habe ich in Excel logarithmisch berechnet, die letzten 13 Werten mache ich linear. Evtl. spiele ich noch mit der Anzahl der linearen Werte. Das sieht auf jeden Fall besser aus, als vorher mit rein logarithmischen Werten. Auf jeden Fall vielen Dank für die vielen wirklich hilfreichen Antworten, das hat mich weiter gebracht. Denis
Dennis H. schrieb: > Meine 10. Klasse Mathekenntnisse sind damit aber überfordert, wie ich > das ausrechnen kann. Könnt ihr mir etwas auf die Sprünge helfen? Die braucht man auch gar nicht wirklich, auch komplizierte Berechnungen sind eigentlich nicht nötig, denn das schafft auch ein Kind der 4. Klasse oder Chewbacca mit einem Taschenrechner oder Millimeterpapier mit Bleistift, wie Du Dir das selbst mit den Array-Spielereien bewiesen hast. Das „Schöne Fading” wird aber jeder sowieso für sich selbst herausfinden oder ausformen müssen, denn die Definiton des Begriffs „Schön” ist selbstverständlich extrem subjektiv und kann obendrein noch eine große Tolaranzschwelle haben, insofern sind exakte, komplexe Berechnung in so einem Fall sowieso quasi sinnlos; auch die Lichtquelle selbst kann sehr unterschiedlich im Teillastbereich emittieren und/oder wahrgenommen werden bzw. würde die ganze unnötige „schöne Rechnerei” signifikant beeinflussen oder konterkarieren und ad absurdum führen. Man muss die Treppe nicht kopfüber auf den Händen besteigen, wenn das einfach mit den Füßen gemacht werden kann. Was noch schlimmer wäre, was oft nicht nur von Arduinojüngern codemäßig betrieben wird, es nicht in ein fertiges Array zu packen, um daraus die Werte immer wieder einfach abzulesen, sondern jeden Wert oder seine Approximation mit mehreren Stufen im Programm jedesmal neuzuberechnen – wäre vielleicht noch nachvollziehbar, wenn man bei einem bestimmten µC eine Knappheit mit dem SRAM oder er gar keinen – dafür aber viel Zeit im Gepäck – hätte.
Gregor J. schrieb: > auch die Lichtquelle selbst kann sehr unterschiedlich im Teillastbereich > emittieren ... Dazu gibt es im Datenblatt eine Kurve. > ... es nicht in ein fertiges Array zu packen, um daraus die Werte immer > wieder einfach abzulesen ... Und auch dabei lohnt es u.U., die Symmetrien der Kurve auszunutzen und keinen vollen Zyklus in Array-Form abzulegen.
Rainer W. schrieb: > Dazu gibt es im Datenblatt eine Kurve. Deine Kurven sind bei subjektiver Wahrnehmung quasi bedeutungslos – sie könnten höchstens nur der Orientierung dienen. ___ > Und auch dabei lohnt es u.U., die Symmetrien der Kurve auszunutzen und > keinen vollen Zyklus in Array-Form abzulegen. Verläufe – auch Kurvenformen – kann man mit Geraden entsprechender Steigung nach- oder abbilden, als Annäherung wohlgemerkt, hier wäre sogar eine sehr grobe Unterteilung problemlos möglich, wodurch das Array deutlich kleiner gestaltet werden könnte. Die einzige große Begrenzung bezüglich der Steigungen wären vielleicht Integerberechnungen – mit ein paar Tricks könnte man auch das notfalls umgehen. Ob man solche rechnerischen und programmiertechnischen Spielereien auf Interruptebene wegen einer LED wirklich braucht, hängt primär vom vorhandenen Speicherplatz ab – Tabellen oder generell Daten aller Art kann man auch im Flash ablegen bzw. einfach vom Compiler includieren lassen, wenn sie nicht zur Laufzeit erstellt/generiert werden. Bei modernen, neuzeitlichen µControllern lohnt sich der ganze Aufwand vermutlich nicht, um z.B. eine 3/4-Einsparung des Arrays zu erreichen, als reine Übung könnte es aber schon Sinn machen, nicht nur für Arduinojünger.
:
Bearbeitet durch User
> Die einfachste „glatte“ Funktion mit einem Maximum an der Stelle 255/2 > und den gewünschten Fixpunkten wäre die > Parabely=(216−1)⋅(1−12(x−2552)2⋅(2255)2) > y=(2^{16}-1) \cdot \left(1-\frac{1}{2}\left(x-\frac{255}{2}\right)^2 > \cdot \left(\frac{2}{255}\right)^2\right) wie bekommt man das hier so rein, interessant!
Gregor J. schrieb: > Deine Kurven sind bei subjektiver Wahrnehmung quasi bedeutungslos – sie > könnten höchstens nur der Orientierung dienen. Die Kurven geben wieder, wie sich die LICHTQUELLE im Teillastbereich verhält. Nicht mehr und nicht weniger. Der Rest wird durch das Weber-Fechner-Gesetz beschrieben und unterliegt, wie alle psychophysischen Beziehung, persönlichen Variationen. Du kannst aber nicht für jeden Betrachter, abhängig von seinem aktuellen Zustand, persönliche Abhängigkeitskurven in der Software hinterlegen. Gregor J. schrieb: > ... z.B. eine 3/4-Einsparung des Arrays zu erreichen Wie kommst du auf eine 3/4-Einsparung? Die würde für einen Sinus gelten, aber nicht für eine Funktion exp(sin()), die wegen der nichtlinearen Wahrnehmung auftaucht.
:
Bearbeitet durch User
Gregor J. schrieb: > Das „Schöne Fading” wird aber jeder sowieso für sich selbst > herausfinden oder ausformen müssen Einen großen Einfluß hat auch die gewünschte Geschwindigkeit, wie gut das Auge die einzelnen Stufen nachregelt oder nicht. In der Regel will man auch kein ständiges auf und ab, es sei denn als Folter. Oft soll nur einmalig auf oder abgedimmt werden und da wird logarithmisch als angenehm empfunden. Die alten Glühbirnen machten das quasi von sich aus.
Rainer W. schrieb: > Die Kurven geben wieder, wie sich die LICHTQUELLE im Teillastbereich > verhält. Nicht mehr und nicht weniger. Und betrachtet werden sie von einem Betrachter, der alles subjektiv wahrnimmt, d.h. am Ende wird es eh auf eine vollständige experimentelle Bestimmung des Verlaufs im Array hinauslaufen. ___ > Wie kommst du auf eine 3/4-Einsparung? > Die würde für einen Sinus gelten, aber nicht für eine Funktion > exp(sin()), die wegen der nichtlinearen Wahrnehmung auftaucht. Habe ich doch bereits gesagt – mit Geraden. Man könnte auch über 90% eines 256-Byte-Arrays einsparen, wenn man z.B. den ganzen Verlauf aus 10 Geraden machen würde, also fünf für den Anstieg und fünf den Abfall der Helligkeit nehmen würde. Um eine Gerade zu beschreiben, braucht man nur zwei Punkte oder wenn der Anfangspunkt bereits bekannt ist, was ja hier der Fall wäre, dann nur die Steigung und den Endpunkt, der erreicht bzw. überschritten wird – bei einem konstanten Zeitverlauf und 8-Bit als PWM-Wert bräuchte man für eine Gerade bestenfalls 2 Bytes, bei 10 Geraden – also dann für den ganzen Verlauf – gerade mal 20 Bytes. Bei 16-Bit-PWM könnte man im gleichen Beispiel durchaus mit 30 Bytes auskommen. Wenn man es noch spiegeln könnte und würde, was Du anfangs erwähnt hast, würde man nur noch mit der Hälfte der Daten auskommen. __ Peter D. schrieb: > Einen großen Einfluß hat auch die gewünschte Geschwindigkeit, wie gut > das Auge die einzelnen Stufen nachregelt oder nicht. > In der Regel will man auch kein ständiges auf und ab, es sei denn als > Folter. Oft soll nur einmalig auf oder abgedimmt werden und da wird > logarithmisch als angenehm empfunden. Die alten Glühbirnen machten das > quasi von sich aus. Das kann man alles mit Geraden problemlos simulieren – je mehr man davon nimmt, desto genauer die Nachahmung eines beliebigen Kurvenverlaufs. Kleine Unebenheiten merkt das Auge bzw. das Gehirn nicht, also setzt man dort an, wo die Nicht-Unterscheidung des Auges bereits eingesetzt hat. Wären die Helligkeitssprünge irgendwie doch zu hoch, weil sichtbar, könnte man das Array bzw. mit den Daten in die Zeitachse gehen/wechseln, also quasi die Dauer der Zeitschritte mit Geraden beschreiben bzw. variabel machen und die PWM-Werte konstant ansteigen und wieder abfallen lassen – aber ich glaube nicht, dass das hier wirklich nötig wäre.
:
Bearbeitet durch User
Übrigens, die Kurve muss nicht unbedingt symmetrisch sein. Vor vielen Jahren habe ich bei der Gartenillumination das Erlöschen doppelt so lang gemacht. Geschmacksache.
Georg M. schrieb: > Übrigens, die Kurve muss nicht unbedingt symmetrisch sein. Vor vielen > Jahren habe ich bei der Gartenillumination das Erlöschen doppelt so lang > gemacht. Ja, davon gehe ich auch aus – mit dem vorgeschlagenen Spiegeln geht viel Freiheit in der Gestaltung des gewünschten, angenehmen Effekts vorloren, was auch immer das heißen mag.
Dennis H. schrieb: > Evtl. spiele ich noch mit der Anzahl der linearen Werte. Wenn Du mit halber Helligkeit anfängst (wie Du schreibst), dann sollte Bruno V. schrieb: > eine einfache lineare Funktion genau liefern, was Du möchtest weil die beiden Funktionen (Sinus und Logharithmus) in erster Näherung für die erste Hälfte eine Grade ergeben. Probiere es einfach aus. Wenn Du nicht mit halber Helligkeit (also 50% PWM) startest, dann schreibe doch bitte, mit welcher PWM Du anfängst. Wenn es kontinuierlich sein soll (also sich dauerhaft wiederholend), dann ist linear nicht optimal, aber ich hatte Dich so verstanden, dass es nur "einen Zyklus = dunkel->hell->dunkel" gibt.
:
Bearbeitet durch User
Im Prinzip Bau ich gerade ein Spielzeug für Erwachsene, für einen Freund, der sich regelmäßig mit seiner Softair Waffe mit Freunden trifft. Ich baue ihm eine Fake Bom.be. ich habe zwei ca. 20cm hohe Batterie Symbole negativ auf Plexiglas gedruckt, welche ich mit jeweils 42 Led hinterleuchte. Die meisten Led sind Batteriebalken, und 18 Led hinterleuchten den Rahmen, also die Form der Batterie. Dem Rahmen möchte ich gern diese dunkel hell dunkel Sequenz verpassen, damit man erkennen kann, ob dieser Timer, der da abläuft und einen nach dem anderen Balken erlöschen lässt, aktiv ist, oder nicht. Also die Sequenz ist aktuell ca. 1,3 Sekunden lang und bleibt dann weitere 0,7 Sekunden auf halber Leuchtstärke, bis die Sequenz wieder von vorn beginnt. Denis
F. schrieb: > 4) etc. Und wenn jetzt noch verschiedene Farben dabei sind ... Aber du hast das Problem sehr gut beschrieben und da wird der TO sich besser rein denken können.
Hallo, in deiner linearen Zahlenfolge (mit der die log. Werte berechnet werden), brauchst du nur Zwischenwerte einfügen. Bis dir die lineare Kurve in Excel gefällt. Damit rechnest du dir die log. Werte wie gewohnt aus. Vorteil, die Zeitabstände von Wert zu Wert bleiben konstant, weil die Helligkeitsänderung schon in der Wertetabelle drinsteckt. Erhoffe dir aber nicht zu viel davon, den Effekt wird man kaum sehen. Da ist eine etwas längere Pause "oben" und "unten" für das Auge effektiver. Gerade dann wenn die Led heller wird, ist es sowieso schwer bis kaum möglich an dem Ende noch Helligkeitsunterschiede wahrzunehmen. Es ist auch wichtig die richtige Geschwindigkeit einzustellen, damit es schön flüssig bleibt.
:
Bearbeitet durch User
Christian M. schrieb: > wie bekommt man das hier so rein, interessant!
1 | [math]Formel in LaTeX-Syntax[/math] |
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.