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