Quantcast
Channel: PICatout
Viewing all articles
Browse latest Browse all 192

chandelle électronique

$
0
0

Ce matin je suis tombé sur cet article. L'auteur de ce blog a analysé le signal d'une chandelle électronique afin de reproduire l'algorithme. Une chandelle électronique est en fait une LED dont l'intensité varie de façon aléatoire de manière à imiter le scintillement d'une vrai chandelle. Je n'ai jamais utiliser une telle LED j'étais donc curieux de voir de quoi il en retourne. J'ai donc examiner le code de l'auteur du blog cpldcpu. Le code est écris en 'C' pour un ATtiny mais je me suis dis que c'était un projet idéal à exécuter sur le plus simple et économique des MCU disponible sur le marché, soit le PIC10F200. En m'inspirant du code source original j'ai écris ma propre version en MPASM pour le PIC10F200. Rien de plus simple comme montage, un PIC10F200 avec une LED jaune directement branchée sur la broche GP2.

J'ai utilisé le même PRNG basé sur un LFSR de 32 bits. Cependant j'ai fait 2 modifications. D'abord dans le code original il y a un bogue, la variable randflag n'est jamais remise à zéro à l'intérieur de la boucle while. Donc une fois qu'elle a été mise à 1 elle y reste et devient inutile.

L'algorithme original autorise des fluctuations d'intensité pouvant descendre jusqu'à 25% (si le bogue est corrigé1 sinon ça peut descendre jusqu'à zéro). J'ai essayé ça mais je n'étais pas satisfait du résultat. Je trouvais les écarts d'intensité trop grand par rapport à une vrai chandelle. J'ai donc modifier le programme de la manière suivante. D'abord je me suis débarrassé de randflag qui est inutile dans ma version. Deuxièmement j'ai fait en sorte que le rapport cyclique du PWM varie de 50% à 100% au lieu de 25% à 100%. Je trouve ainsi que l'effet est plus ressemblant à une chandelle.

Code source en MPASM

On a donc une modulateur d'intensité pwm_control avec une résolution de 4 bits . L'intensité est contrôlée par variation du rapport cyclique d'une onde rectangulaire dont la fréquence est d'environ 440hz. On a un générateur de nombres pseudo aléatoire lfsr_rand. Pour cette application on ne garde que les 5 bits les moins significatifs qu'on conserve dans rand_val. Le délais pour contrôler la fréquence du modulateur PWM est assuré par la minuterie TIMER0. l'intensité de la LED est modifiée à tous les 32 cycles PWM par la variable frame_cntr qui est incrémentée modulo 32. Pour la valeur du rapport cyclique pwm_val on procède comme suis. Si la valeur de rand_val est inférieur à 16 on utilise la valeur maximale soit 15 (LED à intensité maximale). Si La valeur est >=16 on divise rand_val par 2 et on utilise cette valeur comme rapport cyclique. Donc statistiquement l'intensité de la LED devrait-être à son maximum 50% du temps et pour les 50% restant n'importe quelle valeur entre 50% et 100%.


1) pour corriger le bogue du code 'C' disponible sur github remplacez la ligne:

if ((RAND&0x0c)!=0) randflag=1; // only update if valid 
par
if ((RAND&0x0c)!=0) randflag=1;else randflag=0; 

Viewing all articles
Browse latest Browse all 192

Trending Articles