Dernière mise à jour le 10/02/18

Présentation


Nous allons voir dans ce présent article que certaines broches du PIC peuvent être configurées en mode analogique et pour cela il faut bien configurer le bit AD1PCFG ainsi que le bit TRISB comme entrée.

AD1PCFG – configuration en analogique

Le PIC32MX534F064H dispose d’un total de 16 broches analogiques AN0/AN1/AN2/AN3/../AN15.
 
En ce qui concerne le MINI-32 équipé du PIC32MX534F064H n’a seulement que la moitié de broches connectées soit un total de 8 broches analogiques qui sont :
 
AN0 – Broche RB0
AN1 – Broche RB1
AN4 – Broche RB4
AN5 – Broche RB5
AN8 – Broche RB8
AN9 – Broche RB9
AN14 – Broche RB14
AN15 – Broche RB15
 
Afin de pouvoir utiliser ces broches comme un mode analogique il suffit d’agir sur le bit AD1PCFG mais comment ?Si vous désirez utiliser la broche RB0 comme en mode analogique il faut donc mettre le bit RB0 à 1. Puisque le PIC32MX534F064H dispose d’un total de 16 broches analogiques (16bit) il suffit d’écrire en binaire 00000000 00000001 soit en hexadécimal donne $0001. L’extrémité droite correspond au bit 0 (RB0), ensuite le bit 1(RB1), bit 2(RB2), etc… Il en résulte que le 4ème bit qui représente la broche RB4 sera à 1, ce qui nous donne en binaire :
00000000 00010000. soit 10 000 nous donne en hexadécimal $0010.
 
Attention !!! Il ne faut pas compter comme nous le ferons tous à partir de 1 car la première broche n’est pas « 1 » mais « 0 » !!! On prend en compte le chiffre à partir de « 0 ».
 




 
Un autre exemple pour bien assimiler, on désire avoir 3 entrées analogiques qui sont RB15/RB4 et RB2, ce qui nous donne en binaire : 10000000 00010100 soit en hexadécimal $8014. Vous allez me dire pourquoi utiliser la broche RB2 alors que celle-ci n’est pas connectée ?!! Vous avez raison cela ne sert à rien mais c’est un exemple !!! Bon ok !! Alors mettons RB0 à la place ce qui nous donne en binaire : 10000000 00010001 et en HEX (hexadécimal) $8011. C’est bien beau tout ça mais comment le coder en langage MikroPascal ? Je vais y venir et ce n’est pas compliqué, il suffit d’écrire AD1PCFG := $8011 tout simplement. puisque c’est ce registre qui permet de configurer en mode analogique

TRISB – configuration en entrée

Nous venons de voir comment configurée en mode analogique mais il reste quand même une autre chose à configurer. Oui!! Il reste les broches du PIC qui doivent être configurés comme des entrées. Le bit TRISB, qui d‘ailleurs on ne peut pas se tromper, comporte les modes analogiques AN0/AN1/…. .Ainsi, si nous voulons configurer les entrées comme des entrées analogiques, il suffit de mettre (si on reprend l’exemple précédent avec RB15/RB4/RB0 comme entrée) le port TRISB, à “1” logique les 3 entrées désirées. Nous obtenons donc en hexadécimal TRISB:= $8011. Allons maintenant mettre en pratique ce montage électronique.

ADC1_Get_Sample(x) – lecture d’une valeur analogique

Pour pouvoir lire une valeur analogique en sortie d’un potentiomètre, il faut utiliser la routine ADC1_Get_Sample(x) (x qui représente l’entrée de la broche). dans notre exemple; 3 entrées analogiques sont lues, et leurs valeurs sont stockées directement dans la variable Valeur1/Valeur2/Valeur3. La programmation en langage MikroPascal nous donne:

var
Valeur1,Valeur2,Valeur3:word; // Déclaration des 3 variables
Valeur1:=ADC1_Get_Sample(0); // Lecture de la broche RB0 et mis dans la variable Valeur1
Valeur2:=ADC1_Get_Sample(4); // Lecture de la broche RB4 et mis dans la variable Valeur2
Valeur3:=ADC1_Get_Sample(15); // Lecture de la broche RB15 et mis dans la variable Valeur3

Ces quelques lignes de codes permettent uniquement de lires les tensions analogiques et de les convertir en une valeur numérique afin que celle-ci soit stockée dans la variable “Valeur” , et par la suite de pourvoir l’exploiter plus tard… La conversion de la valeur analogique est réalisée sur 10 bits c’est-à-dire de 0 à 1023.

Conversion Anlogique Numerique (A/N)


La conversion d’une valeur analogique en numérique peut-être réalisée par une règle que nous connaisson tous “la règle de trois” ou bien le “produit en croix” ainsi pour une tension de 3,3V nous aurons une valeur numérique de 1023. Pour une tension de la moitié de la tension d’alimentation (3,3/2=1,65V) nous aurons une valeur numérique de 1023/2 soit 512. Si maintenant nous faisons l’inverse, soit pour une valeur numérique de 349, nous allons donc obtenir une tension analogique de (349*3,3)/1023 soit environ 1,13V. Pas compliqué vous ne trouvez pas?

Schéma PIC32 Entrées analogiques


Fonctionnement

Trois potentiomètres RV1, RV2, RV3. Ces potentiomètres sont raccordés sur les broches RB0/RB4/RB15 et les tensions sont lues sur ces broches qui sont toutes indépendantes et permettront d’éteindre ou d’allumer les leds par comparaison d’une tension de seuil que nous allons programmé. Cette tension de seuil sera fixée arbitrairement afin de pouvoir observer que les leds s’allumes lorsque nous dépassons cette tension de seuil. Les 3 tensions de seuils sont en valeurs numériques: 100/500/1000. Ainsi en comparant ces valeurs par rapport à celle qui est lue sur le potentiomètre, et que celle-ci est supérieure, les leds vont donc s’allumer.

Programme du PIC


Programme disponible aussi en MikroC

program PIC32_entrees_analogiques;
 
var
Valeur1,Valeur2,Valeur3:word; // Déclaration des 3 variables
 
procedure init;
begin
AD1PCFG := $7FEE; // Utilisation de l’entrée AN0/AN4/AN15 en mode analogique
TRISB := $8011; // Configuration des broches RB0/RB4/RB15 comme des entrées
LATB := $0000; // Initialise toutes les sorties du PORTB à l’état logique 0
ADC1_Init; // Initialisation du convertisseur analogique numérique (A/N)
 
TRISE := $0000; // Configuration du PORTE comme sortie
LATE := $0000; // Initialise toutes les sorties du PORTE à l’état logique 0
 
TRISF := $0000; // Configuration du PORTF comme sortie
LATF := $0000; // Initialise toutes les sorties du PORTF à l’état logique 0
 
TRISG := $0000; // Configuration du PORTG comme sortie
LATG := $0000; // Initialise toutes les sorties du PORTG à l’état logique 0
end;
 
 
begin
init;
while true do
begin
Valeur1:=ADC1_Get_Sample(0); // Lecture de la broche RB0 et mis dans la variable Valeur1
Valeur2:=ADC1_Get_Sample(4); // Lecture de la broche RB4 et mis dans la variable Valeur2
Valeur3:=ADC1_Get_Sample(15); // Lecture de la broche RB15 et mis dans la variable Valeur3
 
begin
if Valeur1>100 then LATE.0:=1 else LATE.0:=0 end;
 
 
begin
if Valeur2>500 then LATF.0:=1 else LATF.0:=0 end;
 
 
begin
if Valeur3>1000 then LATG.6:=1 else LATG.6:=0 end;
end;
end.

Prototype en vidéo



Attention erreurs avec LAT et PORT , en effet Les sorties s’actives toujours avec le registre LAT et non avec PORT!! comme vous pouvez le voir sur la vidéo je n’ai pas corrigé mais le programme oui!!

Historiques


– 10/02/18
Correction des sorties, Les sorties s’actives toujours avec le registre LAT et non PORT!!.
– 03/02/18
Première mise à disposition.