- ADC dans le microcontrôleur PIC PIC16F877A:
- Programmation pour ADC:
- Configuration et test du matériel:
Ceci est notre 9e tutoriel d' apprentissage des microcontrôleurs PIC utilisant MPLAB et XC8. Jusqu'à présent, nous avons couvert de nombreux didacticiels de base comme la mise en route de MPLABX, le clignotement des LED avec PIC, les minuteries en PIC, l'interfaçage LCD, l'interfaçage 7 segments, etc. Si vous êtes un débutant absolu, veuillez consulter la liste complète des didacticiels PIC ici et commencez à apprendre.
Dans ce tutoriel, nous allons apprendre comment utiliser ADC avec notre microcontrôleur PIC PICF877A. La plupart des projets de microcontrôleurs impliqueront un convertisseur analogique-numérique (ADC), car c'est l'un des moyens les plus utilisés pour lire des données du monde réel. Presque tous les capteurs tels que le capteur de température, le capteur de flux, le capteur de pression, les capteurs de courant, les capteurs de tension, les gyroscopes, les accéléromètres, le capteur de distance et presque tous les capteurs ou transducteurs connus produisent une tension analogique de 0V à 5V en fonction de la lecture des capteurs. Un capteur de température par exemple peut émettre 2,1 V lorsque la température est de 25 ° C et aller jusqu'à 4,7 lorsque la température est de 60 ° C. Afin de connaître la température du monde réel, le MCU doit simplement lire la tension de sortie de ce capteur de température et la relier à la température du monde réel. Par conséquent, ADC est un outil de travail important pour les projets MCU et permet d'apprendre comment nous pouvons l'utiliser sur notre PIC16F877A.
Consultez également nos articles précédents sur l'utilisation d'ADC dans d'autres microcontrôleurs:
- Comment utiliser ADC dans Arduino Uno?
- Tutoriel ADC Raspberry Pi
- Interfaçage ADC0808 avec microcontrôleur 8051
ADC dans le microcontrôleur PIC PIC16F877A:
Il existe de nombreux types d'ADC disponibles et chacun a sa propre vitesse et résolution. Les types de CAN les plus courants sont le flash, l'approximation successive et le sigma-delta. Le type d'ADC utilisé dans PIC16F877A est appelé en abrégé ADC ou SAR d' approximation successive. Apprenons donc un peu plus sur SAR ADC avant de commencer à l'utiliser.
ADC d'approximation successive: L'ADC SAR fonctionne à l'aide d'un comparateur et de quelques conversations logiques. Ce type d'ADC utilise une tension de référence (qui est variable) et compare la tension d'entrée avec la tension de référence à l'aide d'un comparateur et la différence, qui sera une sortie numérique, est sauvegardée à partir du bit le plus significatif (MSB). La vitesse de la comparaison dépend de la fréquence d'horloge (Fosc) sur laquelle le PIC fonctionne.
Maintenant que nous connaissons quelques notions de base sur l'ADC, ouvrons notre fiche technique et apprenons à utiliser l'ADC sur notre MCU PIC16F877A. Le PIC que nous utilisons a un ADC 10 bits 8 canaux. Cela signifie que la valeur de sortie de notre ADC sera de 0-1024 (2 ^ 10) et qu'il y a 8 broches (canaux) sur notre MCU qui peuvent lire la tension analogique. La valeur 1024 est obtenue par 2 ^ 10 puisque notre ADC est de 10 bits. Les huit broches qui peuvent lire la tension analogique sont mentionnées dans la fiche technique. Regardons l'image ci-dessous.
Les canaux analogiques AN0 à AN7 sont mis en évidence pour vous. Seules ces broches pourront lire la tension analogique. Donc, avant de lire une tension d'entrée, nous devons spécifier dans notre code quel canal doit être utilisé pour lire la tension d'entrée. Dans ce tutoriel, nous utiliserons le canal 4 avec un potentiomètre pour lire la tension analogique sur ce canal.
Le module A / N a quatre registres qui doivent être configurés pour lire les données des broches d'entrée. Ces registres sont:
• Registre haut résultat A / N (ADRESH)
• Registre bas de résultat A / N (ADRESL)
• Registre de contrôle A / N 0 (ADCON0)
• Registre de contrôle A / N 1 (ADCON1)
Programmation pour ADC:
Le programme d'utilisation de l'ADC avec le microcontrôleur PIC est très simple, il suffit de comprendre ces quatre registres et la lecture de toute tension analogique sera simple. Comme d'habitude, initialisez les bits de configuration et commençons par le void main ().
À l'intérieur du void main (), nous devons initialiser notre ADC en utilisant le registre ADCON1 et le registre ADCON0. Le registre ADCON0 a les bits suivants:
Dans ce registre, nous devons activer le module ADC en faisant ADON = 1 et activer l'horloge de conversion A / N en utilisant les bits ADCS1 et ADCS0 bits, le reste ne sera pas défini pour l'instant. Dans notre programme, l'horloge de conversion A / N est sélectionnée comme Fosc / 16, vous pouvez essayer vos propres fréquences et voir comment le résultat change. Détails complets disponibles à la page 127 de la fiche technique. ADCON0 sera donc initialisé comme suit.
ADCON0 = 0b01000001;
Le registre ADCON1 a maintenant les bits suivants:
Dans ce registre, nous devons rendre A / N Result Format Select bit high par ADFM = 1 et faire ADCS2 = 1 pour sélectionner à nouveau le Fosc / 16. Les autres bits restent nuls car nous avons prévu d'utiliser la tension de référence interne. Détails complets disponibles à la page 128 de la fiche technique. Par conséquent, ADCON1 sera défini comme suit.
ADCON1 = 0x11000000;
Maintenant, après avoir initialisé le module ADC dans notre fonction principale, entrons dans la boucle while et commençons à lire les valeurs ADC. Pour lire une valeur ADC, les étapes suivantes doivent être suivies.
- Initialiser le module ADC
- Sélectionnez le canal analogique
- Démarrez ADC en augmentant le bit Go / Done
- Attendez que le bit Go / DONE devienne bas
- Obtenez le résultat ADC à partir du registre ADRESH et ADRESL
1. Initialisez le module ADC: Nous avons déjà appris comment initialiser un ADC donc nous appelons simplement cette fonction ci-dessous pour initialiser le ADC
La fonction void ADC_Initialize () est la suivante.
void ADC_Initialize () {ADCON0 = 0b01000001; // ADC ON et Fosc / 16 est sélectionné ADCON1 = 0b11000000; // La tension de référence interne est sélectionnée}
2. Sélectionnez le canal analogique: Nous devons maintenant sélectionner le canal que nous allons utiliser pour lire la valeur ADC. Permet de faire une fonction pour cela, de sorte qu'il sera facile pour nous de décalage entre chaque canal à l' intérieur du tout en boucle.
unsigned int ADC_Read (unsigned char channel) {// **** Sélection du canal ** /// ADCON0 & = 0x11000101; // Effacement des bits de sélection de canal ADCON0 - = channel << 3; // Définition des bits requis // ** Sélection du canal terminée *** ///}
Ensuite, le canal à sélectionner est reçu à l'intérieur du canal variable. Dans la ligne
ADCON0 & = 0x1100101;
La sélection de canal précédente (le cas échéant) est effacée. Cela se fait en utilisant l'opérateur binaire et «&». Les bits 3, 4 et 5 sont forcés à être 0 tandis que les autres sont laissés à leurs valeurs précédentes.
Ensuite, le canal souhaité est sélectionné en décalant le numéro de canal trois fois vers la gauche et en définissant les bits à l'aide du bit ou de l'opérateur «-».
ADCON0 - = canal << 3; // Définition des bits requis
3. Démarrez ADC en augmentant le bit Go / Done: Une fois que le canal est sélectionné, nous devons démarrer la conversion ADC simplement en augmentant le bit GO_nDONE :
GO_nDONE = 1; // Initialise la conversion A / N
4. Attendez que le bit Go / DONE devienne bas: Le bit GO / DONE restera haut jusqu'à ce que la conversion ADC soit terminée, nous devons donc attendre que ce bit redevienne bas. Cela peut être fait en utilisant un en boucle.
tandis que (GO_nDONE); // Attendre la fin de la conversion A / N
5. Obtenez le résultat ADC à partir du registre ADRESH et ADRESL: lorsque le bit Go / DONE redevient bas, cela signifie que la conversion ADC est terminée. Le résultat de l'ADC sera une valeur de 10 bits. Comme notre MCU est un MCU 8 bits, le résultat est divisé en 8 bits supérieurs et 2 bits inférieurs. Le résultat de 8 bits supérieur est stocké dans le registre ADRESH et le résultat de 2 bits inférieur est stocké dans le registre ADRESL. Par conséquent, nous devons les additionner aux registres pour obtenir notre valeur ADC 10 bits. Ce résultat est renvoyé par la fonction comme indiqué ci-dessous:
return ((ADRESH << 8) + ADRESL); // Renvoie le résultat
La fonction complète qui est utilisée pour sélectionner le canal ADC, déclencher l'ADC et renvoyer le résultat est affichée ici.
unsigned int ADC_Read (canal de caractères non signé) {ADCON0 & = 0x11000101; // Effacement des bits de sélection de canal ADCON0 - = channel << 3; // Définition des bits requis __delay_ms (2); // Temps d'acquisition pour charger le condensateur de maintien GO_nDONE = 1; // Initialise la conversion A / N while (GO_nDONE); // Attendre la fin de la conversion A / N return ((ADRESH << 8) + ADRESL); // Renvoie le résultat}
Nous avons maintenant une fonction qui prendra la sélection de canal comme entrée et nous renverra la valeur ADC. On peut donc appeler directement cette fonction dans notre en boucle, puisque nous lisons la tension analogique du canal 4 dans ce tutoriel, l'appel de fonction sera la suivante.
i = (ADC_Read (4)); // stocke le résultat de adc dans «i».
Afin de visualiser la sortie de notre ADC, nous aurons besoin d'une sorte de modules d'affichage comme l'écran LCD ou le 7 segments. Dans ce didacticiel, nous utilisons un affichage à 7 segments pour vérifier la sortie. Si vous voulez savoir comment utiliser 7 segments avec photo, suivez le tutoriel ici.
Le code complet est donné ci-dessous et le processus est également expliqué dans la vidéo à la fin.
Configuration et test du matériel:
Comme d'habitude, simulez le code à l'aide de Proteus avant d'utiliser notre matériel, les schémas du projet sont présentés ci-dessous:
Les connexions du module d'affichage à 7 segments à 4 chiffres avec microcontrôleur PIC sont identiques à celles du projet précédent, nous venons d'ajouter un potentiomètre à la broche 7 qui est le canal analogique 4. En faisant varier le potentiomètre, une tension variable sera envoyée au MCU qui sera lu par le module ADC et affiché sur le module d'affichage à 7 segments. Consultez le didacticiel précédent pour en savoir plus sur l'affichage à 7 segments à 4 chiffres et son interface avec PIC MCU.
Ici, nous avons utilisé la même carte de microcontrôleur PIC que nous avons créée dans le didacticiel de clignotement des LED. Après vous être assuré de la connexion, téléchargez le programme dans PIC et vous devriez voir une sortie comme celle-ci
Ici, nous avons lu la valeur ADC du pot et l'avons convertie en tension réelle en mappant la sortie 0-1024 comme 0-5 volts (comme indiqué dans le programme). La valeur est ensuite affichée sur le 7 segments et vérifiée à l'aide du multimètre.
C'est tout, maintenant nous sommes prêts à utiliser tous les capteurs analogiques disponibles sur le marché, allez-y et essayez ceci et si vous avez des problèmes comme d'habitude, utilisez la section des commentaires, nous serons heureux de vous aider.