L'objectif de ce TD et de savoir configurer les périphériques d'une plate-forme micro-contrôleur pour la gestion du temps et l'interaction avec des signaux analogiques.
La carte Arduino UNO R3 est équipée d'un micro-controlleur Atmega328P cadencé par un oscillateur externe à 16MHz. http://www.atmel.com/images/Atmel-8271-8-bit-AVR-Microcontroller-ATmega48A-48PA-88A-88PA-168A-168PA-328-328P_datasheet_Complete.pdf
https://bvdp.inetdoc.net/files/iut/Atmega328p_timer2.pdf
L'Atmega328 dispose de 4 timers : - Timer 0 : 8-bit avec PWM - Timer 1 : 16-bit avec PWM - Timer 2/3 : 8-bit avec PWM et possibilité d'horloge externe
Dans la suite des exercices nous utiliserons le Timer 2. Ce choix s'explique en partie par le fait que le Timer 0 est déjà utilisé par l'environnement Arduino.
A l'aide de la documentation
Questions :
Le timer 2 de l'Atmega328p permet de générer des interruptions. Ces interruptions peuvent être déclenchées par :
Une fois l'interruption activée, il est nécessaire de lui associer un gestionnaire d'interruption. Le gestionnaire d'interruption est implémenté sous la forme d'une fonction :
ISR(TIMER2_COMPA_vect){ // code d'interruption }
Question :
https://bvdp.inetdoc.net/files/iut/Atmega328p_can.pdf
L'Atmega328 dispose d'un convertisseur analogique numérique à 6 canaux. Ce convertisseur est capable de convertir les données au rythme de 15ksps avec 10 bits de résolution.
Questions :
Le convertisseur de l'Atmega328 est capable de fonctionner en mode “free running”. Dans ce mode l'ADC effectue la conversion du canal sélectionné aussi rapidement que possible est génère une interruption de fin de conversion. La routine d'interruptions associée peut alors lire le résultat de la conversion sans attente.
Question :
Le convertisseur de l'Atmega est également capable de générer des conversions au rythme défini par le Timer1/0, le comparateur analogique ou une interruption externe. (voir p251, ADC auto trigger source selection).
L'Atmega328p ne dispose pas de convertisseur numérique analogique. Pour la suite des TP nous utiliserons un shield équipé d'un convertisseur TLV5637 de chez Texas Instrument.
http://www.ti.com/lit/ds/symlink/tlv5637.pdf
Ce composant est interfacé en SPI est permet de générer des tensions avec une résolution de 12bits et une référence de tension configurable. Afin de faciliter les développements nous utiliserons la librairie Tlv5637. Cette librairie met à disposition les méthodes statiques suivantes :
TLV5637(uint8_t PIN_CS_init,uint8_t REF_init) : construction et initialisation de l'objet, choix de la broche servant à la sélection du composant et du mode de tension de référence parmi:
#define REF_EXTERNAL_TLV5637 0 #define REF_1024MV_TLV5637 1 #define REF_2048MV_TLV5637 2
powerOn() : active le convertisseur
powerOff() : désactive le convertisseur
speedFast() : Utilisation du convertisseur en mode conversion rapide
speedSlow() : Utilisation du convertisseur en mode conversion “lente”
setRef(unsigned char ref) : Configuration de la référence de conversion (0
writeDACA(unsigned int val) : Ecriture de la valeur val sur la sortie A du convertisseur
writeDACB(unsigned int val) : Ecriture de la valeur val sur la sortie B du convertisseur
writeDACAB(unsigned int valA, unsigned int valB) : Ecriture simultané de valA et valB respectivement sur le canal A et sur le canal B.
Question :
A l'aides des briques logicielles définies précédemment, mettre en place le squelette du programme Arduino avec la fonction void setup(void) réalisant:
La fonction void loop(void) devra juste:
La fonction d'interruption Timer appelée à la fréquence de 2kHz devra: