Electronique > Réalisations > Générateurs > Générateur PWM (MLI) 004

Dernière mise à jour : 23/12/2012

Présentation

Ce quatrième générateur PWM (MLI) produit un signal dont le rapport cyclique est proportionnel à une tension continue (0 V à 5 V), pouvant provenir par exemple d'un simple potentiomètre. Ce circuit peut servir de base à un gradateur de lumière évolué (voir page Gradateur de lumière 012), ou à la commande de moteurs électriques via une interface de puissance en pont (bridge) adaptée à l'utilisation voulue. Il est fait ici usage d'un PIC de type 18F2520, qui intègre tout le nécessaire pour la lecture de la tension de commande (convertisseur analogique / numérique intégré) et pour la commande de la charge (sortie PWM évoluée). La fréquence du signal PWM dépend elle aussi de la valeur d'une tension continue de commande (0 V à 5 V).

Schéma

Le circuit ci-après montre le circuit de commande, sans la partie puissance qui devra être choisie en fonction de la charge à piloter.

gene_pwm_004

Fonctionnement général
Il est assez simple en fin de compte. Le PIC 18F2520 comporte un CAN (Convertisseur Analogique / Numérique) intégré, que l'on met à contribution pour lire les tensions de commande. Les valeurs numérisées sont ensuite directement utilisées pour définir la fréquence et le rapport cyclique du générateur PWM lui aussi intégré sur la puce du microcontrôleur.

Commande de la fréquence
Effectuée avec une tension de commande (0 V à +5 V) appliquée sur l'entrée CAN #1 (RA1/AN1, broche 3)
La valeur de la fréquence du signal PWM a été fixée à quelques valeurs discrètes (fixes), il n'est pas possible d'avoir un réglage "continu". Ce pour deux raisons :
- la routine PWM_Init de MikroPascal que j'utilise n'accepte pas le passage d'une variable en paramètre et nécessite une constante (on ne peut utiliser directement la valeur d'une variable qui stocke la dernière valeur lue du CAN);
- il serait risqué de profiter d'un faible pas de quantification avec une tension de commande qui peut légèrement fluctuer : on risquerait d'avoir trop souvent un arrêt et une reprise du module PWM du PIC, lors de chaque changement de fréquence. J'ai donc pris la décision de découper la fourchette de tension de commande en 8 plages qui sont les suivantes (les valeurs indiquées correspondent à la valeur numérisée de la tension de commande) :
- 0 (0 V) : fréq = 10 kHz
- 1 à 127 (0,005 V à 0,62 V) : Fréq. = 500 Hz
- 128 à 255 (0,62 V à 1,24 V) : Fréq. = 1 kHz
- 256 à 384 (1,24 V à 1,87 V) : Fréq. = 2 kHz
- 384 à 512 (1,87 V à 2,50 V) : Fréq. = 3 kHz
- 512 à 640 (2,50 V à 3,12 V) : Fréq. = 4 kHz
- 640 à 768 (3,12 V à 3,75 V) : Fréq. = 5 kHz
- 768 à 896 (3,75 V à 4,37 V) : Fréq. = 10 kHz
- 896 à 1023 (4,37 V à 5,00 V) : Fréq. = 20 kHz
Bien sûr, les valeurs que j'ai choisies peuvent être modifiées à votre guise, et le nombre de plage peut être augmenté ou diminué.

// generateur PWM 004

procedure PWM_GetFreq;
begin
iAdcPWMFreq := ADC_Read(1);
PwmFreqNew := iAdcPWMFreq;
if PwmFreqNew <> PwmFreqOld then
begin
PWM1_Stop;
PWM2_Stop;
if (PwmFreqNew = 0) then
begin
PWM1_Init(cFreq_00);
PWM2_Init(cFreq_00);
end
else if ((PwmFreqNew > 0) and (PwmFreqNew < 128)) then
begin
PWM1_Init(cFreq_01);
PWM2_Init(cFreq_01);
end

{

etc...

}
else if ((PwmFreqNew >= 896) and (PwmFreqNew < 1024)) then
begin
PWM1_Init(cFreq_08);
PWM2_Init(cFreq_08);
end;
PWM1_Set_Duty(PwmDutyNew);
PWM2_Set_Duty(255 - PwmDutyNew);
PWM1_Start;
PWM2_Start;
PwmFreqOld := PwmFreqNew;
end;
end;


La fréquence de 10 kHz attribuée à une tension de commande de 0 V permet de disposer d'une fréquence précise quand l'entrée analogique #1 du PIC est reliée à la masse (si on ne veut pas l'utiliser). Notez dans le code source la présence de deux séquences d'initialisation, une pour la sortie PWM1 et l'autre pour la sortie PWM2. La fréquence est obligatoirement la même pour les deux modules PWM, conformément aux indications données dans le datasheet (manuel technique) du fabricant du PIC Microchip. La seconde ligne d'initialisation peut être supprimée si vous ne comptez pas utiliser le second module PWM.

Commande du rapport cyclique
Effectuée avec une tension de commande (0 V à +5 V) appliquée sur l'entrée CAN #0 (RA0/AN0, broche 2)
Une tension de commande de 0 V correspond un rapport cyclique de 0 %, et une tension de commande de +5 V correspond un rapport cyclique de 100 %. Comme le CAN à une résolution de 10 bits, la valeur numérisée peut se trouver entre 0 et 1023 (1024 valeurs possibles). Pour obtenir un rapport cyclique de 50 % en sortie du générateur PWM, il faut donc une tension de commande de +2,5 V, qui une fois numérisée donnera la valeur de 511 ou 512. Quelques exemples (les valeurs indiquées correspondent à la valeur numérisée de la tension de commande) :
- 0 (0 V) : rapport cyclique = 0%
- 255 (1,24 V) : rapport cyclique = 25%
- 512 (2,50 V) : rapport cyclique = 50%
- 1023 (5,00 V) : rapport cyclique = 100%
Dans la pratique, la routine de MikroPascal que j'utilise attend une valeur comprise entre 0 (rapport cyclique de 0%) et 255 (rapport cyclique de 100%). Il suffit donc de diviser par 4 la valeur du CAN pour disposer directement de la valeur du rapport cyclique.

// generateur PWM 004

procedure PWM_GetDuty;
begin
iAdcPWMDuty := ADC_Read(0);
PwmDutyNew := iAdcPWMDuty / 4;
if PwmDutyNew <> PwmDutyOld then
begin
PWM1_Set_Duty(PwmDutyNew);
PWM2_Set_Duty(255 - PwmDutyNew);
PwmDutyOld := PwmDutyNew;
end;
end;


Facile, non ?

Remarques

Alimentation
Le PIC est alimenté sous une tension de 5 V, cette tension est délivrée par un régulateur de type 7805 ou 78L05. A l'entrée de ce régulateur, vous pouvez appliquer une tension de valeur comprise entre +8 V et +15 V. Dans la pratique, cette tension d'entrée pourra correspondre à celle requise pour la charge (moteur, LED, etc).

Commande d'un moteur (au cas où l'idée vous viendrait à l'esprit)

La commande d'un moteur peut s'effectuer de différentes façons. Si on se contente de vouloir réguler la vitesse d'un petit moteur à courant continu, on peut se contenter d'une commande à "un seul fil", tel qu'on peut le voir sur les pages Régulation simple pour moteur 003 ou Générateur PWM 003. Si on veut faire tourner un moteur dans un sens ou dans l'autre, le fonctionnement diffère légèrement, même si le principe du signal PWM reste appliqué. Pour cela, on commande le moteur non pas au travers d'un seul transistor, mais avec deux transistors (alim double requise) ou avec quatre transistors (alim simple requise). C'est ce que montrent les schémas qui suivent.

pwm_moteur_001a
Commande en "deux fils"

pwm_moteur_001b
Commande en "quatre fils"

Conduction simultanée de tous les transistors
Les transistors sont de type MOSFET car ils présentent en mode passant, une résistance plus faible que les transistors bipolaires, et occasionnent ainsi moins de perte en conduction (et donc moins d'échauffement). Mais malheureusement aussi, une capacité parasite plus élevée au niveau de leur patte de commande (Gate), qui "conserve en mémoire" l'état ON même quand on leur demande de ne plus conduire. Cet état mémoire, lié à la charge emmagasinée dans la capacité parasite, est pénalisant pendant les phases de transistion On/Off et Off/On car le temps de coupure (passage à l'état bloqué des transistors) est plus long que le temps d'établissement (passage à l'état passant). Cela signifie simplement que si on se contente de piloter les transistors "complémentaires" par des signaux de polarité opposée, il se trouve un moment ou tous sont conducteurs en même temps, ce qui occasionne de fortes pointes de consommation et réduit le rendement globale de l'interface de puyissance. Dans les cas extrêmes, cela peut même détruire les transistors de puissance. La commande de ces derniers doit donc de préférence se faire avec une petite période de temps mort au moment des transistions : on coupe les transistors qui doivent être bloqué, on attend un petit peu (le petit peu est évidement relatif à la fréquence de fonctionnement), et on active les transistors qui doivent être passants. Si tout se passe bien, on ne trouve à aucun moment tous les transistors simultanément en conduction. La gestion de ce temps mort peut être assurée par des circuits logiques traditionnels, ou peut être prévue dans un circuit intégré spécialisé pour le contrôle de moteurs ou dans un microcontrôleur.

Adaptation pour pilotage d'un moteur (au cas où...)

Le schéma montré en début de page, avec le logiciel proposé en téléchargement ci-après, convient pour la commande de "petits" moteurs. Pour le pilotage d'un gros moteur, il convient de connaitre avec précision ses caractéristiques techniques pour ne pas s'exposer à des problèmes de fonctionnement, voire à la destruction d'un ou plusieurs composants (transistors MOS de puissance ou moteur lui-même). Il vous faudra en particulier vous assurer que la fréquence de fonctionnement du ou des signaux PWM convient à votre moteur (pas de raté ni surconsommation), et éventuellement jouer sur la durée des "temps morts" (dead-band). Si les valeurs de fréquences proposées ci-avant ne conviennent pas à votre application, à vous d'effectuer les modifications requises.

Prototype

Le montage tel que présenté ici a été réalisé avec succès par plusieurs personnes. Guillaume a modifié le code source que j'ai mis à disposition, pour permettre un affichage de la fréquence et du rapport cyclique sur un écran LCD.

gene_pwm_004_18f2520_guillaume_proto_001a

Il utilise RC1/CCP2 pour la deuxième sortie PWM. Son code est disponible au paragraphe "Logiciel du PIC".

Circuit imprimé

Aucun réalisé.

Logiciel du PIC

Les fichiers de code source (MikroPascal V5.30 Pro) et binaire compilé (*.hex) sont disponibles dans les archives dont les liens suivent. 
Générateur PWM 004 - PIC 18F2520 - (02/09/2012) - Ma version (sans affichage)
Générateur PWM 004 - PIC 18F2520 - Guillaume - (23/12/2012) - Version de Guillaume avec affichage fréquence et rapport cyclique sur écran LCD
Si vous souhaitez recevoir par la poste un PIC préprogrammé et prêt à utiliser, merci de consulter la page PIC - Sources.

Historique

23/12/2012
- Ajout précisions concernant la sortie PWM2 / CCP2 (sur RC1 ou RB3).
- Ajout photo prototype de Guillaume (version avec affichage sur écran LCD), que je remercie pour ses retours.
02/09/2012

- Ajout réglage fréquence par commande en tension continue.
21/10/2009
- Première mise à disposition.