📊 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 PIC12F683 intègre un ADC 10 bits. Selon la configuration, tu peux utiliser des entrées analogiques sur certaines broches (typiquement AN0 à AN3).

Un ADC 10 bits convertit une tension en une valeur entre 0 et 1023, avec une résolution d’environ Vref / 1024 (ex : 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)

Entrées analogiques (ANx) sur PIC12F683

Sur le PIC12F683, les entrées analogiques (ANx) sont associées à certaines broches GPx. Le choix exact dépend du mapping du datasheet, mais la logique est toujours la même :

💡 Astuce

Si tu veux, je te mets un tableau “ANx → GPx” exact, mais il faut que tu me confirmes ton boîtier (DIP-8) et ta version de datasheet (Microchip). Sinon je préfère rester 100% sûr.

⚠️ Erreurs fréquentes

  • Oublier d’activer le canal dans ANSEL (sinon la broche reste numérique).
  • Oublier de mettre la broche en entrée via TRISIO.
  • Lire ADRESH/ADRESL sans régler la justification dans ADCON1.

📝 Exemple : Lire un potentiomètre sur AN0

C (XC8)
#include <xc.h>
#define _XTAL_FREQ 4000000

// Exemple PIC12F683 : lecture ADC sur AN0 (broche liée à GP0 selon config)
// LED sur GP2 (sortie)

static unsigned int lireADC_AN0(void) {
    // Sélection canal AN0 (CHS = 0) + ADC ON
    ADCON0bits.CHS = 0;
    ADCON0bits.ADON = 1;

    __delay_us(20);          // temps d'acquisition

    ADCON0bits.GO_nDONE = 1;  // start
    while(ADCON0bits.GO_nDONE);

    return ((ADRESH << 8) | ADRESL); // 10 bits (justif. droite)
}

void main(void) {

    // Tout en numérique sauf AN0
    ANSEL = 0b00000001;   // AN0 activé

    // Recommandé : désactiver comparateurs
    CMCON0 = 0b00000111;

    // GP0 en entrée (AN0), GP2 en sortie (LED), GP3 entrée
    TRISIO = 0b00001001;

    GPIO = 0;

    // ADCON1 : résultat justifié à droite + horloge ADC (ex : Fosc/8)
    ADCON1 = 0b00100000;

    unsigned int valeur;

    while(1) {
        valeur = lireADC_AN0();

        // LED ON si > ~2.5V (512)
        if(valeur > 512) GPIObits.GP2 = 1;
        else            GPIObits.GP2 = 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_AN0();
// 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