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 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).
| 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) |
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 :
ANSELTRISIOADCON0Si 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.
ANSEL (sinon la broche reste numérique).TRISIO.ADRESH/ADRESL sans régler la justification dans ADCON1.#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); } }
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_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