Outils pour utilisateurs

Outils du site


td2_tns

TD 2 Architecture pour le TNS : Périphériques et gestion du temps

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.

Présentation de la plateforme Arduino

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

Configuration du timer 2

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 :

  1. Quel mode de fonctionnement du Timer 2 permet de générer des événements à intervalle maîtrisé
  2. Dans ce mode fonctionnement, quels attributs du timer 2 permettent de gérer la fréquence de ces événements
  3. Proposer une configuration du timer 2 pour générer des événements à la fréquence de 16kHz et implémenter la fonction setupTimerCTC(unsigned char clk_prescaler, unsigned char period)

Configuration du timer 2 en générateur d'interruptions

Le timer 2 de l'Atmega328p permet de générer des interruptions. Ces interruptions peuvent être déclenchées par :

  1. l'overflow du compteur (passage de 0xFF à 0x00)
  2. losrque le timer atteint la valeur programmée dans OCR2A (mode compare)
  3. lorsque le timer atteint la valeur programmée dans 0CR2B (mode compare)

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 :

  1. reprendre le code de configuration précédent et ajouter la génération d'interruption pour la comparaison avec OCR2A.

Configuration et utilisation de l'ADC

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 :

  1. A l'aide de la documentation, établir la configuration de l'ADC pour une conversion du canal 0 à l'aide la référence de tension AREF (5v sur Arduino) et une horloge de conversion de 125kHz. La configuration de l'ADC sera implémentée dans la fonction *void setupADCPolling()
  2. Pour le réglage sélectionné établir la durée de conversion de l'ADC
  3. Écrire le code permettant de démarrer une conversion et lire le résultat unsigned int readADCPolling()

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 :

  1. Avec la configuration établie précédemment, à quel rythme l'ADC déclenchera t-il des conversions s'il est utilisé en mode free-running.

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).

Configuration et utilisation du DAC

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 :

  1. Proposer le code Arduino permettant de générer une rampe de 0v à 4,096v sur le canal A du TLV5637

Mise en place de l'achitecture logicielle pour le TNS

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:

  1. la configuration de l'ADC pour effectuer des conversions sur le canal 0 en mode déclenché par logiciel (setupADCPolling())
  2. la configuration du DAC TLV5637 pour générer des tensions entre 0 et 4.096v
  3. la configuration du timer 2 pour générer une interruption à la fréquence de 2kHz
  4. la configuration de l'UART matériel à 9600 bauds
  5. la configuration de la GPIO 8 (port B bit 0) en sortie
  6. l'initialisation du filtre

La fonction void loop(void) devra juste:

  1. envoyer la chaine “Je suis vivant” sur l'UART matériel.

La fonction d'interruption Timer appelée à la fréquence de 2kHz devra:

  1. mettre à 1 la GPIO 8 (port B bit 0) au début du gestionnaire d'interruption.
  2. appeler la fonction startReadADCPolling().
  3. appeler la fonction d'écriture sur le DAC avec la variable skprec pour la voie A et eksuiv pour la voie B.
  4. appliquer l'équation de récurrence du filtre en injectant l'échantillon eksuiv et en récupérant la valeur de l'échantillon de sortie skprec
  5. appeler la fonction finishReadADCPolling() et stocker le résultat de la conversion dans la variable eksuiv.
  6. mettre à 0 la GPIO 8 (port B bit 0) à la fin du gestionnaire d'interruption
td2_tns.txt · Dernière modification : 2021/02/19 21:20 de 127.0.0.1