Electronique > Réalisations > Jeux de lumières > Gradateur de lumière 012

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.

gradateur_lumiere_012d_pcb_3d_a

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é.

gradateur_lumiere_012a

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...

gradateur_lumiere_012b

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...

gradateur_lumiere_012c

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.

gradateur_lumiere_012d

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.

gradateur_lumiere_012d_conf_freq_000 gradateur_lumiere_012d_conf_freq_jumpers

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 Hz
Pour 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.

gradateur_lumiere_012d_conf_freq_001

Exemple N°2  - Fréquence désirée = 2000 Hz
Pour 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.

gradateur_lumiere_012d_conf_freq_002

Exemple N°3  - Fréquence désirée = 15000 Hz
Pour 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.

gradateur_lumiere_012d_conf_freq_003

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.

gradateur_lumiere_012d_proto_001a gradateur_lumiere_012d_graphe_001a

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).

gradateur_lumiere_012d_proto_vl_001a gradateur_lumiere_012d_proto_vl_001b

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).

gradateur_lumiere_012d_pcb_composants
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.