En 2019, au Lycée Cabanis de Brive, un des projets de nos étudiants de BTS SN était un boîtier de commande d’un onduleur IGBT. Le but de ce boîtier, interfacé à un PC en USB, était de générer les signaux de commande pour réaliser un hacheur ou un onduleur. Ce projet utilisait un circuit PSoC5. Durant la phase de pré-étude de ce projet, je me suis posé une question :
Comment générer un signal sinusoïdal à f = 50 Hz, à partir d’un signal PWM avec un PSoC ?
On rappelle PWM : pulse width modulation ou MLI en français (modulation de largeur d’impulsion). On ne présente plus le PSoC, on en parle souvent sur ce site !
Conception PSoC
La structure retenue est la suivante :
On utilise un composant PWM 8 bits attaqué par une horloge Clock_1.
La configuration du PWM est la suivante :
Le PWM est constitué d’un (dé)compteur qui compte de 255 à 0. La sortie PWM est à 1 lorsque l’état du compteur est inférieur ou égal (Less or Equal) à un entier CMP_Value_1. La fréquence du signal PWM est donc égale à la fréquence de l’horloge divisée par 256.
Pour obtenir un signal PWM à valeur moyenne sinusoïdale, nous allons alors à chaque fin de cycle du compteur PWM (détecté par la broche TC = Terminal Count) déclencher une interruption (ISR_1). Cette interruption va modifier la valeur de CMP_Value_1. La suite des valeurs de CMP_Value_1 suit une loi sinusoïdale.
La figure suivante illustre ce principe :
Nous avons choisi une suite de 256 valeurs pour les valeurs de CMP_Value_1. Pour obtenir une sinusoïde de fréquence 50 Hz, il faut que la fréquence de l’horloge soit égale à 256 x 256 x 50 = 3,2768 MHz.
Le programme
Le programme est donné ci-après :
On définit d’abord un tableau TabSinus de 256 éléments. Celui-ci va contenir les 256 points constituants la sinusoide.
La routine d’interruption Cy_ISR, appelée à chaque fois que le compteur du PWM a terminé son comptage, configure le nouveau rapport cyclique du PWM avec la valeur qu’elle va chercher dans le tableau TabSinus.
Le programme principal fait clignoter la led et, si le bouton-poussoir est appuyé, on diminue l’amplitude du signal sinusoïdal en écrivant une nouvelle suite de valeurs dans TabSinus.
Les résultats
Et ca marche ? Regardons un peu les mesures que j’ai faites avec mon vieux Tektro. C’est un scope analogique mais avec de la mémoire numérique (Tektronix 2212). Une antiquité (cet appareil a une trentaine d’années), mais qui fait très bien le job !
En haut avec un calibre 5V/carreau, le signal PWM.
En bas, le même signal filtré par un passe-bas du 1°ordre (RC = 1kΩ.1µF), calibre 1V/carreau.
On remarquera que le PWM est plutôt à 1 quand le sinus est max et plutôt à 0 quand le sinus est bas.
Le détail est visible ici :
Sur cette deuxième figure, on observe bien que le rapport cyclique du PWM (donc la largeur des impulsions) diminue quand le signal sinusoïdal est décroissant !
Alors, pas mal, non ?
Et qui on est, hein ?