1. Présentation Le Convertisseur Analogique Numérique de l'atmega16 Résolution sur 10 bits avec une non linéarité de 0.5 LSB et un offset maxi de 2 ± LSB. En prenant V AREF comme tension analogique de référence : V BIN =Partie entière de (V ANA /V AREF )x1024 Conversion par approximations successives, sélection de la fréquence de fonctionnement (de 50kHz à 200kHz typ.) Temps de conversion de 65 à 260µS selon réglage de son horloge 8 voies analogiques multiplexées sur le port A. 7 voies analogiques différentielles Possibilité de conversion en rafale ou unique Possibilité d IT sur fin de conversion Possibilité de démarrage de conversion sur ITs du comparateur analogique Possibilité de réduction du bruit 2. Tension de référence : AREF pin ou AVCC pin ou référence interne de 2.56V La broche AGND est connectée à GND. Une capa doit être placée entre AREF et AGND. AVCC doit être reliée à VCC si elle est utilisé comme référence (cas de nos maquettes). AREF est une tension de référence externe comprise entre 2.56V et VCC REFS1 REFS0 AVCC AREF 0 2.56V 1 Réference de tension AGND Registre ADMUX Ref de tension REFS1 REFS0 Plage de tension AREF 0 ou 1 0 de 2.56v à Vcc AVcc 0 1 Vcc ± 0.3v 2.56v 1 1 1
3. Sélection de la (des) voie(s) analogique(s) d entrée et gain MUX4---MUX0 ADC7 ADC6 ADC5 ADC4 ADC3 ADC2 ADC1 ADC0 Entrée simple ou Entrée différentielle positive Entrée différentielle négative Gain amplifier selection + - vers échantillonneur/ bloqueur Acquisition simple Registre ADMUX MUX 4---0 Entrée sélectionnée Sélection entrée(s) Acquisition différentielle Registre Entrée ADMUX différentielle MUX 4---0 positive Entrée différentielle négative Gain 00000 ADC0 01000 ADC0 ADC0 x10 00001 ADC1 01001 ADC1 ADC0 x10 00010 ADC2 01010 ADC0 ADC0 x200 00011 ADC3 01011 ADC1 ADC0 x200 00100 ADC4 01100 ADC2 ADC2 x10 00101 ADC5 01101 ADC3 ADC2 x10 00110 ADC6 01110 ADC2 ADC2 x200 00111 ADC7 01111 ADC3 ADC2 x200 10000 ADC0 ADC1 x1 10001 ADC1 ADC1 x1 10010 ADC2 ADC1 x1 10011 ADC3 ADC1 x1 10100 ADC4 ADC1 x1 10101 ADC5 ADC1 x1 10110 ADC6 ADC1 x1 10111 ADC7 ADC1 x1 11000 ADC0 ADC2 x1 11001 ADC1 ADC2 x1 11010 ADC2 ADC2 x1 11011 ADC3 ADC2 x1 11100 ADC4 ADC2 x1 11101 ADC5 ADC2 x1 11110 1.22v 11111 0v (GND) 2
4. Registre de configuration du CAN : ADMUX ADMUX : ADC Multiplexer Selection register (initial 00) 7 6 5 4 3 2 1 0 REFS1 REFS0 ADLAR MUX4 MUX3 MUX2 MUX1 MUX0 5. Résultat de conversion dans ADCL, ADCH : Deux présentations possibles : ADLAR = 0 MSB (2 bits : 0 et 1) ADCH LSB (8 bits) ADCL ADLAR = 1 MSB (8 bits) LSB (2 bits : 6 et 7) Avec ADLAR = 1, si 8 bits de résolution suffisent, ADCH seul est lu. Quand ADCL est lu, le registre ADCH est gelé tant qu il n a pas été lu. 6. Registre de commande et d état du CAN : ADCSRA ADCSRA: ADC Control Status register (initial 00) 7 6 5 4 3 2 1 0 ADEN ADSC ADATE ADIF ADIE ADPS2 ADPS1 ADPS0 ADEN : ADC Enable, ADC On (1), Off(0) ADSC : ADC Start Conversion. Mis à 1 pour démarrer une conversion, il est remis à 0 par le µc quand celle-ci est terminée. ADATE : ADC auto trigger enable ADIF et ADIE : ADC Interrupt flag et ADC interrupt Enable. Le flag est remis à 0 automatiquement quand l IT correspondante est servie. Il peut aussi être remis à 0 en écrivant un 1 dans ADIF. ADPS2 0 : Horloge interne du convertisseur, sous multiple de XTAL dans le rapport 1/2 (000) à 1/128 (111). 3
7. Horloge de l ADC L horloge de l ADC dépend de celle du µc. L ADC doit fonctionner entre 50 et 200kHz. Il faut adapter son horloge à celle de la CPU au moyen d un prédiviseur. Choisir typiquement 100kHz pour une conversion 10bit et jusqu à 1MHz pour une conversion sur 8 bits significatifs. ADPS2 ADPS1 ADPS0 Division 0 0 0 2 0 0 1 2 0 1 0 4 0 1 1 8 1 0 0 16 1 0 1 32 1 1 0 64 1 1 1 128 8. Démarrage d une conversion Une conversion simple débute par la mise à 1 du bit ADSC (si ADEN est à 1 ). En mettant à 1 ADATE, une interruption en provenance d un autre périphérique peut lancer une acquisition. L IT concernée est sélectionnée dans le registre SFIOR. SFIOR : Special function IO register (registre commun aux 3 timers de l ATMega 16) 7 6 5 4 3 2 1 0 ATDS2 ATDS1 ATDS0 - ACME PUD PSR2 PSR10 ATDS2 ATDS1 ATDS0 IT sélectionnée 0 0 0 Free running mode 0 0 1 Analog comparator 0 1 0 INT0 0 1 1 Timer0 COMP 1 0 0 Timer0 OVF 1 0 1 Timer1 COMPB 1 1 0 Timer1 OVF 1 1 1 Timer1 CAPT 4
9. Données diverses sur l ADC Précautions pour réduire le bruit durant une conversion : L impédance de sortie du circuit connecté à l entrée analogique doit être de 10kΩ au maximum. Le bruit doit être éliminé, si besoin par un filtre passe-bas, de la tension analogique mesurée. Pas de commutation de sorties sur le port A Filtre LC entre Vcc et Avcc Circuit imprimé avec plan de masse Mettre le µc en mode SLEEP spécial conversion : 1. bit SE de MCUCR = 1 2. bit SM1 de MCUCR = 0 3. bit SM0 de MCUCR = 1 Le µc sort du mode Sleep avec l IT de fin de conversion. Résultat théorique d une conversion Acquisition simple : Acquisition différentielle : ADC H, L = Partie entière (Vana.1024/VREF) ADC H, L = Partie entière (((VanaPOS-VanaNEG).Gain.512)/VREF)) 10. Exemples de fonctions d utilisation de l ADC /***************************************************************************/ /* CAN en acquisition simple sur Pa0 à Pa7 */ /***************************************************************************/ // ATmega16 le 05 10 03 #include <iom16v.h> // Résultat sur 10 bits dans ADCH, ADCL : ADLAR = 0 (registre ADMUX) // Résultat sur 8 bits dans ADCH : ADLAR = 1 => resolution = 8 ou 10 // Vitesse CAN (typ.100khz sur 10 bits, jusqu'à 1MHZ sur 8bits) // ADPS2 ADPS1 ADPS0 Division (registre ADCSRA) // 0 0 0 2 // 0 0 1 2 // 0 1 0 4 // 0 1 1 8 // 1 0 0 16 // 1 0 1 32 // 1 1 0 64 // 1 1 1 128 // Tension de référence AVcc = Vcc : REFS0 = 1, REFS1 = 0 (registre ADMUX) // Pas d'it sur fin d'acquisition, pas de déclenchement sur une autre IT 5
// Initialisation du CAN // --------------------- void Init_CAN (char resolution, char division) { if (resolution == 8) ADMUX = (1<<ADLAR) (1<<REFS0); else ADMUX = (1<<REFS0); switch (division) { case 4 : ADCSRA = (1<<ADPS1); case 8 : ADCSRA = (1<<ADPS1) (1<<ADPS0); case 16 : ADCSRA = (1<<ADPS2); case 32 : ADCSRA = (1<<ADPS2) (1<<ADPS0); case 64 : ADCSRA = (1<<ADPS2) (1<<ADPS1); case 128: ADCSRA = (1<<ADPS2) (1<<ADPS1) (1<<ADPS0); default : ADCSRA = 0; } ADCSRA = (1<<ADEN); // Mise sous tension du CAN } // Acquisition simple (résultat dans ADCH,L selon résolution) // ------------------ void Acana (char canal) { ADMUX &= 0xE0; // Sélection entrée ana ADMUX = canal; // (doit être en entrée HI) ADCSRA = (1<<ADSC); // Lancement de la conversion while (ADCSR&(1<<ADSC)); // Attente de fin de conversion } 6