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.