- Qu'est-ce que ADC?
- ADC dans ARM7-LPC2148
- Broches ADC dans ARM7-LPC2148
- Registres ADC dans ARM7-LPC2148
- Registre ADxCR dans LPC2148
- ADxGDR: registre de données global ADC
- Composants requis
- Schéma
- Programmation ARM7-LPC2148 pour ADC
Dans le monde de l'électronique, il existe de nombreuses variétés de capteurs analogiques sur le marché qui sont utilisés pour mesurer la température, la vitesse, le déplacement, la pression, etc. Les capteurs analogiques sont utilisés pour produire une sortie qui change continuellement au fil du temps. Ces signaux provenant de capteurs analogiques ont tendance à être de très petite valeur, de quelques micro-volts (uV) à plusieurs milli-volts (mV), une certaine forme d'amplification est donc nécessaire. Pour utiliser ces signaux analogiques dans le microcontrôleur, nous devons convertir le signal analogique en signal numérique car le microcontrôleur ne comprend et ne traite que les signaux numériques. Ainsi, la plupart des microcontrôleurs ont une fonction importante intégrée appelée ADC (convertisseur analogique-numérique). Notre microcontrôleur ARM7-LPC2148 dispose également d'une fonction ADC.
Dans ce tutoriel, nous verrons comment utiliser ADC dans ARM7-LPC2148 en fournissant une tension variable à une broche analogique et l'afficher sur l'écran LCD 16x2 après la conversion analogique-numérique. Commençons donc par une brève introduction sur ADC.
Qu'est-ce que ADC?
Comme indiqué précédemment, ADC signifie conversion analogique-numérique et il est utilisé pour convertir les valeurs analogiques du monde réel en valeurs numériques telles que 1 et 0. Alors, quelles sont ces valeurs analogiques? Ce sont ceux que nous voyons dans notre vie quotidienne comme la température, la vitesse, la luminosité, etc. Ces paramètres sont mesurés en tant que tensions analogiques par des capteurs respectifs, puis ces valeurs analogiques sont converties en valeurs numériques pour les microcontrôleurs.
Supposons que notre plage ADC soit de 0V à 3,3V et que nous ayons un ADC 10 bits, cela signifie que notre tension d'entrée 0-3,3 Volts sera divisée en 1024 niveaux de valeurs analogiques discrètes (2 10 = 1024). Signification 1024 est la résolution pour un ADC 10 bits, de même pour une résolution ADC 8 bits sera 512 (28) et pour une résolution ADC 16 bits sera 65 536 (216). LPC2148 a la résolution de 10 bits ADC.
Avec cela, si la tension d'entrée réelle est de 0 V, l'ADC du MCU le lira comme 0 et s'il est de 3,3 V, le MCU lira 1024 et s'il se situe quelque part entre les deux, comme 1,65 v, le MCU lira 512. Nous pouvons utiliser ce qui suit formules pour calculer la valeur numérique qui sera lue par le MCU en fonction de la résolution du CAN et de la tension de fonctionnement.
(Résolution ADC / Tension de fonctionnement) = (Valeur numérique ADC / Valeur de tension réelle)
Comme par exemple si la tension de référence est de 3v:
Nous avons expliqué ADC en détail dans l'article précédent.
ADC dans ARM7-LPC2148
- Le LPC2148 contient deux convertisseurs analogique-numérique.
- Ces convertisseurs sont des convertisseurs analogiques-numériques à approximation successive de 10 bits uniques.
- Alors que ADC0 a six canaux, ADC1 a huit canaux.
- Par conséquent, le nombre total d' entrées ADC disponibles pour le LPC2148 est de 14.
- Il convertit la tension d'entrée dans la plage de (0 à 3,3 V) uniquement. Il ne doit pas dépasser 3,3V la référence de tension. Comme cela endommagera le CI et fournira également des valeurs incertaines.
Une caractéristique importante de l'ADC dans LPC2148
- Chaque convertisseur est capable d'exécuter plus de 400 000 échantillons de 10 bits par seconde.
- Chaque entrée analogique a un registre de résultat dédié pour réduire la surcharge d'interruption.
- Mode de conversion en rafale pour une ou plusieurs entrées.
- Conversion facultative sur la transition sur la broche d'entrée ou le signal de correspondance de minuterie
- Commande de démarrage globale pour les deux convertisseurs.
Vérifiez également comment utiliser ADC dans d'autres microcontrôleurs:
- Comment utiliser ADC dans Arduino Uno?
- Interfaçage ADC0808 avec microcontrôleur 8051
- Utilisation du module ADC du microcontrôleur PIC
- Tutoriel ADC Raspberry Pi
- Comment utiliser ADC dans MSP430G2 - Mesure de tension analogique
- Comment utiliser ADC dans STM32F103C8
Broches ADC dans ARM7-LPC2148
Comme indiqué précédemment, dans ARM7-LPC2148, il y a deux canaux ADC0 avec 6 broches d'entrée analogiques et ADC1 avec 8 broches d'entrée analogiques. Donc, totalement, il y a 14 broches pour les entrées analogiques. Le schéma ci-dessous montre les broches disponibles pour l'entrée analogique.
Puisque les broches d'entrée ADC sont multiplexées avec d'autres broches GPIO. Nous devons les activer en configurant le registre PINSEL pour sélectionner la fonction ADC.
Le tableau ci-dessous montre les broches de l'ADC et le numéro de canal ADC respecté dans LPC2148. AD0 est le canal 0 et AD1 est le canal 1
Broche LPC2148 |
Canal ADC Non |
P0.28 |
AD0.1 |
P0.29 |
AD0.2 |
P0.30 |
AD0.3 |
P0.25 |
AD0.4 |
P0.4 |
AD0.6 |
P0.5 |
AD0.7 |
P0.6 |
AD1.0 |
P0.8 |
AD1.1 |
P0.10 |
AD1.2 |
P0.12 |
AD1.3 |
P0.13 |
AD1.4 |
P0.15 |
AD1.5 |
P0.21 |
AD1.6 |
P0.22 |
AD1.7 |
Registres ADC dans ARM7-LPC2148
Les registres sont utilisés dans la programmation pour utiliser la fonction de conversion A / N dans LPC2148.
Vous trouverez ci-dessous une liste des registres utilisés dans LPC2148 pour la conversion A / N
1. ADCR: registre de contrôle analogique-numérique
Utilisation: Ce registre est utilisé pour configurer le convertisseur A / N dans LPC2148
2. ADGDR: Registre de données globales analogique-numérique
Utilisation: Ce registre a un bit DONE pour le convertisseur A / N et le RESULTAT de la conversion est stocké ici.
3. ADINTERN: Registre d'activation d'interruption analogique-numérique
Utilisation: Il s'agit d'un registre d'activation d'interruption.
4. ADDR0 - ADDR7: registre de données de canal analogique à numérique
Utilisation: Ce registre contient la valeur A / N des canaux respectifs.
5. ADSTAT: registre d'état analogique-numérique.
Utilisation: Ce registre contient le drapeau DONE pour le canal ADC respectif et également le drapeau OVERRUN pour le canal ADC respectif.
Dans ce didacticiel, nous n'utiliserons que les registres ADCR et ADGDR. Voyons à leur sujet en détail
Registre ADxCR dans LPC2148
AD0CR et AD1CR pour le canal 0 et le canal 1 respectivement. C'est un registre 32 bits. Le tableau ci-dessous indique les champs de bits pour le registre ADCR.
31:28 |
27 |
26:24 |
23:22 |
21 |
20 |
19:17 |
16 |
15: 8 |
7: 0 |
RÉSERVÉ |
BORD |
DÉBUT |
RÉSERVÉ |
PDN |
RÉSERVÉ |
CLKS |
ÉCLATER |
CLCKDIV |
SEL |
Voyons comment configurer des registres individuels
1. SEL: Les bits de (0 à 7) sont utilisés pour sélectionner le canal pour la conversion ADC. Un bit est alloué pour chaque canal. Par exemple, si vous définissez le Bit-0, le convertisseur analogique-numérique échantillonnera AD0.1 pour la conversion. Et régler le bit -1 fera AD0.1; de la même manière, régler le bit 7 fera la conversion pour AD0.7. L'étape importante est que nous avons PINSEL en fonction du port que nous utilisons, par exemple PINSEL0 pour PORT0 dans PLC2148.
2. CLCKDIV: Les bits de (8 à 15) sont pour Clock Divisor. Ici, l'horloge APB (horloge du bus périphérique ARM) est divisée par cette valeur plus un pour produire l'horloge requise pour le convertisseur A / N, qui doit être inférieure ou égale à 4,5 MHz car nous utilisons la méthode d'approximation successive dans LPC2148.
3. BURST: Le bit 16 est utilisé pour le mode de conversion BURST.
Réglage 1: L'ADC effectuera la conversion pour tous les canaux sélectionnés en bits SEL.
Réglage 0: désactivera le mode de conversion BURST.
4. CLCKS: Les bits de (17 à 19) trois bits sont utilisés pour sélectionner la résolution et le nombre d'horloges pour la conversion A / N en mode rafale car il s'agit du mode de conversion A / N continu.
Valeur pour les bits (17 à 19) |
Bits (précision) |
No d'horloge |
000 |
dix |
11 |
001 |
9 |
dix |
010 |
8 |
9 |
011 |
sept |
8 |
100 |
6 |
sept |
101 |
5 |
6 |
110 |
4 |
5 |
111 |
3 |
4 |
5. PDN: le bit 21 sert à sélectionner le mode de mise hors tension de l'ADC dans LPC2148.
- A / D est en mode PDN.
- A / D est en mode opérationnel
6. START: Les bits de (24 à 26) sont pour START. Lorsque le mode de conversion BURST est OFF en réglant 0, ces bits START sont utiles pour le moment de démarrer la conversion A / N. START est également utilisé pour la conversion contrôlée par front. C'est quand il y a une entrée dans la broche CAP ou MAT de LPC2148, l'A / N commence à convertir. Vérifions le tableau ci-dessous
Valeur pour les bits (24 à 26) |
Broche de LPC2148 |
Fonction de l'ADC |
000 |
Utilisé pour régler ADC en mode PDN Pas de départ |
|
001 |
Lancer la conversion A / N |
|
010 |
CAP0.2 / MAT0.2 |
Démarrer la conversion A / N sur EDGE sélectionné sur la broche 27 (montée ou descente) sur les broches CAP / MAT de LPC2148 |
011 |
CAP0.0 / MAT0.0 |
|
100 |
MAT0.1 |
|
101 |
MAT0.3 |
|
110 |
MAT1.0 |
|
111 |
MAT1.1 |
7. EDGE: Le 27ème bit est pour EDGE est utilisé uniquement lorsque le bit START contient 010-111. Il commence la conversion lorsqu'il y a une entrée CAP ou MAT, vous pouvez voir le tableau ci-dessus pour cela.
Réglage : 0 - Sur front descendant
1 - Sur le front montant
ADxGDR: registre de données global ADC
AD0GDR et AD1GDR pour le canal ADC 0 et le canal ADC 1 respectivement.
C'est un registre de 32 bits contenant le RÉSULTAT de la conversion A / N et également le bit DONE qui indique que la conversion A / N est effectuée. Le tableau ci-dessous indique les champs de bits pour le registre ADGDR.
31 |
30 |
29:27 |
26:24 |
23:16 |
15: 6 |
5: 0 |
TERMINÉ |
ENVAHI |
RÉSERVÉ |
CHN |
RÉSERVÉ |
RÉSULTAT |
RÉSERVÉ |
1. RESULTAT: Ces bits (6 à 15) contiennent le résultat de la conversion A / N pour le canal sélectionné dans le registre ADCR SEL. La valeur n'est lue qu'une fois la conversion A / N terminée et ceci est indiqué par le bit DONE.
EXEMPLE: Pour un résultat ADC 10 bits, la valeur stockée varie de (0 à 1023).
2. CHANNEL: Ces bits 24 à 26 contiennent le numéro de canal pour lequel la conversion A / N est effectuée. La valeur numérique convertie est présente dans le bit RESULT.
EXEMPLE: 000 est pour le canal ADC 0 et 001 est pour le canal ADC 1, etc.
3. OVERRUN: Le 30 e bit pour OVERRUN est utilisé en mode BURST. Lorsqu'il est défini sur 1, la valeur ADC convertie précédente est remplacée par la valeur ADC nouvellement convertie. Lorsque le registre est lu, il efface le bit OVERRUN.
4. DONE: Le 31ème bit est pour le bit DONE.
Set 1: lorsque la conversion A / N est terminée.
Set 0: Lorsque le registre est lu et ADCR écrit.
Nous avons vu les registres importants qui sont utilisés dans ADC dans LPC2148. Commençons maintenant à utiliser ADC dans ARM7.
Composants requis
Matériel
- Microcontrôleur ARM7-LPC2148
- IC régulateur de tension 3.3V
- IC régulateur de tension 5V
- Potentiomètre 10K - 2 Nos
- LED (toute couleur)
- Écran LCD (16X2)
- Pile 9V
- Planche à pain
- Connexion des fils
Logiciel
- Keil uVision5
- Outil Magic Flash
Schéma
Le tableau ci-dessous montre les connexions de circuit entre l'écran LCD et l'ARM7-LPC2148.
ARM7-LPC2148 |
Écran LCD (16x2) |
P0.4 |
RS (sélection de registre) |
P0.6 |
E (Activer) |
P0.12 |
D4 (broche de données 4) |
P0.13 |
D5 (broche de données 5) |
P0.14 |
D6 (broche de données 6) |
P0.15 |
D7 (broche de données 7) |
En savoir plus sur l'utilisation de l'écran LCD avec ARM 7 - LPC2148.
IMPORTANT: Ici, nous utilisons deux circuits intégrés de régulation de tension, un pour l'écran LCD 5 V et un autre 3,3 V pour l'entrée analogique qui peut être variée par potentiomètre.
Connexions entre le régulateur de tension 5V avec LCD et le bâton ARM7
IC régulateur de tension 5V |
Fonction Pin |
LCD et ARM-7 LPC2148 |
1. broche gauche |
+ Ve de la batterie 9V Entrée |
NC |
2. broche centrale |
- Ve de la batterie |
VSS, R / W, K de l'écran LCD GND de ARM7 |
3. broche droite |
Sortie régulée + 5V |
VDD, A de LCD + 5V d'ARM7 |
Potentiomètre avec LCD
Un potentiomètre est utilisé pour faire varier le contraste de l'écran LCD. Un pot a trois broches, la broche gauche (1) est connectée à + 5V et le centre (2) à VEE ou V0 du module LCD et la broche droite (3) est connectée à GND. On peut régler le contraste en tournant le bouton.
Connexion entre LPC2148 et potentiomètre avec régulateur de tension 3.3V
IC régulateur de tension 3.3V |
Fonction Pin |
ARM-7 LPC2148 |
1. broche gauche |
- Ve de la batterie |
Broche GND |
2. broche centrale |
Sortie régulée + 3,3 V |
Vers l'entrée du potentiomètre et la sortie du potentiomètre vers P0.28 |
3. broche droite |
+ Ve de la batterie 9V Entrée |
NC |
Programmation ARM7-LPC2148 pour ADC
Pour programmer ARM7-LPC2148, nous avons besoin de l'outil keil uVision & Flash Magic. Nous utilisons un câble USB pour programmer la clé ARM7 via le port micro USB. Nous écrivons du code en utilisant Keil et créons un fichier hexadécimal, puis le fichier HEX est flashé sur le bâton ARM7 à l'aide de Flash Magic. Pour en savoir plus sur l'installation de keil uVision et Flash Magic et comment les utiliser, suivez le lien Premiers pas avec le microcontrôleur ARM7 LPC2148 et programmez-le à l'aide de Keil uVision.
Dans ce didacticiel, nous convertissons la tension d'entrée analogique (0 à 3,3 V) en valeur numérique en utilisant ADC dans LPC2148 et affichons la tension analogique sur l'écran LCD (16x2). Un potentiomètre sera utilisé pour faire varier la tension analogique d'entrée.
Pour en savoir plus sur l'interface LCD avec le mode 4 bits ARM7-LPC2148, suivez ce lien.
Le code complet pour utiliser ADC avec ARM 7 est donné à la fin de ce tutoriel, nous en expliquons ici quelques parties.
Étapes impliquées dans la programmation LPC2148-ADC
1. Le registre PINSEL est utilisé pour sélectionner la broche de port du LPC2148 et la fonction ADC comme entrée analogique.
PINSEL1 = 0x01000000; // Sélectionnez P0.28 comme AD0.1
2. Sélectionnez l'horloge et la précision de bit pour la conversion en écrivant la valeur dans l'ADxCR (registre de contrôle ADC).
AD0CR = 0x00200402; // Définit l'opération ADC sur 10 bits / 11 CLK pour la conversion (000)
3. Démarrez la conversion en écrivant la valeur dans START bits dans ADxCR.
Ici, je l' ai écrit à 24 e bit du registre AD0CR.
AD0CR = AD0CR - (1 << 24);
4. Maintenant, nous d'avoir vérifier le bit DONE (de 31ème) correspondante ADxDRy (données ADC registre) car il passe de 0 à 1. Nous utilisons en boucle pour vérifier en permanence si la conversion est effectuée sur le bit 31ème du registre des données.
tandis que (! (AD0DR1 & 0x80000000));
5. Une fois que le bit done est mis à 1, la conversion est réussie, ensuite nous lisons le résultat à partir du même registre de données ADC AD0DR1 et stockons la valeur dans une variable.
adcvalue = AD0DR1;
Ensuite, nous utilisons une formule pour convertir la valeur numérique en tension et la stocker dans une variable nommée tension .
tension = ((adcvalue / 1023,0) * 3,3);
5. Les lignes suivantes sont utilisées pour afficher les valeurs numériques (0 à 1023) après la conversion analogique-numérique.
adc = adcvalue; sprintf (displayadc, "adcvalue =% f", adc); LCD_DISPLAY (displayadc); // Afficher la valeur ADC (0 à 1023)
6. Les lignes suivantes sont utilisées pour afficher la tension analogique d'entrée (0 à 3,3 V) après la conversion analogique-numérique et après l'étape 5.
LCD_SEND (0xC0); sprintf (valeur volt, "Tension =%. 2f V", tension); LCD_DISPLAY (valeur volt); // Affichage (tension analogique d'entrée)
7. Nous devons maintenant afficher la tension d'entrée et les valeurs numériques sur l'écran LCD. Avant cela, nous devons initialiser l'écran LCD et utiliser les commandes appropriées pour envoyer le message à afficher.
Le code ci-dessous est utilisé pour initialiser l'écran LCD
void LCD_INITILIZE (void) // Fonction pour préparer l'écran LCD { IO0DIR = 0x0000FFF0; // Définit la broche P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 comme délai de sortie_ms (20); LCD_SEND (0x02); // Initialise l'écran LCD en mode de fonctionnement 4 bits LCD_SEND (0x28); // 2 lignes (16X2) LCD_SEND (0x0C); // Affichage sur curseur désactivé LCD_SEND (0x06); // Curseur d'incrémentation automatique LCD_SEND (0x01); // Affichage clair LCD_SEND (0x80); // Première ligne première position }
Le code ci-dessous est utilisé pour afficher les valeurs sur l'écran LCD
vide LCD_DISPLAY (char * msg) // Fonction pour imprimer les caractères envoyés un par un { uint8_t i = 0; while (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0xF0) << 8)); // Envoie le quartet supérieur IO0SET = 0x00000050; // RS HIGH & ENABLE HIGH pour imprimer les données IO0CLR = 0x00000020; // RW LOW Mode d'écriture delay_ms (2); IO0CLR = 0x00000040; // EN = 0, RS et RW inchangés (c'est-à-dire RS = 1, RW = 0) delay_ms (5); IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0x0F) << 12)); // Envoie le quartet inférieur IO0SET = 0x00000050; // RS & EN HAUT IO0CLR = 0x00000020; delay_ms (2); IO0CLR = 0x00000040; delay_ms (5); i ++; } }
La fonction ci-dessous est utilisée pour créer un retard
void delay_ms (uint16_t j) // Fonction pour faire un retard en millisecondes { uint16_t x, i; pour (i = 0; i
Le code complet avec la vidéo de démonstration est donné ci-dessous.