Ich habe in letzter Zeit viel mit LEDs gespielt, angetrieben von 8-Bit Mikrocontrollern. Manchmal ist es notwendig, reine Software-Implementierungen der Pulsweitenmodulation zu verwenden, um die LED-Helligkeit zu steuern - das heißt, das Licht ein- und auszuschalten, wobei das Verhältnis der Zeit schnell ein- und ausgeschaltet wird. Das funktioniert gut, bis ich auf etwa 5% Helligkeit komme, wo das Stroboskop unbehaglich ins Auge fällt.Eine effiziente ganzzahlige eindimensionale Dithering-Funktion?
Wenn Sie den PWM als Schleife implementieren, wird jede Zahl von 0-255 durchlaufen, um das Licht für diesen Moment ein- oder auszuschalten. Ein Licht, das auf den Wert 20 eingestellt ist, wird für die ersten 20 Schleifen eingeschaltet und dann ausgeschaltet.
Ich bin auf der Suche nach einer guten Funktion, die um diese Zahlen herum mischen wird, also anstatt 0, 1, 2, 3 zu durchlaufen ... könnte meine Schleife halb zufällig aus dem Pool von Möglichkeiten probieren. Die Gesamthelligkeit im Laufe der Zeit ist die gleiche, aber ein Licht mit 20 Helligkeitswert kann ein Dutzend Mal über 256 Schleifen ein- und ausgeschaltet werden, anstatt nur einmal zu leuchten und dann für den größten Teil der Schleife auszuschalten. Dies reduziert den Flackereffekt, selbst wenn die Schleife etwas langsamer läuft.
Eine gute Dithering-Funktion müsste jede Zahl im 8-Bit-Bereich zurückgeben, wenn sie mit jeder 8-Bit-Zahl aufgerufen wird. Es müsste also auch keine doppelten Zahlen erzeugen - nicht zufällig, nur gemischt. Es ist am besten, wenn es nicht dazu tendiert, ähnliche Zahlen hintereinander zu setzen - der Unterschied zwischen jeder Zahl sollte hoch sein - idealerweise bei 64-127, denke ich.
Die Einschränkungen sind auch interessant - es ist eine zeitkritische Anwendung. Additions-, Subtraktions- und bitweise Operationen kosten 1 willkürliche Zeiteinheit, Multiplikation kostet 2 Einheiten und Teilungskosten 4 Einheiten. Floats sind nicht in Frage, und die Kosten verdoppeln sich für jedes Vielfache von 8 Bits, die in einer Zwischenzahl verwendet werden. Nachschlagetabellen sind möglich, würden aber etwa die Hälfte der gesamten Speicherkapazität des Geräts beanspruchen - schnelle Algorithmen sind für die Wiederverwendbarkeit am besten geeignet, aber auch langsame Algorithmen von guter Qualität sind sehr nützlich, wenn Platz für die Vorberechnung vorhanden ist.
Vielen Dank für Ihre Hilfe mit Ideen oder Überlegungen. :)
Fehlendes Hausaufgaben-Tag ... ;-) Tut mir leid, aber der vorletzte Absatz mit den dummen erfundenen Zeiteinheiten kostet dich weg. –
@R haha guter Punkt. Ich wäre gespannt, welche Schule solche offenen Probleme hat. Wenn in den USA, vielleicht ein EE-Programm. Riecht nicht wie eine CS Hausaufgabe. –
Eigentlich keine Hausaufgaben. Ich bin mir nur nicht sicher, wie viele Zyklen diese Operationen in avr-libc dauern. Das ist nur mein allgemeines Verständnis dafür, wie das Timing funktioniert. Es schien mir am besten, nicht genauer zu sein, als ich zuversichtlich bin, dass jemand Kritik inkorrekt. :) – Blixxy