Les PIC ont la possibilité souvent inutilisée de générer des signaux PWM . Le programme que nous vous proposons ici décrit la façon de configurer un PIC 16F877 pour générer un signal PWM. Il a été testé sur notre platine d'expérimentation mais peut être utilisé tel quel sur tous les PIC de la série 16F87X. La deuxième partie de cet article décrit comment générer un signal pseudo sinusoidal à l'aide du signal PWM du PIC
LE PRINCIPE
Un signal PWM est caractérisé par sa période et son rapport cyclique.
Le 16F877 permet de définir la période du signal PWM. Celle-ci est détérminé par la valeur du registre PR2 et peut être calculée de la façon suivante:
Periode = (PR2+1) x 4 x Tosc x (TMR2 prescaler)
Dans notre programme, les valeurs sont les suivantes:
On trouve donc par l'application de la formule une période de 26 µS pour le signal PWM. Pour obtenir une valeur différente de la période il suffit de modifier la valeur de PR2. La réduire permet d'obtenir une fréquence d'échantillonage plus rapide.
Le rapport cyclique peut être définit dans le 16F877 en fixant la valeur du registre CCPR1L. La documentation de MICROCHIP indique que le temps pendant lequel la sortie PWM est à 1 est codée sur 10 bits. Le poids faible de cette valeur est fixée par les 8 bits du registre CCPR1L et les 2 bits de poids fort sont les bits 4 et 5 du registre CCP1CON. Pour nos essais, nous avons mis les bits CCP1CON.4 et CCP1CON.5 à 0 et fait varier la valeur de CCPR1L de 0 à 77 et nous avons obtenu une rapport cyclique variant de 0 à 100%. Nous n'avons donc pu mettre en évidence le codage du rapport cyclique sur 10 bits.
La sortie du signal PWM du 16F877 se fait sur le port C.2, celui-ci doit être configuré en sortie pour permettre la génération du signal.
LE PROGRAMME DE TEST
Le programme de test a été écrit avec CC5X et permet de générer un signal PWM de période 25 µS et avec un rapport cyclique variable en modifiant la valeur de CCPR1L. Dans le source qui vous est fourni ci-dessous, la valeur de CCPR1L a été fixée à 38 ce qui donne un rapport cyclique de 50% environ. Cette valeur pourra être modifiée pour faire varier le rapport cyclique. La sortie a été mesurée à l'aide d'un oscilloscope sur la broche 11 du 16F877. (PortC.2)
Le programme de test: PWMtest.C
RECONSTITUEZ UNE PSEUDO SINUSOIDE
Le programme que je vous propose ci-dessous permet de reconstituer un pseudo sinusoîde avec la sortie PWM du 16F877. Pour réaliser cela, j'ai câblé un réseau RC sur la sortie C.2 du PIC comme dessiné ci-dessous:
Pour reconstituer la sinusoide il s'agissait ensuite de determiner la valeur de l'amplitude de la tension à chaque periode du signal PWM soit toutes les 25 µS, j'ai fixé le nombre d'échantillons dans une période du signal à 20. J'ai ensuite calculé la valeur de l'amplitude du signal toutes les 25 µS. Pour cela, j'ai considéré que le temps variait de 0 à 1 sur l'axe des x ( cosinus ) et que l'amplitude était donnée par le sinus de l'angle correspondant. On obtient les valeurs suivantes:
On obtient ainsi les coefficients de l'amplitude du signal sinusoidal à chaque période de 25 µS. Il s'agit ensuite de les appliquer au rapport cyclique du signal pour obtenir un échantillonage. Si on reprend les mêmes valeurs que l'exemple ci-dessus, on sait qu'un rapport de 100% correspond à la valeur de 77 du registre CCPR1L. Il s'agit donc d'appliquer à cette valeur le coefficient que nous avons trouvé (sinus). On obtient les valeurs suivantes qui ont été placées dans un tableau dans le programme:
Dans l'exemple ci-dessous, le dépassement du timer 2 ( overflow ) génére une interruptions dans laquelle on modifie la valeur du rapport cyclique du signal PWM. Cette valeur est celle de l'amplitude calculée comme ci-dessus. On obtient donc aux bornes du condensateur un signal sinusoidal croissant pendant les 10 premiers dépassements du timer 2 et décroissant pendant les 10 suivants. Le booléen UP permet de determiner dans quel sens va le signal. On obtient le signal suivant:
Il s'agit d'un signal quasi sinusoidal de fréquence 2200 Hz.
Le programme en C écrit avec CC5X: PWM.ZIP