Outils pour utilisateurs

Outils du site


td2_tns

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
td2_tns [2015/03/16 13:26]
bvandepo
td2_tns [2016/03/29 17:00] (Version actuelle)
bvandepo [Configuration du timer 2 en générateur d'interruptions]
Ligne 10: Ligne 10:
 [[http://​homepages.laas.fr/​bvandepo/​files/​iut/​Atmega328p_timer2.pdf]] [[http://​homepages.laas.fr/​bvandepo/​files/​iut/​Atmega328p_timer2.pdf]]
  
-L'Atmega329 ​dispose de 4 timers :+L'Atmega328 ​dispose de 4 timers :
  - Timer 0 : 8-bit avec PWM  - Timer 0 : 8-bit avec PWM
  - Timer 1 : 16-bit avec PWM  - Timer 1 : 16-bit avec PWM
Ligne 52: Ligne 52:
 <ifauth @prof> <ifauth @prof>
 ===Solution:​=== ===Solution:​===
 +<file cpp configtimer.cpp>​ 
 +void setupTimer2(unsigned char prescaler, unsigned int period){
   TCCR2A = 0;// set entire TCCR2A register to 0   TCCR2A = 0;// set entire TCCR2A register to 0
   TCCR2B = 0;// same for TCCR2B   TCCR2B = 0;// same for TCCR2B
   TCNT2  = 0;//​initialize counter value to 0   TCNT2  = 0;//​initialize counter value to 0
-  OCR2A = 124;+  OCR2A = period;
   // turn on CTC mode   // turn on CTC mode
   TCCR2A |= (1 << WGM21);   TCCR2A |= (1 << WGM21);
-  TCCR2B |= (1 << CS21); // config of prescaler+  TCCR2B |= prescaler & 0x7; // config of prescaler
   // enable timer compare interrupt   // enable timer compare interrupt
   TIMSK2 |= (1 << OCIE2A); ​   TIMSK2 |= (1 << OCIE2A); ​
 +}
 +</​file>​
 </​ifauth>​ </​ifauth>​
  
Ligne 68: Ligne 71:
 [[http://​homepages.laas.fr/​bvandepo/​files/​iut/​Atmega328p_can.pdf]] [[http://​homepages.laas.fr/​bvandepo/​files/​iut/​Atmega328p_can.pdf]]
  
-L'​Atmega328 dispose ​de 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.+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 :  Questions : 
Ligne 77: Ligne 80:
 <ifauth @prof> <ifauth @prof>
 ===Solution:​=== ===Solution:​===
 +<file cpp adc1.cpp>​
   void setupADCPolling()   void setupADCPolling()
   {   {
- ADCSRA ​  = 1 << ADPS2 | 1 << ADPS1 | 1 << ADPS0 | 1 << ADEN:; // div 128, enabled +        ADCSRB=0;  
-        ADMUX    = 0;  //choix entrée analogique 0 et référence de tension =VCC+ ADCSRA ​  = 1 << ADPS2 | 1 << ADPS1 | 1 << ADPS0 | 1 << ADEN; // div 128, enabled 
 +        ADMUX    = 1 << 6;  //choix entrée analogique 0 et référence de tension =VCC
   }   }
   /*! \brief ADC Conversion Routine in single ended mode */   /*! \brief ADC Conversion Routine in single ended mode */
-  ​void readADCPolling(void)+  ​unsigned int readADCPolling(void)
   {   {
 +  unsigned int result;
  ADCSRA ​ |= (1<<​ADSC);​ //​ Start ADC Conversion  ADCSRA ​ |= (1<<​ADSC);​ //​ Start ADC Conversion
  while((ADCSRA & (1<<​ADIF)) != 0x10); // Wait till conversion is complete  while((ADCSRA & (1<<​ADIF)) != 0x10); // Wait till conversion is complete
Ligne 92: Ligne 97:
        ​return result ;        ​return result ;
   }   }
 +  </​file>​
 </​ifauth>​ </​ifauth>​
 +
 +
 +
 +<ifauth @prof>
 +TODO: expliquer la décomposition en 2 fonctions
 +
 +<file cpp adc2.cpp>​
 +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////​
 +/*! \brief ADC Conversion Routine start */
 +inline void startReadADCPolling(void)
 +{
 +  ADCSRA ​ |= (1 << ADSC);​  ​       // Start ADC Conversion
 +}
 +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////​
 +/*! \brief ADC Conversion Routine wait and read */
 +inline unsigned int finishReadADCPolling(void)
 +{
 +  unsigned int result;
 +  while ((ADCSRA & (1 << ADIF)) != 0x10); // Wait till conversion is complete
 +  result ​  = ADC;                                              // Read the ADC Result
 +  ADCSRA ​ |= (1 << ADIF);​  ​       // Clear ADC Conversion Interrupt Flag
 +  return result ;
 +}
 +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////​
 +</​file>​
 +</​ifauth>​
 +
 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. 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.
  
Ligne 150: Ligne 183:
 ===== Mise en place de l'​achitecture logicielle pour le TNS ===== ===== 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 :+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 configuration de l'ADC pour effectuer des conversions sur le canal 0 en mode déclenché par logiciel (setupADCPolling()) 
 +  - la configuration du DAC TLV5637 pour générer des tensions entre 0 et 4.096v 
 +  - la configuration du timer 2 pour générer une interruption à la fréquence de 2kHz 
 +  - la configuration de l'UART matériel à 9600 bauds 
 +  - la configuration de la GPIO 8 (port B bit 0)  en sortie 
 +  - l'​initialisation du filtre 
 + 
 +La fonction **void loop(void)** devra juste:  
 +  - envoyer la chaine "Je suis vivant"​ sur l'UART matériel.
  
-  - Le timer 2 configuré pour générer une interruption à la fréquence de 2kHz +La fonction d'interruption ​Timer appelée ​à la fréquence de 2kHz devra: 
-    - la GPIO 13 sera mise à un au début du gestionnaire d'​interruption  +  mettre à 1 la GPIO 8 (port B bit 0) au début du gestionnaire d'​interruption. 
-    - la fonction ​readAdcPolling() est appelée et le résultat de la conversion stocké dans la variable sample_t +  appeler ​la fonction ​**startReadADCPolling()**. 
-    - la fonction d'​écriture sur le DAC est appelée ​avec la variable ​sample_t mise à l'échelle +  appeler ​la fonction d'​écriture sur le DAC  avec la variable ​skprec pour la voie A et eksuiv pour la voie B. 
-    - la GPIO 13 sera mise à zéro à la fin du gestionnaire d'​interruption  +  - 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 
-  - L'ADC configuré pour effectuer des conversions sur le canal 0 en mode déclenché par logiciel (setupADCPolling()) +  appeler ​la fonction **finishReadADCPolling()** et stocker le résultat de la conversion dans la variable eksuiv. 
-  - Le DAC TLV5637 configuré pour générer des tensions entre 0 et 4.96v+  - mettre ​à 0 la GPIO 8 (port B bit 0)  ​à la fin du gestionnaire d'​interruption  
 + 
td2_tns.1426508772.txt.gz · Dernière modification: 2015/03/16 13:26 par bvandepo