Electronique > Réalisations > Alimentations > Alimentation ajustable 014c

Dernière mise à jour : 07/09/2009

Caractéristiques principales

Sortie : Tension 0 V à +5 V, ou PWM 0 à 100 %
Courant : -
Régulée : -

Présentation

La présente réalisation permet de disposer d'un signal PWM ou d'une tension dont la valeur est commandée de façon numérique, grâce à l'emploi de deux encodeurs optiques pouvant être manoeuvrés de façon individuelle ou simultanée. J'ai eu l'idée de cette réalisation suite à une demande d'un internaute réalisant un "clone" de cockpit d'un boeing 737, désireux de pouvoir ajuster la luminosité de ce dernier (éclairage assurée par 160 leds) à partir de deux commandes distinctes (un premier potentiomètre pour le pilote et un second potentiomètre pour le copilote). L'ajustage d'une tension de sortie avec un LM317 et un seul potentiomètre est très simple (c'est ce qu'il a fait pour commencer), mais avec deux potentiomètres, c'est une tout autre histoire. Il faut en effet que l'action d'un potentiomètre puisse prendre la relève de l'autre, sans tenir compte de la dernière manoeuvre effectuée par ce dernier. Imaginez simplement que le premier potentiomètre est en butée (d'un côté ou de l'autre) et que l'autre potentiomètre est au centre. Pas facile, n'est-ce pas ? J'ai cherché un peu, mais il me semble qu'il n'existe pas de solution "analogique" simple. Je suis quasiment sûr que celà est réalisable, mais avec des moyens tels que l'emploi d'un microcontrôleur avec des encodeurs optiques me semblait apparement justifié. D'autant plus qu'il s'agissait pour moi d'une découverte, n'ayant eu au préalable aucune expérience avec les encodeurs optiques.

Schéma

Il met en oeuvre deux encodeurs optiques et un microcontrôleur PIC 16F628A, associé à un réseau de résistance R/2R pour la conversion numérique / analogique si le mode PWM n'est pas utilisé. 

alim_ajust_014c

Modes de fonctionnement
Ce montage peut fonctionner de deux façons différentes, selon la position du cavalier JP2 / Mode relié à la broche RA5 du PIC : soit il délivre une tension continue comprise entre 0 V et +5 V, soit il délivre un signal PWM de rapport cyclique compris entre 0 % et 100 %.
- RA5 = 0 (JP2 côté masse) > Mode tension analogique sur connecteur de sortie J1, Vout comprise entre 0 V et +5 V.
- RA5 = 1 (JP2 côté +5 V) > Mode PWM sur connecteur de sortie J2, rapport cyclique compris entre 0 % et 100 %.
Dans les deux cas, les valeurs min et max sont obtenues grâce à la manoeuvre des encodeurs optiques (ou d'un seul).

Tension de sortie analogique Vout
RA5 = 0 (JP2 côté masse), résistances R1 à R16 à mettre en place
La tension de sortie Vout, qui aboutit sur le connecteur J1 / Vout est fournie par le PIC et son réseau R/2R constitué des seize résistances R1 à R16 servant de convertisseur numérique / analogique (CNA) 8 bits. Cette tension peut grosso-modo évoluer entre 0 V et +5 V. Pour utiliser cette tension Vout comme tension de référence ou pour l'amplifier en tension ou en courant, merci de vous reporter au schéma et au texte de l'alimentation ajustable 014.

Sortie PWM
RA5 = 1 (JP2 côté +5 V), résistances R1 à R16 non nécessaires
Dans ce mode, le circuit délivre un signal PWM sur la broche RB3/CCP1 du PIC, qui aboutit directement au connecteur de sortie J2.

Encodeurs optiques
Les données issues des sorties A et B de chacun des encodeurs optiques sont analysées à chaque fois que l'une d'entre elles au moins change d'état logique. Tout le travail d'analyse est effectué dans la routine Interrupt du programme du PIC.

procedure Interrupt;
begin
if TestBit(INTCON, RBIF) = 1 then
begin

// first optical encoder
New1 := (PORTB and %11000000);
if New1 <> Old1 then
begin
Tmp1 := New1.7;
Tmp2 := Old1.6;
bUp := (Tmp1 xor Tmp2);
if bUp then
//if (New1.7 xor Old1.6) = 1 then // work in MP V8, don't work in MP pro V2.50
bInc := true
else
bInc := false;
bValueChanged := true;
Old1 := New1;
end;

// second optical encoder
New2 := (PORTB and %00110000);
if New2 <> Old2 then
begin
Tmp1 := New2.5;
Tmp2 := Old2.4;
bUp := (Tmp1 xor Tmp2);
if bUp then
//if (New2.5 xor Old2.4) = 1 then // work in MP V8, don't work in MP pro V2.50
bInc := true
else
bInc := false;
bValueChanged := true;
Old2 := New2;
end;

ClearBit(INTCON, RBIF);
end;
end;

begin
Main_Init;
Value_Load; // load last used Value from EEProm
while true do
begin
Delay_ms(1);
if bValueChanged then
begin
if bPWM = 1 then
PORTB.0 := bInc;
if bInc then
begin
if iValue < 255 then
inc(iValue);
end
else
begin
if iValue > 0 then
dec(iValue);
end;
bValueChanged := false;
if bPWM = 1 then
Value_Set_PWM(iValue)
else
Value_Set_Vout(iValue);
Value_Save;
end
else
nop;
end;
end;


Remarque : le code dédié au deuxième encodeur optique est rigoureusement identique au code dédié au premier, l'unique différence réside dans la surveillance des entrées du PIC qui correspondent aux sorties A et B de chacun (se reporter au code source fourni pour voir la totalité du code) :
- RB6 et RB7 pour l'encodeur ENC1
- RB4 et RB5 pour l'encodeur ENC2
Voir aussi page PIC - Bases - Encodeur optique.

Montée en tension progressive et sauvegarde de la valeur de la tension de référence
Merci de vous reporter au schéma et au texte de l'alimentation ajustable 014, c'est la même chose ici et là-bas, hormis le fait qu'ici cela fonctionne aussi avec la sortie PWM.

Transformation en générateur de courant programmable
Il est possible d'utiliser la tension de sortie analogique Vout pour produire un courant qui lui est proportionnel, voir page Alimentation ajustable 014b pour un exemple d'adaptation.

Logiciel du PIC

Code source (format MikroPascal Pro V2.50) et fichier binaire compilé *.hex disponible dans l'archive suivante.
Alimentation ajustable 014c - 16F628A (06/09/2009)
Si vous souhaitez recevoir par la poste un PIC préprogrammé et prêt à utiliser, merci de consulter la page PIC - Sources.

Prototype

Réalisé sur plaque d'expérimentation sans soudure, en liaison directe avec les ports A et B du PIC positionné sur ma carte EasyPic4.

alim_ajust_014c_proto_001a alim_ajust_014c_proto_001b

Les essais ont été effectués avec deux types d'encodeurs, un de faible résolution cranté de marque Grayhill, et un de plus haute résolution souple (non cranté) de marque Copal. Le premier nécessitait des résistances de rappel (10 kO) vers le +5 V, le second nécessitait des résistances de rappel (2,2 kO) vers la masse.

encodeurs_optiques_bases_000ab encodeurs_optiques_bases_000ac encodeurs_optiques_bases_000ac2

Dans un premier temps, et pour le déverminage du logiciel du PIC, je n'ai utilisé qu'un seul encodeur. Cela fonctionnait bien. Puis j'ai ajouté le second encodeur, dans un premier temps de même type que le premier (deux Grayhill), et dans un deuxième temps différent du premier (un Grayhill et un Copal).

alim_ajust_014c_proto_001c alim_ajust_014c_proto_001d

Et là, je me suis pris quelques heures de boulot dans les dents, ça faisait n'importe quoi. La sortie PWM "montait" doucement au début et ça se mettait à fond d'un seul coup, sans possiblité de redescendre ensuite. J'ai vérifié à l'oscilloscope (numérique) que les données issues des encodeurs étaient correctes (bon niveau et pas trop de parasites), et tout semblait aller de ce côté.

encodeurs_optiques_graphe_001a encodeurs_optiques_graphe_002a encodeurs_optiques_graphe_002b

J'en ai déduit qu'il s'agissait d'un problème non pas matériel mais logiciel, et j'ai posté un petit message sur le site de Mikroe (éditeur de MikroPascal). J'ai obtenu de l'aide de vrais professionnels qui m'a permis de continuer dans la journée. Au final, un fonctionnement correct avec les deux types d'encodeurs, mais avec quelques soubressauts tout de même avec l'encodeur à haute résolution quand on le fait tourner trop vite (le PIC dans ce cas n'arrive plus trop à suivre). Pour permettre un fonctionnement correct même à vitesse importante, il faudrait faire tourner le PIC à 20 MHz au lieu de 8 MHz. Mais dans le cas présent et pour l'usage prévu, pas la peine, il suffit de choisir un encodeur de "faible" résolution. Ca tombe bien, ce type d'encodeur est moins cher.

Circuit imprimé

Non réalisé.