Bonjour à tous.
BAM BIM BOUM ? Mais qu'est-ce qu'il raconte le Barbudor ?
La marmotte sortirait-elle de son trou(1) avec quelques neurones en moins?
La lecture du récent blog-post de notre ami Skywodd sur le BCM/BAM(2) m'a récemment rappelé que je voulais depuis plusieurs mois tester cette méthode sur le petit ATTiny85 qui sert à faire clignoter une de mes guirlandes de noël (autant se préparer en avance, l'évènement approche à grands pas...).
Ceux qui ont joué avec le Tiny savent qu'il manque cruellement de sorties PWM. On ne peut en utiliser que 3 alors que ma guirlande a 4 branches. Résultat l'une des branches ne fonctionnait jusqu'à présent qu'en tout-ou-rien.
Une technique pour faire plus de PWM est d'utiliser le SoftPWM de façon a reproduire par soft avec de nombreuuuuuses interruptions timer des signaux rectangulaires qui présentent la même forme d'onde qu'une sortie PWM hard (c'est à dire 1 durée haute et 1 durée basse dont le rapport (duty-cycle/rapport-cyclique) contrôle l'énergie dans la LED. Ainsi typiquement pour gérer un PWM à 256 niveaux (0..255) on va utiliser 255 interruptions timer par cycle afin de pouvoir ajuster indépendamment le rapport cyclique de chacun des signaux à traiter. Inconvénient, beaucoup d'interruptions inutiles et donc beaucoup de perte d'efficacité du processeur.
Le principe du BAM est basé sur le fait qu'il n'est nul besoin de respecter cette forme régulière rectangulaire. Il est possible d'arriver au même résultat avec des formes plus compliquées mais qui en moyenne ont le même rapport somme-des-temps-hauts sur somme-des-temps-bas que le rectangulaire de base.
Il s'avère qu'ainsi on n'a besoin pour gérer 256 niveaux non plus de 255 interruptions par période mais seulement de 8! Mais au lieu qu'elles soient régulièrement espacées, elles suivent une progression géométrique afin de porter le "poids" de chacun des bits quelle représente.
Exemple avec 16 niveaux de 0 à 15 (4 bits de codage).
Soft PWM :
Temps : EF123456789ABCDEF1234
Interruptions : ..................... Haut Bas
Led1=2 : __--_____________--__ 2 13
Led2=8 : __--------_______---- 8 7
Led3=9 : __---------______---- 9 6
Led4=14 : -_--------------_---- 14 1
Led5=15 : --------------------- 15 0
En mode BAM, chaque période de temps entre les interruptions va représenter le poids du bit
Entre l'interruption 1 et l'interruption 2 s'écoule le temps du bit 0
Entre la 2 et la 3, le temps représente le bit 1 (et donc dure 2 fois plus longtemps que le précédant)
A chaque fois, la durée entre interruption double jusqu’au dernier bit
Temps : F123456789ABCDEF12345
Interruptions : .. . . .. . Haut Bas
Led1=2 : __--_____________--__ 2 1+4+8=13
Led2=8 : ________--------_____ 8 1+2+4=7
Led3=9 : _-______--------_-___ 8+1=9 2+4=6
Led4=14 : -_------------------- 2+4+8=14 1
Led5=15 : ---------------------
Quelques liens pour approfondir en plus de l'article de Skywodd :
http://blog.spitzenpfeil.org/wordpress/2012/01/11/rgb-led-ring-v2-sequels-dont-have-to-be-bad/
Et bien sur en pièce jointe le code pour ATtiny85 (en utilisant l'environement arduino-tiny :
Amusez vous bien.
(1) La marmotte Barbudor est d'une race qui mange et dord à n'importe qu'elle époque de l'année.
(2) Quoi ? Vous n'avez pas encore lu cet article ? -> [Présentation] Modulation codée binaire (B.C.M.) | Skyduino - Le DIY à la française
guirlande_4.ino (8.62 KB)