Découvrez notre Chaîne YouTube "Devenir Ingénieur"

Objectifs

  • Savoir utiliser une temporisation non bloquante
  • Savoir l’importance d’une temporisation non bloquante
  • Exemple de la gestion de deux défauts
  • Etc.

Voir le tuto Arduino #42: Temporisation non bloquante pour plus de détails

Code Arduino


// Exemple: Surveillance des défauts 

#define N 2   // Déclaration de 3 Timers 
              // Nombre des Timers        1-255 (Mémoire)
              // Résolution (LSB)         4 µS
              // Précision                ~1-2 LSB
              // Résolution binaire       32 bits 
              // Tempo Max: (2^32-1)*1µs  ~71,5827882667 Minutes!

#define PinLED1 52 // MEGA 
#define PinLED2 53

unsigned long TimerX[N][4]; 
bool TimerCtrl[N][3];    

bool StateLED[2]={0,0};  
long Imax=500; 
bool Defaut1=false, Defaut2=false; 
  	
void setup() 
{
  // Définition des valeurs des tempos en µS 
  TimerX[0][0]=50000;  // 0.1s
  TimerX[1][0]=100000;  // 5s

  // Désactivions des Timers par défaut 
  for(int i=0; i<N; i++) 
  {
    TimerCtrl[i][0]=false; 
    TimerX[i][3]=0;  
  }
 
  // Sorties des LEDs 
  pinMode(PinLED1, OUTPUT); 
  pinMode(PinLED2, OUTPUT); 
 
  // Init port série 
  Serial.begin(19200); 
}

void loop() 
{
  // Activation des Tempo
  TimerCtrl[0][0]=true; quickDelay(TimerX,TimerCtrl, 0);
  TimerCtrl[1][0]=true; quickDelay(TimerX,TimerCtrl, 1);
  
  // Commande de la LED 1
  if(TimerCtrl[0][2]==true) 
  {
    // Commande de la LED 
    digitalWrite(PinLED1,StateLED[0]);

    // Inversion de l'état de la LED
    StateLED[0]=!StateLED[0]; 
  }

  // Commande de la LED 2
  if(TimerCtrl[1][2]==true) 
  {
    // Commande de la LED 
    digitalWrite(PinLED2,StateLED[1]);

    // Inversion de l'état de la LED
    StateLED[1]=!StateLED[1]; 
  }


  // Lecture des Défauts (A0, A1) 
  long I1=analogRead(A0); 
  long I2=analogRead(A1); 

  if(I1>Imax) Defaut1=true; 
  if(I2>Imax) Defaut2=true;
  
  // Surveillance des défauts  
  Serial.print(I1);  Serial.print( "\t");  
  Serial.print(I2);  Serial.print( "\t");  
  Serial.print(1023*Defaut1);  Serial.print( "\t");  
  Serial.println(1023*Defaut2);  

}




void quickDelay(unsigned long TimerX[][4],bool TimerCtrl[][3], byte NumTimer)
{
  unsigned long Time_us =TimerX[NumTimer][0];
  unsigned long t_start =TimerX[NumTimer][1];
  unsigned long t_stop  =TimerX[NumTimer][2];
  unsigned long t_val   =TimerX[NumTimer][3];
  
  bool TimerEN      =TimerCtrl[NumTimer][0];
  bool TimerIsStart =TimerCtrl[NumTimer][1];
  bool TimerState   =TimerCtrl[NumTimer][2];
  
  
  // Déclanchement du Timer  
  if((TimerEN==true) && (t_val==0))
  {
    // Lancement du Timer 
    t_start = micros(); 
    TimerIsStart=true;
    
    // Init de l'état du Timer
    TimerState=false;  
  }
  // Mise à jour de la valeur du Timer
  t_stop=micros(); 
  t_val=t_stop-t_start; 
  
  // Génération du Timer 
  if((TimerIsStart==true) && (t_val > Time_us))
  {
    TimerState = true; 
    t_val=0;  
  }

  // Arrêt du Timer
  if(TimerEN==false) 
  {
     
    t_start=0; 
    t_stop=0;
    TimerIsStart=false;
    TimerState=false; 
    t_val=0;  
  }
  // Mise à jour des valeurs du Timer 
  TimerX[NumTimer][0]=Time_us;
  TimerX[NumTimer][1]=t_start;
  TimerX[NumTimer][2]=t_stop;
  TimerX[NumTimer][3]=t_val;

  TimerCtrl[NumTimer][0]=TimerEN;
  TimerCtrl[NumTimer][1]=TimerIsStart;
  TimerCtrl[NumTimer][2]=TimerState;
} 

Accueil Arduino

Click to rate this post!
[Total: 1 Average: 5]

0 commentaire

Laisser un commentaire

Avatar placeholder

Votre adresse e-mail ne sera pas publiée.

Anti-Robot *

You have successfully subscribed to the newsletter

There was an error while trying to send your request. Please try again.

FPGA | Arduino | Matlab | Cours will use the information you provide on this form to be in touch with you and to provide updates and marketing.