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.
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- Le
rapport cyclique du signal délivré sur la sortie PWM2 (CCP2) est
inversement proportionnel à celui délivré sur la sortie PWMA (CCP1).
Une valeur de 0% sur PWM1 correspond à 100% sur PWM2, une valeur
de 10% sur PWM1 correspond à 90% sur PWM2, une valeur de 75% sur PWM1
correspond à 25% sur PWM2, etc. C'est un choix arbitraire et absolument
pas une obligation !
- La sortie PWM2 / CCP2 peut être routée sur
deux broches différentes du PIC (une seule à la fois). Il s'agit soit
de la broche RC1/CCP2, soit de la broche RB3/CCP2. Le choix s'effectue
au moment de la programmation du PIC, voir copie
d'écran de la fenêtre dédition des paramètres du projet, ci-après (dans
MikroPascal, menu Project > Edit project).
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.
Commande en "deux fils"
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.
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.