Logiciels > Programmation PIC > Bases > MP > Encodeur optique

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

pic_tuto_base_encodeur_optique_001a

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.