J'ai beaucoup joué avec les LED récemment, alimenté par des microcontrôleurs 8 bits. Parfois, il est nécessaire d'utiliser des implémentations purement logicielles de Pulse Width Modulation pour contrôler la luminosité des LED - c'est-à-dire allumer et éteindre la lumière en variant rapidement le temps d'activation et de désactivation. Cela fonctionne très bien jusqu'à ce que je descende à environ 5% de luminosité, où le stroboscope commence à avoir l'air inconfortablement flickery à l'œil.Une fonction efficace de tramage unidimensionnel?
En implémentant le PWM comme une boucle, il parcourt chaque numéro de 0-255 pour allumer ou éteindre la lumière pour ce moment. Une lumière qui est réglée à la valeur 20 sera allumée pour les 20 premières boucles puis éteinte.
Je cherche une bonne fonction qui va mélanger autour de ces nombres, donc au lieu de boucler par 0, 1, 2, 3 ... ma boucle pourrait échantillonner semi-aléatoirement à partir du pool de possibilités. La luminosité cumulée dans le temps est la même, mais une lumière à une valeur de luminosité de 20 peut s'allumer et s'éteindre une douzaine de fois réparties sur 256 boucles au lieu de s'allumer une seule fois puis de s'éteindre pendant la majeure partie de la boucle. Cela réduit l'effet de scintillement même si la boucle est légèrement plus lente.
Une bonne fonction de dithering devrait retourner chaque nombre dans la gamme de 8 bits quand il est appelé avec chaque nombre de 8 bits. Il aurait donc également besoin de produire pas de numéros en double - pas aléatoire, juste mélangé. Il est préférable de ne pas mettre ensemble des nombres semblables en séquence - la différence entre chaque chiffre pouvant être élevé - idéalement d'environ 64-127.
Les limitations sont également intéressantes - c'est une application critique dans le temps. Les opérations d'addition, de soustraction et de bits coûtent 1 unité de temps arbitraire, la multiplication coûte 2 unités et la division coûte 4 unités. Les flotteurs sont hors des questions, et les coûts doublent à peu près pour chaque multiple de 8 bits utilisé dans un nombre intermédiaire. Les tables de recherche sont possibles, mais utiliseraient à peu près la moitié de la capacité totale de l'appareil. Les algorithmes rapides sont donc les meilleurs pour la réutilisabilité, mais les algorithmes lents de bonne qualité sont également très utiles lorsqu'il y a de la place.
Merci de m'avoir aidé avec vos idées ou vos réflexions. :)
Étiquette de devoirs manquante ... ;-) Désolé, mais l'avant-dernier paragraphe avec les coûts unitaires de temps imbéciles vous a donné. –
@R haha bon point. Je serais curieux de savoir quelle école donne des problèmes ouverts comme ça. Si aux États-Unis, peut-être un programme d'EE. Ne sent pas comme un devoir CS. –
En fait, pas les devoirs. Je ne suis pas sûr exactement combien de cycles ces opérations prennent dans avr-libc. C'est juste ma compréhension générale du fonctionnement du chronométrage. Il me semblait préférable de ne pas être plus précis que de croire que quelqu'un critique l'inexactitude. :) – Blixxy