Dernière mise à jour :
07/09/2009
Présentation
Les exemples donnés ici montrent
comment utiliser un encodeur optique avec un PIC de type 16F628A, dans
l'environnement MikroPascal. Avant de lire cette page, je vous
conseille de
commencer avec les pages
PIC -
Bases
- Configuration minimale
et
PIC
-
Bases
- Lecture boutton si ce n'est déjà fait.
Qu'est-ce qu'un encodeur optique ?
Pour plus d'infos concernant l'encodeur optique, se reporter à la page
Encodeur
optique.
Exemple de code pour encodeur en quadrature
Avant de commencer,
précisons que le code proposé un peu plus loin s'appuie sur le schéma
électronique suivant, lequel montre le câblage de deux encodeurs
optiques ENC1 et ENC2 avec sorties A et B en quadrature, mais que pour
des raisons de simplification, le code relatif à l'encodeur ENC2 ne
sera pas montré.
L'encodeur
ENC2 nécessite des résistances de rappel au +5 V, alors
que l'encodeur ENC1 nécessite des résistances de rappel
à la masse (ce point est précisé dans les
documents des fabricants, qu'il faut toujours consulter). Les valeurs
de résistance
indiquées sur le schéma ne sont pas forcement celles
qu'il faut utiliser, c'est juste pour le principe. Les sorties A et B
de l'encodeur ENC1 sont reliées sur les lignes RB6 et RB7, les
sorties A et B de l'encodeur ENC2 sont reliées sur les lignes
RB4 et RB5, ces quatre lignes du port B (RB4 à RB7) étant configurées
en entrée. La ligne RA0 est configurée
en sortie et sert à alimenter une led qui indique le sens de
rotation du dernier encodeur manoeuvré.
Le code logiciel
Le code qui suit est fort similaire à celui utilisé dans mon
alimentation
ajustable 014c. Je ne l'ai pas inventé, je l'ai
trouvé sur le forum de Mikroe. Les données issues des sorties des
encodeurs 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.
Rappel : le
code relatif à l'encodeur ENC2 n'est pas montré dans l'exemple qui
suit, dans un but de clarification.
procedure Interrupt;
begin
if TestBit(INTCON, RBIF) = 1 then
begin
New := (PORTB and %11000000);
if New <> Old then
begin
bInc := (New.7 xor Old.6);
bValueChanged := true;
Old := New;
end;
ClearBit(INTCON, RBIF);
end;
end;
begin
while true do
begin
Delay_ms(1);
if bValueChanged then
begin
if bInc then
begin
PORTA.0 := true; // led D1 allumée
inc(Value); // augmentation valeur
end
else
begin
PORTA.0 := false; // led D1 éteinte
dec(Value); // diminution valeur
end;
bValueChanged := false;
end
else
nop;
end;
end;
Pour obtenir ce que l'on veut, c'est à dire savoir dans quel sens
l'encodeur est manoeuvré, il faut comparer l'état des sorties A et B en
cours, avec l'état de ces mêmes sorties A et B lors la précédente
analyse (interruption). C'est pourquoi l'état des sorties est rangé en
deux endroits différents : dans la variable New pour la valeur en
cours, et dans la variable Old pour garder en mémoire l'état en cours
lors de l'analyse suivante. New et Old
sont toutes deux des
variables de type Byte (octet), desquelles on n'exploite que deux bits
sur les huit qu'elles contiennent : bits N° 6 et N° 7. Ces deux bits
correspondent aux deux fils A et B du port B. Pour l'encodeur ENC2, ce
sont les deux bits N° 4 et N° 5 qui sont exploités. Notez que vous
pouvez tout aussi bien utiliser plusieurs variables séparées de type
Boolean.
Remarque :
la routine Interrupt doit contenir le minimum de code possible pour un
fonctionnement correct. C'est pourquoi dans cette dernière on se
contente de regarder ce qui s'est passé (ce qui a
déclanché l'interruption du PIC), et que les actions
"visibles" sont plutôt traitées dans le corps principal du
programme.