Lisez des valeurs analogiques avec le convertisseur 10 bits intégré
Le convertisseur ADC (Analog-to-Digital Converter) est un périphérique qui transforme une tension analogique continue (par exemple 0V à 5V) en une valeur numérique que le microcontrôleur peut traiter. C'est essentiel pour lire des capteurs analogiques : température, luminosité, potentiomètres, etc.
Le PIC16F683 intègre un ADC 10 bits à 8 canaux. Cela signifie qu'il peut convertir une tension en une valeur entre 0 et 1023 (2^10 - 1), avec une résolution de 5V/1024 ≈ 4.88 mV par pas.
| Registre | Fonction |
|---|---|
| ADCON0 | Contrôle : sélection du canal, démarrage conversion, activation ADC |
| ADCON1 | Configuration : format du résultat, horloge de conversion |
| ANSEL | Sélection des broches analogiques (1 = analogique) |
| ADRESH / ADRESL | Résultat de la conversion (10 bits sur 2 registres) |
| Canal | Broche | Bit ANSEL |
|---|---|---|
| AN0 | RA0 | ANS0 |
| AN1 | RA1 | ANS1 |
| AN2 | RA2 | ANS2 |
| AN3 | RA4 | ANS3 |
| AN4 | RC0 | ANS4 |
| AN5 | RC1 | ANS5 |
| AN6 | RC2 | ANS6 |
| AN7 | RC3 | ANS7 |
#include <xc.h> #define _XTAL_FREQ 4000000 unsigned int lireADC(unsigned char canal) { ADCON0 = (canal << 2); // Sélectionner le canal ADCON0bits.ADON = 1; // Activer l'ADC __delay_us(20); // Temps d'acquisition ADCON0bits.GO = 1; // Lancer la conversion while(ADCON0bits.GO); // Attendre la fin return ((ADRESH << 8) | ADRESL); // Résultat 10 bits } void main(void) { OSCCON = 0b01100000; // 4 MHz ANSEL = 0b00000001; // AN0 en analogique TRISA = 0b00000001; // RA0 en entrée ADCON1 = 0b00010000; // Fosc/8, justifié à droite unsigned int valeur; while(1) { valeur = lireADC(0); // Lire canal AN0 // valeur contient 0-1023 // 0 = 0V, 1023 = 5V // Exemple : allumer LED si tension > 2.5V if(valeur > 512) PORTAbits.RA2 = 1; else PORTAbits.RA2 = 0; __delay_ms(100); } }
Valeur ADC → Tension : Tension = (Valeur_ADC × Vref) / 1023
Tension → Valeur ADC : Valeur = (Tension × 1023) / Vref
Avec Vref = 5V (alimentation standard) :
Le LM35 délivre 10mV par degré Celsius. Avec l'ADC 10 bits et Vref = 5V :
unsigned int adc_val = lireADC(0); // Tension en mV = (adc_val × 5000) / 1023 // Température = Tension_mV / 10 float temperature = (adc_val * 5000.0 / 1023.0) / 10.0; // Ex: adc_val=51 → 249mV → 24.9°C