Objectifs
- Savoir les spécifications du CAN
- Connaitre les registres du CAN
- Savoir changer la fréquence du CAN
- Savoir changer la tension de référence
- Savoir configurer les modes d’acquisitions
- Tout savoir sur le CAN avec des exemples pratiques!
- Développement d’une nouvelle bibliothèque avancée pour le convertisseur ADC
Datasheet ICI
Synthèse des spécifications (voir la page 365 du datasheet)
- Résolution 10 bits (0-1023)
- Erreur absolue 2.5-3 LSB
- Temps de conversion (Running Conversion) 13-260 µs (77-3.8 kHz)
- Fréquence (Single Conversion) 50-1000 kHz!!
- Bande passante analogique (entrée) 38.5 kHz
Les registres du convertisseur A/N
- Adresse Registre Page Fonction
- (0x7C) ADMUX 281 Contrôle
- (0x7B) ADCSRB 266 Contrôle
- (0x7A) ADCSRA 285 Contrôle
- (0x79) ADCH (MSB) 286 Données // 10=8+2
- (0x78) ADCL (LSB) 286 Données
Le registre ADMUX: Réf & Canal & Structure des données
Bit 7 6 5 4 3 2 1 0
REFS1 REFS0 ADLAR MUX4 MUX3 MUX2 MUX1 MUX0
ADMUX[7:6]: Configuration de la tension de référence
REFS1 REFS0 Fonction
- 0 0 AREF, Réf externe via le pin AREF
- 0 1 AVCC with external capacitor at AREF pin (Réf interne 5V)
- 1 0 Internal 1.1V Voltage Reference with external capacitor at AREF pin
- 1 1 Internal 2.56V Voltage Reference with external capacitor at AREF pin
ADMUX[5] ADLAR
- 0 ADCL <= données LSB (bits 0-7)&
ADCH <= données MSB (bits 8-9)& (mode normale) - 1 ADCL <= données LSB (bits 0-1)& (bits 7 et 8 du registres)
ADCH <= données MSB (bits 2-9)& (mode Anormale! A éviter)
ADMUX[0-4] 5 bits pour la Sélection du canal (A0, A1, …)
- 00000 => canal 0 (A0)
- 00001 => canal 1 (A1)
- 00010 => canal 2 (A2)
- 00011 => canal 3 (A3)
- …
Le registre ADCSRB: Trig & Modes
Bit 7 6 5 4 3 2 1 0
– ACME – – MUX5 ADTS2 ADTS1 ADTS0
ADCSRB[6]-ACME: Analog Comparator Multiplexer Enable (voir p.265)
0 Mode comparateur entrée (-) (AIN1) [AIN0 (+)]
1 Mode ADC (Mode normale)!!!!!!!!!!!!!!!!
ADCSRB[3]-MUX5: bits 5 pour la sélection des canaux
ADCSRB[0-2]-ADTS0-ADTS2: ADC Auto Trigger Source Selections
- 0 0 0 Free Running mode Mode par défaut, mode continu
- 0 0 1 Analog Comparator Trig externe, comparateur (AIN0, AIN1)
- 0 1 0 External Interrupt 0 Trig externe, pin
- 0 1 1 Timer/Counter0 Match A Trig interne/externe
- 1 0 0 Timer/Counter0 Overflow Trig interne/externe
- 1 0 1 Timer/Counter1 Match B Trig interne/externe
- 1 1 0 Timer/Counter1 Overflow Trig interne/externe
- 1 1 1 Timer/Counter1 Capture Event Trig interne/externe
Le registre ADCSRA: Activation & Interruption & Fréquence
7 6 5 4 3 2 1 0
ADEN ADSC ADATE ADIF ADIE ADPS2 ADPS1 ADPS0
ADCSRA[7]-ADEN: ADC Enable
ADCSRA[6]-ADSC: ADC Start Conversion
- Converssion unique: Il faut positionner le bit pour chaque lecture
- Mode continu: Positionner le bit une seule fois (25 cycles init Vs 13 cycles)
ADCSRA[5]-ADATE: ADC Auto Trigger Enable
1 Prise en compte du trig configuré dans ADCSRB[0-2]
0 Pas de trig (ADC off, valeur par défaut)
ADCSRA[4]-ADIF: ADC Interrupt Flag
Indicateur de fin de converssion (données pretes)
& géneration d’une interruption
ADCSRA[3]-ADIE: ADC Interrupt Enable
Activation de l’interruption du CAN
ADCSRA[0-2]-ADPS: ADC Prescaler Select (diviseur / fréquence)
bits Rapport de division
- 0 0 0 1/2
- 0 0 1 1/2
- 0 1 0 1/4
- 0 1 1 1/8
- 1 0 0 1/16
- 1 0 1 1/32
- 1 1 0 1/64
- 1 1 1 1/128
F_ACC=F_XTAL*Rapport de division
Exemple: L’horloge de l’oscillateur = à 4MHz
bits Rapport de division Fréquence
- 0 0 0 1/2 2 MHz (> 1MHz)
- 0 0 1 1/2 2 MHz (> 1MHz)
- 0 1 0 1/4 1 MHz (fréquence limite)
- 0 1 1 1/8 500 kHz
- 1 0 0 1/16 250 kHz
- 1 0 1 1/32 125 kHz
- 1 1 0 1/64 62 kHz
- 1 1 1 1/128 31 kHz
Fréquence réelle d’acquisition: Il faut 13 cycles d’horloge pour une seule acquisition! => FmaxReal=1MHz/13= 76.92 KHz
=> Bande analogique de 76.92/2 = 38.46 Khz !!1Mhz c’est bien mais la fréquence réelle est égale à 76.92 KHz!!Le registre ADCL & ADCH (voir la page 286)
ADCL (8 bits): LSB ANN
ADCH (8 bits): MSB
2 réponses sur « Arduino #31: Introduction au convertisseur analogique numérique (ADC) avec Arduino »
Pourriez-vous m’envoyer des exemples de code qui ont marché? car je manipule maintenant le CAN d’arduino, et je suis un peu bloqué
Bonjour, je ne sais pas si j’ai encore le code! regarde les tutos …