Logiciels > Programmation PIC > Bases > MP > Comparateurs

Dernière mise à jour : 19/12/2010

Présentation

Les exemples décrits ici montrent comment utiliser les comparateurs d'un PIC de type 16F88, mais restent valables pour un PIC de même structure (16F628A par exemple). Outre le fonctionnement même des comparateurs, nous verrons comment faire sortir la tension de référence interne des comparateurs pour transformer une ligne d'entrée / sortie logique en une sortie analogique (fonction convertisseur numérique / analogique).

Qu'est-ce qu'un comparateur ?

Un comparateur est un élement électronique qui possède deux entrées individuelles - une entrée non-inverseuse marquée [+] et une entrée inverseuse marquée [-] - et une sortie unique. Les deux entrées sont comparées en permanence et selon la valeur de la tension appliquée sur chacune de ces deux entrées, la sortie du comparateur est à l'état logique haut ou à l'état logique bas. Les tensions en entrée peuvent correspondre à des états logiques bas ou haut, mais peuvent aussi prendre toute valeur entre ces deux extrêmes (valeurs analogiques). Par contre la sortie sera toujours soit à l'état bas soit à l'état haut et sera de type logique tout ou rien. Le schéma qui suit montre quelques exemples de comportement d'un comparateur en fonction des tensions appliquées sur ses entrées.

base_comparateurs_tension_001a

Pas très difficile à comprendre. Subsiste juste une ombre quand les deux entrées se voient appliquer le même potentiel de tension. Laquelle dans ce cas est la plus forte ? Et bien aucune. Dans cette condition particulière, la sortie du comparateur tremblote entre les deux extrêmes car en plus de la tension appliquée sur les entrées, il existe toujours un petit bruit aléatoire qui s'y additionne et qui est propre aux composants électroniques. Il est donc impossible en pratique d'avoir exactement la même tension en même temps sur les deux entrées pendant une longue durée. Ce petit côté aléatoire n'est pas spécifique aux comparateurs de tension, on le connait aussi pour d'autres circuits et notamment avec les circuits logiques TTL et CMOS quand on se trouve au seuil de basculement des entrées.

Utilisation de base des comparateurs du PIC

Le PIC 16F88 intègre deux comparateurs de tension appelés C1 et C2. Ces deux comparateurs peuvent fonctionner selon huit configurations différentes définies par l'état logique donné à trois bits de configuration qui sont CM0, CM1 et CM2. Ces trois bits de configuration sont accessibles via le registre CMCON.

Mode CM2 CM1 CM0 Mode de fonctionnement des comparateurs
0 0 0 0 Reset des comparateurs, la sortie de chaque comparateur est à 0.
1 0 0 1 Utilisation de l'entrée [-] du comparateur C1 en mode multiplexé : routage entrée [-] vers broche RA0 si CIS = 0 ou vers RA3 si CIS ) 1. Utilisation du comparateur C2 en mode standard. Les entrées [+] des deux comparateurs C1 et C2 sont reliées ensemble et accessibles via la broche RA2
2 0 1 0 Utilisation des entrées [-] en mode multiplexé, avec application d'une tension de référence interne Vref sur la broche [+] des deux comparateurs. Les entrées [-] sont routées soit vers RA0 et RA1 si CIS = 0, soit vers RA3 et RA2 si CIS = 1.
3 0 1 1 Les entrées [+] des deux comparateurs C1 et C2 sont reliées ensemble et accessibles via la broche RA2, les entrées [-] sont accessibles via les broches RA0 et RA1. La broche RA3 n'est dans ce cas pas utilisée pour les comparateurs et peut être utilisée en mode numérique.
4 1 0 0 Les deux comparateurs C1 et C2 fonctionnenet de façon totalement indépendante. Accès aux entrées des comparateurs via les broches RA0 et RA3 pour C1, et RA1 et RA2 pour C2.
5 1 0 1 Seul le comparateur C2 est activé avec ses entrées accessibles via les broches RA1 et RA2. Le comparateur C1 est désactivé et les broches RA0 et RA3 peuvent être utilisée en mode numérique.
6 1 1 0 Dans ce mode les sorties des comparateurs sont rendues accessibles de l'extérieur : la sortie du comparateur C1 est routée vers la broche RA3 etla sortie du comparateur C2 est routée vers la broche RA4.
7 1 1 1 Les deux comparateurs C1 et C2 sont désactivés, leur sortie est positionnée à OFF (état logique bas).

Important ! quand les comparateurs C1 et C2 ne sont pas utilisés, il faut impérativement spécifier le mode 7 pour libérer totalement les lignes RA0 à RA3.

CMCON := 7 ou CMCON := %00000111 ou CMCON := $07


Si vous ne le faites pas, les lignes RA0 à RA3 ne fonctionneront pas toutes correctement quand vous essayerez d'y accéder en entrée / sortie numérique.

Comparaison de deux tensions externes

Vous voulez comparer deux tensions qui viennent de l'extérieur du PIC. Pour mettre en pratique ce besoin, nous partons de l'hypothèse que nous disposons d'une part d'une source de tension ajustable de façon continue entre 0 V et +5 V fournie par un potentiomètre (tension V1), et d'autre part d'une source de tension dont la valeur dépend de l'éclairement d'une LDR (photorésistance) montée dans un pont diviseur de tension. Nous voulons que la sortie du comparateur soit directement accessible sur une des lignes d'entrée / sortie du PIC et que cette sortie alimente une LED pour visualiser son état en cours. Le résultat final consiste à allumer la LED seulement quand la LDR reçoit de la lumière. Tout cela est résumé dans le schéma qui suit.

pic_tuto_base_comparateurs_001a

La LED D1 est reliée à la sortie RA3/C1OUT et visualise l'état de la sortie du comparateur C1 dont la sortie est reliée à cette broche. Quand RA3 est activée (sortie comparateur C1 à l'état haut) la LED s'allume. Quand RA3 est désactivée (sortie comparateur C1 à l'état bas) la LED s'éteint. La tension V1 appliquée à l'entrée [-] du comparateur C1 via la broche RA0 vient du curseur du potentiomètre RV1, qui sur le schéma est montré en position centrale (tension V1 égale à +2,5 V). La tension V2 appliquée à l'entrée [+] du comparateur C1 via la broche RA2 vient du pont diviseur constitué de R1 et de la LDR. La tension V2 dépend du taux d'éclairement de la LDR, sa valeur est plus élevée quand la LDR est plus éclairée. Le fonctionnement est donc très simple : si la LDR n'est pas suffisemment éclairée, la tension V2 est inférieure à la tension V1 et la sortie du comparateur C1 est à l'état bas. La LED D1 est alors éteinte. Si la LDR est suffisemment éclairée, la tension V2 est supérieure à la tension V1 et la sortie du comparateur C1 bascule à l'état haut, faisant s'allumer la LED D1. La programmation du PIC nécessaire pour obtenir ce fonctionnement est vraiment simple, pour preuve le nombre de lignes requises pour la totalité du code source qui suit.

program electronique_pic_tuto_base_comparateurs_001a;

procedure Main_Init;
begin
CMCON := %00000110; // CMCON = 6 -> use comp with C1 output wired to RA3
TRISA := %11110111;
TRISB := $00;
INTCON := $00;
OPTION_REG := 0;
OPTION_REG.NOT_RBPU := 1; // disable pullup
ANSEL := $00; // all inputs as digital I/O
end;

begin
Main_Init;
while true do
begin
nop;
end;
end.


Ce programme ne fait rien d'autre que configurer le mode de fonctionnement des comparateurs, c'est pourquoi il ne se passe rien dans la boucle while situé dans la procédure principale. Il va de soi qu'on ne va pas s'amuser à utiliser un PIC pour une fonction aussi basique que pourrait remplir un comparateur de tension "autonome" tel le LM311. L'idée est juste de montrer où se situent les lignes de code à traiter. Si le programme du PIC doit tester l'état de la sortie du comparateur et s'il doit réagir en conséquence, il faudra sans doute lire la sortie du comparateur en interne et ne pas la rendre disponible à l'extérieur comme c'est fait ici au travers de la broche RA3. Surtout si on doit économiser les broches d'entrée / sortie.

Comparaison d'une tension externe avec une tension de référence interne

Plutôt que d'utiliser une broche externe du PIC pour "entrer" une tension de seuil, on peut utiliser une tension de référence produite en interne du PIC grâce à un convertisseur numérique / analogique (basique) intégré. On ne monopolise ainsi qu'une seule broche du PIC pour obtenir un fonctionnement et un résultat similaire. Le schéma qui suit diffère du précédent par l'absence du potentiomètre ajustable RV1 qui servait à fournir une tension de référence externe.

pic_tuto_base_comparateurs_001b

La LED D1 est toujours connectée à la broche RA3 mais cette fois cette broche RA3 n'est plus connectée à la sortie du comparateur C1. Ce qui signifie que pour allumer la LED il faut aller lire la valeur de l'état du comparateur, ce qui est fait dans une boucle tournant sans fin. Le programme devient ainsi un peu plus actif.

program electronique_pic_tuto_base_comparateurs_001b;

procedure Main_Init;
begin
CMCON := %00000010; // CMCON = 2 -> use comp with internal voltage reference
CVRCON := 0;
CVRCON.CVREN := 1; // enable internal voltage reference (Vref)
CVRCON.CVROE := 1; // export internal Vref to RA2
CVRCON.CVRR := 1;
CVRCON.CVR3 := 0;
CVRCON.CVR2 := 1;
CVRCON.CVR1 := 1;
CVRCON.CVR0 := 0;
TRISA := %11110111;
TRISB := $00;
INTCON := $00;
OPTION_REG := 0;
OPTION_REG.NOT_RBPU := 1; // disable pullup
ANSEL := $00; // all inputs as digital I/O
ANSEL.ANS2 := 1;
end;

begin
Main_Init;
while true do
begin
PORTA.3 := not CMCON.C1OUT;
end;
end.


La ligne CVRCON.CVROE permet de router la tension de référence interne au PIC sur sa broche RA2 et d'en disposer en externe. A noter que pour que cela fonctionne, l'entrée RA2 doit être configurée en tant qu'entrée et non en tant que sortie. L'exploitation de cette tension analogique doit impérativement se faire via un buffer dont l'impédance d'entrée est élevée. Un AOP monté en suiveur de tension convient très bien pour ça.