Etape 8: Logiciel : minuteries et interruptions
Je ne sais pas quelles photos à poster pour expliquer le logiciel, alors, évidemment, sans doute mieux pour juste après une image avec un chat. En outre, le code complet arduino est disponible au téléchargement ci-dessus. (lbdOrganPWM.ino)
Minuteries et interruptions
Afin d’utiliser le matériel PWM en séquence avec la ligne ac déclenchement, tout ce que nous devons faire est de veiller à ce que le compteur qui est utilisé pour générer la valeur PWM est réinitialisé sur le passage à zéro de la tension d’alimentation secteur. Avec le circuit de déclenchement a expliqué à l’étape 7, nous attachons une interruption matérielle sur cette broche pour réinitialiser les compteurs lorsqu’il se déclenche.
Chaque minuterie est initialisée au début du programme pour le mode de génération de formes d’ondes du mode Fast PWM ICRn comme la valeur. Ce mode de minuterie est ce qui rend l’utilisation du matériel PWM possible.
Puisque nous avons 7-bit résolution dans la vélocité de la note MIDI, nous voulons obtenir assez proche de cette résolution pour l’intensité de l’ampoule. Honnêtement, tout ce qui dépasse 16 étapes est assez négligeable, mais puisque nous pouvons nous pourrions aussi bien. Donc si nous fixons le Prédiviseur des timers à 1024 (p. 161 du Datasheet Atmega2560), puis nous avons 16 Mhz / 1024 pour notre horloge = 15625 Hz. Notre fréquence de l’objectif de notre onde PWM total est 120Hz, pour faire correspondre le demi-cycle de la tension de ligne de 60Hz. Ainsi, nous divisons 15626/120 pour obtenir environ 130. Cela signifie que si nous fixons notre ICRn Registre 130, nous aurons une fréquence correspondant à la fréquence de ligne avec environ 130 marches. C’est parfait puisque nous avons 128 étapes dans la vélocité MIDI !
Après avoir essayé ceci dehors, il y a quelques variations dans la fréquence de la ligne, et donc je me suis retrouvé à l’aide d’une valeur supérieure (ICRn) de 122. Cela semblait être un coffre suffisamment de valeur où je m’assurerais que serait désactiver le triac à la Croix-zéro. Si vous allez trop loin au-delà du seuil de zéro-Croix, vous manquez et jamais, la lumière s’éteint ou s’estompe.
Dernière chose, à propos de la config de la minuterie est la polarité PWM. Parce que dès que le minuteur arrive à son point de terminaison, on veut s’assurer que le triac s’éteint (cela signifie que nous sommes près de la Croix-zéro), il faut utiliser le mode inversé de la goupille PWM, alors qu’une fois le Timer = 0, la goupille est faible. Cela signifie juste que quand nous obtenons une valeur de vitesse de 100, nous voulons vraiment régler le registre PWM à 127-100 = 27.
Pour la manutention de la Croix-zéro, la bibliothèque d’arduino possède une fonction intégrée pour cela en utilisant l’interruption matérielle :
attachInterrupt(5,zeroCrossDetect,FALLING);
Lorsque 5 est le nombre d’interruption (broche 18 sur le méga), FALLING indique il est déclenché uniquement sur le front descendant (1 -> 0, pas 0 -> 1) de l’axe de l’interruption, et zeroCrossDetect est la fonction ci-dessous.
Il fonctionne en définissant tous les compteurs utilisés par les broches PWM spécifiques, que j’ai choisi de zéro à zéro la Croix. Il met également en place le mode de génération Prédiviseur et forme d’onde pour chaque minuterie, la raison en est donc que la minuterie démarre sur le cycle à C.A. au début du programme, s’assurant il n’y a pas de décalage depuis le début.
void zeroCrossDetect() { TCNT1 = 0; TCNT3 = 0; TCNT4 = 0; TCNT5 = 0; TCCR1B = (1<<WGM12) | (1<<WGM13) | (1<<CS10) | (1<<CS12); TCCR3B = (1<<WGM32) | (1<<WGM33) | (1<<CS30) | (1<<CS32); TCCR4B = (1<<WGM42) | (1<<WGM43) | (1<<CS40) | (1<<CS42); TCCR5B = (1<<WGM52) | (1<<WGM53) | (1<<CS50) | (1<<CS52); }