📊 Qu'est-ce qu'un convertisseur ADC ?

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.

🔧 Configuration de l'ADC

Registres principaux

RegistreFonction
ADCON0Contrôle : sélection du canal, démarrage conversion, activation ADC
ADCON1Configuration : format du résultat, horloge de conversion
ANSELSélection des broches analogiques (1 = analogique)
ADRESH / ADRESLRésultat de la conversion (10 bits sur 2 registres)

Canaux ADC disponibles

CanalBrocheBit ANSEL
AN0RA0ANS0
AN1RA1ANS1
AN2RA2ANS2
AN3RA4ANS3
AN4RC0ANS4
AN5RC1ANS5
AN6RC2ANS6
AN7RC3ANS7

📝 Exemple : Lire un potentiomètre sur AN0

C (XC8)
#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);
    }
}

🧮 Conversion tension ↔ valeur ADC

Formules de conversion

Valeur ADC → Tension : Tension = (Valeur_ADC × Vref) / 1023

Tension → Valeur ADC : Valeur = (Tension × 1023) / Vref

Avec Vref = 5V (alimentation standard) :

  • Valeur 0 = 0V
  • Valeur 512 ≈ 2.5V
  • Valeur 1023 = 5V
  • Résolution : 5V / 1024 ≈ 4.88 mV par pas

🌡️ Application : Capteur de température LM35

Le LM35 délivre 10mV par degré Celsius. Avec l'ADC 10 bits et Vref = 5V :

Calcul température
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