Dernière mise à jour :
21/08/2011
Présentation
Ce
gradateur
de lumière basse tension est destiné à alimenter une
lampe à incandescence, via un signal en tout ou rien de type
PWM.
Il
est conçu autour d'un microcontrôleur associé à
un transistor MOSFET de puissance. Le réglage de la puissance lumineuse
s'effectue avec un potentiomètre "local" ou avec une tension de
commande externe comprise entre 0 V et +5 V ou entre 0 V et +10 V. Je
parle d'un gradateur de lumière mais en fait plusieurs schémas sont
proposés :
-
Schéma 012a
: avec PIC 12F675 (simple, pas cher - moins de 2 euros le 12F675, mais
pas le plus performant)
-
Schéma 012b
: avec PIC 12F675 + 16F628A (moins simple mais plus performant, pour
environ 6 euros les deux PIC)
-
Schéma 012c
: avec PIC 18F2520 (le top, mais avec un PIC qui coûte environ 8 euros)
-
Schéma 012d
: avec PIC 16F88 (le meilleur compromis à ce jour me semble-t-il, ce
PIC coûtant environ 4 euros) et fréquence signal PWM ajustable.
Quatre schémas
pour montrer que l'on peut suivre plusieurs chemins, en fonction de ses
préférences et du taux de remplissage de son porte monnaie.
Remarque
: les schémas proposés ici sont "luxueux" pour une fonction de
gradation simple, et seront sans doute plus appropriés pour une
commande évoluée (avec télécommande par exemple). Pour un usage
"basique", jetez plutôt un oeil sur les autres gradateurs qui ne font
usage d'aucun composant programmable.
Schéma 012a
Vous pensiez qu'il fallait plus de composants ? C'est raté.
Avertissement
Le signal PWM fourni avec ce montage est élaboré de façon
"logicielle" et n'est pas aussi précis que celui généré par un
PIC
disposant d'un
générateur PWM matériel, comme les PIC 16F628A et 18F2520 qui seront
exploités par la suite. Surtout si on cherche à obtenir un signal PWM
dont la fréquence est "élevée". L'idéal est de disposer d'un PIC peu
coûteux
disposant en même temps d'un convertisseur analogique /
numérique et d'un générateur PWM... tel le 16F88. Le PIC 12F675
possède bien le convertisseur mais pas le générateur
PWM, et pour le PIC 16F628A, c'est l'inverse... Bref, un montage
d'initiation, qui fonctionne bien si on se contente d'une
fréquence peu élevée.
Fonctionnement général
Le PIC 12F675 fait tout. Il intègre un
convertisseur analogique / numérique qui nous permet de connaitre la
tension d'entrée (de commande), qu'elle vienne du potentiomètre RV1 ou
de l'extérieur (choix par SW1), et il génère de façon entièrement
logicielle un signal PWM dont le
rapport cyclique est proportionnel à la tension mesurée.
procedure ADC_GetValue;
const
bUseMPProc = false;
begin
Out_Test2 := 1;
if bUseMPProc then
begin
AdcInNew := ADC_Get_Sample(0) shr 3; // keep 7 MSB from 10 bit acquired value
end
else
begin
bADCIntOccured := false;
ADCON0.ADFM := 0; // 0 = left justified, 1 = right justified
ADCON0.1 := 1;
PIR1.ADIF := 1;
repeat
delay_us(1);
until (PIR1.ADIF = 0);
AdcInNew := ADRESH shr 1; // get 7 MSB value
end;
Out_Test2 := 0;
end;
begin
Main_Init;
while true do
begin
// TMR0 Interrupt ?
if bT0IntOccured then
begin
Out_Test := Out_Test xor 1;
if iStepPWM < 127 then
inc(iStepPWM)
else
iStepPWM := 0;
Out_PWM := (PwmDuty > iStepPWM);
bT0IntOccured := false;
end;
// read actual analog value on GP0/AN0 pin
ADC_GetValue;
// if acquired analog voltage has changed, refresh PWM value
if AdcInNew <> AdcInOld then
begin
PwmDuty := AdcInNew;
AdcInOld := AdcInNew;
end;
end;
end;
Un code qui
ma foi ne fait pas
tout de façon parfaite, contrepartie de sa simplicité.
Et encore ça fonctionne mieux maintenant avec les interruptions
qu'avec la version précédente de 2009 qui n'en faisait pas usage
(en fait meilleure stabilité mais fréquence max moindre). La fréquence
du
signal PWM correspond à la fréquence des interruptions du Timer0
divisée par 127. Avec les valeurs adoptées ici dans le code logiciel du
PIC, nous avons une récurrence des interruptions de 5 kHz, ce qui
conduit à une fréquence du signal PWM de quelque 40 Hz. C'est certes
bien inférieur à ce qu'on peut avoir avec les solutions proposées
ci-après ! A noter par la même occasion que le temps pris par la
conversion A/N est nettement supérieur à ce que j'attendais (200 us au
lieu de quelques us) et que cette largesse empêche d'avoir un rythme
d'interruption élevé (5 kHz au lieu des 55 kHz attendus). Pour
l'instant je n'ai pas compris comment mieux faire.
Section de puissance
Elle est assurée par un seul composant : le transistor MOSFET de
puissance Q1 / IRFZ44. Ce transistor ne réclame quasiment aucun
courant sur sa grille et est capable de commuter des courants de
plusieurs ampères, ce qui nous arrange bien dans le cas
présent.
Alimentation
L'alimentation du PIC se fait sous +5 V, via le régulateur de
tension U2 de type 78L05. Le PIC est ainsi bien découplé
(isolé) des variations induites par les commutations du
transistor de puissance.
Schéma 012b
Comme
dit en introduction, on peut faire mieux pour un poil plus cher. Il
suffit d'ajouter un PIC 16F628A au PIC 12F675 existant...
Dans
ce montage, un PIC (U1 / 12F675) est utilisé pour la conversion
analogique /
numérique de la tension de commande, et un second PIC (U2 / 16F628A)
est utilisé pour
générer le signal PWM. Entre les deux, une liaison directe pour
transférer les valeurs désirées (entre 0 et 100 %). Ca peut paraitre
un peu grossier, je suis
d'accord, mais ça fait toujours plaisir aux gens qui sont un peu tordus
comme moi. Ca laisse aussi entrevoir que l'on peut utiliser un 16F628
pour contrôler la luminosité d'une lampe non pas à partir
d'une
tension continue, mais à partir de signaux codés, tel un code RC5 de
télécommande TV, par exemple...
Schéma 012c
Et là, un PIC de la famille 18F, pour faire encore plus luxueux...
C'est
tout de même un peu fou, utiliser un pavé de cette taille et n'utiliser
que deux de ses nombreuses pattes... Mais je vous fais confiance, vous
allez bien trouver un moyen d'exploiter toutes celles qui restent
libres... histoire de rentabiliser la bête !
Ah, j'ai oublié de vous le dire : les signaux PWM délivrés par le
18F2520 peuvent se faire sur une, deux ou quatre sorties :
- en mode "simple" (une seule sortie utilisée, comme c'est le cas ici),
- en mode Half-bridge (deux sorties utilisées, l'une étant le
complément - signal inversé - de l'autre)
- ou en mode Full-Bridge (deux ou quatre sorties utilisées).
Voir Datasheet du PIC 18F2520 pour plus de détails.
Schéma 012d
Le
meilleur rapport qualité / prix à mon sens. Je ne l'avais pas proposé
avant car je ne connaissais pas encore ce petit bijoux de 16F88 en 2009.
Tout
comme pour le gradateur 012c, la valeur du rapport cyclique
peut
être modifiée en local (inverseur SW1 orienté vers le potentiomètre
RV1) ou via une tension externe de plage comprise entre 0 V et +5 V ou
0 V et +10 V (inverseur SW1 orienté vers le connecteur J2). Notons que
pour une tension de 0 V à l'entrée du CAN du PIC (broche RA0/AN0) le
signal PWM délivré en sortie RBO/CCP1 présente un rapport cyclique de
l'ordre de 0,4% et non pas de 0%. Ceci parce que pour une raison
inconnue la sortie PWM sort un signal de rapport 20% quand je lui
demande de sortir 0%. Je localiserai bien un jour la cause de cette
supercherie mais pour l'instant on se contente de ce qu'on a. Après
tout, 0,4% ça fait bien peu et on peut quasiment considérer qu'on a
notre 0%. Voilà pour ma défense personnelle.
Fréquence du signal PWM
Après
discussion intensive avec un passionné de ventilateurs et de moteurs,
est venue la question toute naturelle de la fréquence du signal PWM
généré par ce petit circuit. Sachant que selon la charge qui va être
pilotée et si cette dernière est de type inductive (moteur ventilateur
ou pompe par exemple), la fréquence joue un rôle déterminant dans le
bon fonctionnement de l'ensemble, surtout pour les valeurs de rapport cyclique faibles et
élevées. Le PIC 16F88 utilisé ici disposant de pas
mal de lignes d'E/S libres, il semblait judicieux de les exploiter pour
indiquer, au moment du démarrage, quelle fréquence adopter. C'est ainsi
que les lignes RB1 à RB7 définissent un mot binaire qui est "traduit" en
une valeur de fréquence PWM bien précise. Ces lignes disposent de
"
résistances pullup"
intégrées qui sont activées, c'est à dire qu'elles
sont à l'état logique haut si on ne les raccorde à rien et à l'état
logique bas si on les raccorde à la masse. Pour exploiter ces lignes
RB1 à RB7, vous devez y connecter des interrupteurs, cavaliers ou ponts
de soudure qui font jonction avec la masse. Le schéma
qui suit montre l'usage de microswitches (interrupteurs miniatures au
format physique DIL14) mais pour le circuit imprimé j'ai opté pour un
connecteur 2x7 broches pouvant recevoir des cavaliers amovibles, c'est
moins coûteux.
Rappelez-vous qu'une connexion non établie correspond à un état logique
haut sur la ligne du PIC concernée.
Côté logiciel PIC...
Je
ne vais pas copier ici l'intégralité du code source qui est disponible
en téléchargement et que vous pouvez à loisir consulter à tête reposée.
Juste quelques lignes relatives à la partie qui analyse l'état logique
des lignes RB1 à RB7 et qui permet de conclure en la fréquence désirée
du signal PWM. Promis, je ne vous embête pas plus que ça.
procedure PWM_GetFreqValue;
var
iFreqConf: byte;
iFreqVal: word;
begin
// récupération config sur lignes RB1..RB7 du PIC 16F88
iFreqConf := 0;
if PORTB.1 then iFreqConf := iFreqConf + 1;
if PORTB.2 then iFreqConf := iFreqConf + 2;
if PORTB.3 then iFreqConf := iFreqConf + 4;
if PORTB.4 then iFreqConf := iFreqConf + 8;
if PORTB.5 then iFreqConf := iFreqConf + 16;
if PORTB.6 then iFreqConf := iFreqConf + 32;
if PORTB.7 then iFreqConf := iFreqConf + 64;
// initialisation fréquence PWM fonction de la valeur de la variable iFreqConf
if (iFreqConf = 0) then PWM1_Init(1000) // 1000 Hz
else if ((iFreqConf > 0) and (iFreqConf <= 6)) then PWM1_Init(500) // 500 Hz
else if ((iFreqConf > 6) and (iFreqConf <= 12)) then PWM1_Init(1000) // 1 kHz
else if ((iFreqConf > 12) and (iFreqConf <= 18)) then PWM1_Init(2000) // 2 kHz
else if ((iFreqConf > 18) and (iFreqConf <= 24)) then PWM1_Init(3000) // 3 kHz
else if ((iFreqConf > 24) and (iFreqConf <= 30)) then PWM1_Init(4000) // 4 kHz
else if ((iFreqConf > 30) and (iFreqConf <= 36)) then PWM1_Init(5000) // 5 kHz
else if ((iFreqConf > 36) and (iFreqConf <= 42)) then PWM1_Init(6000) // 6 kHz
else if ((iFreqConf > 42) and (iFreqConf <= 48)) then PWM1_Init(7000) // 7 kHz
else if ((iFreqConf > 48) and (iFreqConf <= 54)) then PWM1_Init(8000) // 8 kHz
else if ((iFreqConf > 54) and (iFreqConf <= 60)) then PWM1_Init(9000) // 9 kHz
else if ((iFreqConf > 60) and (iFreqConf <= 66)) then PWM1_Init(10000) // 10 kHz
else if ((iFreqConf > 66) and (iFreqConf <= 72)) then PWM1_Init(15000) // 15 kHz
else if ((iFreqConf > 72) and (iFreqConf <= 78)) then PWM1_Init(20000) // 20 kHz
else if ((iFreqConf > 78) and (iFreqConf <= 84)) then PWM1_Init(25000) // 25 kHz
else if ((iFreqConf > 84) and (iFreqConf <= 90)) then PWM1_Init(30000) // 30 kHz
else if ((iFreqConf > 90) and (iFreqConf <= 96)) then PWM1_Init(35000) // 35 kHz
else if ((iFreqConf > 96) and (iFreqConf <= 102)) then PWM1_Init(40000) // 40 kHz
else if ((iFreqConf > 102) and (iFreqConf <= 108)) then PWM1_Init(45000) // 45 kHz
else if ((iFreqConf > 108) and (iFreqConf <= 114)) then PWM1_Init(50000) // 50 kHz
else if ((iFreqConf > 114) and (iFreqConf <= 120)) then PWM1_Init(55000) // 55 kHz
else if (iFreqConf > 120) then PWM1_Init(60000); // 60 kHz
// rapport cyclique de 50% par défaut, puis démarrage du générateur PWM
PWM1_Set_Duty(50);
PWM1_Start;
delay_ms(100);
end;
Ca va, c'est buvable ? Il va de soi que pour comprendre dans le
détail comment ça se passe, vous devez déjà avoir une notion minimale
des
conversions binaire / décimale.
Exemples pratiques de configuration de fréquence
Allez, trois exemples pour se faire la main.
Exemple N°1 - Fréquence désirée = 500 HzPour
cette fréquence il faut que le paramètre iFreqConf soit compris entre 1
et 6 (voir lignes de code ci-avant). Tout câblage des lignes RB1 à RB7
qui conduit à obtenir une valeur décimale comprise dans cette
fourchette convient. Vous pouvez par exemple vous fixer sur la valeur 4
qui est facilement obtenue en reliant toutes les lignes RB1 à RB7 à la
masse sauf la ligne RB3 qui reste en l'air, voir schéma qui suit.
Exemple N°2 - Fréquence désirée = 2000 HzPour
cette fréquence il faut que le paramètre iFreqConf soit compris entre 13
et 18. Vous pouvez par exemple vous fixer sur la valeur 16
qui est facilement obtenue en reliant toutes les lignes RB1 à RB7 à la
masse sauf la ligne RB5 qui reste en l'air, voir schéma qui suit.
Exemple N°3 - Fréquence désirée = 15000 HzPour
cette fréquence il faut que le paramètre iFreqConf soit compris entre 67
et 72. Vous pouvez par exemple vous fixer sur la valeur 68
qui est facilement obtenue en reliant toutes les lignes RB1 à RB7 à la
masse sauf les lignes RB7 et RB3 qui restent en l'air, voir schéma qui suit.
Comment
? La fréquence de sortie du signal PWM n'est pas rigoureusement de 15
kHz (en simulation tout comme en maquette réelle) ? Cela vous gêne-t-il
réellement ? Je rappelle qu'il est fait ici usage de l'oscillateur
interne 8 MHz du PIC et que pour cette raison il y a peu de chance que
la valeur exacte soit celle attendue au Hz près. Restons sérieux...
Prototype (le mien)
Essais
réalisés pour la version 012d (16F88) avec ma platine EasyPic4 et une
petite plaque d'expérimentation sans soudure pour y placer un
potentiomètre monté en diviseur de tension pour le réglage du
rapport cyclique et les interrupteurs pour la configuration de la
fréquence du signal PWM.
Le
graphe montre le signal PWM généré à la fréquence de 25 kHz en sortie
RB0 du PIC, ici le rapport cyclique est voisin de 50%.
Prototype de Vincent L.
Vincent L. a construit la version 012d avec 16F88 en vue de piloter des ventilateurs (bloc de 8 ventilateurs pour être précis).
Lui
aussi a utilisé des microswitches pour la sélection de la fréquence du
signal PWM. Ses tests confirment un comportement globalement correct
quelque soit la fréquence, avec une baisse de régime pour les valeurs
les plus élevées (à partir de quelques dizaines de kHz). Un point
faible à noter au début des tests : impossibilité d'obtenir la vitesse
de rotation
maximale des ventilateurs quand le signal PWM est à 99% ou 100%. La
consommation globale des ventilateurs était à ce moment de 2,7 A, à
comparer aux 3,6 A en branchement direct. Une petite perte donc au
niveau du MOSFET, qui est un IRFZ44N avec amplitude du
signal d'attaque - Vgs - de 6,5 V. Vincent à ajouté un transistor entre
la sortie du PIC et la broche Gate du MOSFET pour l'attaquer avec une
tension supérieure à 5 V. Après (re)lecture du datasheet du IRFZ44N, je
m'apperçois que la tension VGS de test est de 10 V... Après adaptation
et attaque avec tension supérieure (voir page
Interfaces logiques pour modification retenue), résultats enfin convaincants !
Codes source et fichiers binaires compilés
Programmes uniquement
simulés, pas testé en grandeur réelle !
Disponible dans l'archive dont le lien suit, code source au
format
MikroPascal Pro V2.50 pour les versions 012a, 012b et
012c, MikroPascal Pro V5.0 pour la version 012d.
Gradateur
lumière 012a - 12F675 - Vieille version sans interruptions - (10/09/2009)
Gradateur
lumière 012a - 12F675 - Dernière version avec interruptions - (21/08/2011)
Gradateur
lumière 012b - 12F675 + 16F628 - Non disponible (préférez la version
012d)
Gradateur
lumière 012c - 18F2520 (10/09/2009)
Gradateur
lumière 012d - 16F88 (31/07/2011)
Si
vous
souhaitez recevoir par
la poste un PIC préprogrammé et prêt à
utiliser, merci de consulter la page
PIC - Sources.
Circuit(s) imprimé(s)
Uniquement réalisé pour le gradateur 012d à base de 16F88. Notez bien
que les lignes F1 à F7 de configuration de fréquence n'ont pas été
ordonnées numériquement pour faciliter le routage des pistes (on aurait
tout aussi bien pu les ordonner numériquement au niveau du circuit
imprimé et faire la tambouille nécessaire au niveau logiciel du PIC).
Typon du 31/07/2011
Typon
aux formats PDF, EPS et Bitmap 600 dpi
Corrections et remarques
21/08/2011
-
Réecriture du code logiciel de la version 012a à base de 12F675, qui
désormais fait usage d'interruption du timer0 pour une bien meilleur
tenue de route. La fréquence du signal PWM ne peut cependant toujours
pas grimper très haut et ce montage est bien si on se contente d'une
fréquence de quelques dizaines de Hz au maximum. Pour comparaison je
laisse l'ancien code qui ne faisait pas usage des interruptions.
- Retour d'expérience de Vincent L. qui a réalisé un proto de la version 012d à base de 16F88.
31/07/2011-
Correction bug configuration horloge dans montage version 012d
avec PIC 16F88. Selon le programmateur utilisé, l'oscillateur
interne du PIC pouvait ne pas démarrer à la mise sous tension.
-
J'en ai profité pour faire des tests comparatifs de valeurs de
fréquence du signal PWM selon utilisation de l'oscillateur interne 8
MHz ou d'un quartz externe 8 MHz. Avec le PIC que j'ai utilisé, très
peu de différences, moins de 1% d'écart entre les deux modes.
- Mise
à jour du typon pour y intégrer la connectique apte à recevoir les
cavaliers de configuration de fréquence du signal PWM (connecteur 2x7
broches J3).
24/07/2011
- Ajout possibilité de spécifier la fréquence du signal PWM du
gradateur 012d à base de 16F88, au moment de la mise sous tension, au
moyen de quelques cavaliers de configuration (voir texte pour détails).
17/07/2011
- Ajout version 012d à base de PIC 16F88.