Aide à propos d'un asservissement [urgent]


bonjour, j'ai efféectué un petit programme arduino pour gérer un asservissemement en position qui ne marche pas  =( je n'arrive pas à résoudre le problème. et je  ne sais pas comment m'y prendre du coup je m'adresse à vous dans l'espoir de m'aider svp.
mon programme consiste à :  
a chaque fois que j'appuie sur un bouton poussoir je passe du gain proportionnel au gain pi et à prochaine fois fois que j'appuie je passe du gain pi au gain pd ainsi de suite jusqu'à ce que j'arrive au tau2 ensuite je repasse au gain proportionnel et dès que je tourne le sélecteur rotatif je change la valeur du menu en cours (gainp, pi, pid....)
j'ai aussi des fonction gérantes la saturations et un choix du correcteur
voici une partie de mon programme.

quote

 int gainp1;   int gainp2;  int gainp3;   int tau1; int tau2;
 const byte egainp1 = 0; const byte egainp2 = 1; const byte egainp3 = 2; const byte etau1 = 3; const byte etau2 = 4;
 byte gain_p1 = 0; byte gain_p2 = 0; byte gain_p3 = 0; byte tau_1 = 0; byte tau_2 = 0;
 const unsigned long debouncedelay = 50;          //bouton debounce
 int fonc_cor1_1();int fonc_cor2_1();
 int sprop_max; int scor1_max; int scor2_max; int sprop_min; int scor1_min; int scor2_min; int scor3_min; int scor3_max;

 const int pin_diala = 5; const int pin_dialb = 6; const int pin_dialpouss = 4;

void setup(){   //sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss

   pinmode(pin_potcde,input); pinmode(pin_potretour,input);pinmode(pin_stdbydft,input);pinmode(pin_diala,input);
   pinmode(pin_dialb,input); pinmode(pin_dialpouss,input);pinmode(pin_codmota,input); pinmode(pin_codmotb,input);

 /////////////////// timer pwm timer1 (16b) config en 10bits
   tccr1a = _bv(wgm21) | _bv(wgm20);  //pwm fast (dent de scie |= triangle par defaut).
   tccr1b = _bv(cs20);  //prediv timer 1 : 1
   

 /////////////////// timer 2 : interruption
  frequencytimer2::enable();frequencytimer2::setonoverflow(topechant);frequencytimer2::setperiod(3000);  // 3ms
 // fin  timer 2
 
 /////////////////// dbg serial
  serial.begin(115200);
 /////////////////// fin_dgb

void loop(){  // ooooooooooooooooooooooooooooooooooooo loop ooooooooooooooooooooooooooooooooooo


 ///////////// bouton poussoir & selecteur //
   if (test_pouss(pin_dialpouss)){
     while (test_pouss(pin_dialpouss)){             //attendre que le bouton soit relaché
       };

       delay(debouncedelay);
       serial.println(f("debut reglage"));
       reglage();
       serial.println(f("fin reglage"));
       if (gain_p1 > 10){      
         serial.print("0");}
       if (gain_p2 > 10){
         serial.print("0");}
       if (gain_p3 > 10){
         serial.print("0");}
       if (tau_1 > 10){
         serial.print("0");}
       if (tau_2 > 10){
         serial.print("0");}
     }  ////////////// fin bouton poussoir & selecteur //
 }


/////////////////// correcteur //
 switch (ncorr){
   case 0:   // boucle ouverte
     valcdeh = consigne - 512;
     break;
   
   case 1:   // proportionnel
   
     sprop = gainp1 * epsilon;  //calcul direct
     valcdeh = sprop;  
     break;
   
   case 2:   //proportionnel derive
     if (nsat = 0)    {
       fonc_cor1();
       valcdeh = int(scor1);   
     }//conversion en entier
     else {
       fonc_cor1_1();
     }      
     break;

   case 3:   //proportionnel integral
     if (nsat = 0){
       fonc_cor2();

       valcdeh = int(scor2);   
     }//conversion en entier
     else {
       fonc_cor2_1();
     }
     break;
   default:
     valcdeh = 0;
   }

/////////////////// saturation //
 switch (nsat){
   case 0:   // sans saturation
     break;          
     case 1:   // avec saturation
     if (nsat == 1) {
       fonc_sat();
       digitalwrite(pin_ledsat,1);
 }
     break;
 }


////////// fonc_cor1***pd**** //////////
void fonc_cor1(){   //calcul de scor1 en fonction de epsilon avec gainp2 et taud2
 scor1 = gainp2 * (1+tau2*333)* epsilon - gainp2*(tau2*333) * epsilon_1 ;
}   
////////// fin fonc_cor1///////////////

////////// fonc_cor2***pi*** //////////
void fonc_cor2(){   //calcul de scor2 en fonction de epsilon avec gainp2 et taud2
 scor2 = scor2_1 + gainp2 * (1+tau2*333) * epsilon - gainp2 * epsilon_1 ;
}   
////////// fin fonc_cor2 ///////////////

////////// fonc_cor3***pid*** //////////
void fonc_cor3(){    //calcul de scor3 en fonction de epsilon avec gainp2 et taud2
 scor3 = gainp2 * (1+3/tau1+tau2*333) * epsilon - gainp2*(tau2*333) * epsilon_1 +  scor3_1;
}  
////////// fin fonc_cor3 ///////////////




voici la suite de mon programme
quote

////////// fonction permettant de lire le selecteur rotatif ///////////////
void reglage(){
 char valeur = lire_selecteur();
 byte emode = gain_p1;  // gain_p1 par défaut
 afficher(emode);

   if (test_pouss(pin_dialpouss)){                  // si le bouton été poussé
     while (test_pouss(pin_dialpouss)){             // attendre que le bouton soit relaché
     }
     delay(debouncedelay);                       // retard permettant le retour du bouton poussoir (éviter le rebond)
     emode++;                      //incrémenter de mode
     if (emode > etau2){                         //fin des modes?
       return;
     }
     afficher(emode);                              //afficher le nouveau mode
   }

     char resultat = lire_selecteur();                //lire sélecteur. retourner -1,0,1
     //serial.print("selecteur: ");
      if (resultat != 0){           //selecteur <> 0  
        // si le selecteur été tourné
        switch (emode){
        case 0:                            //mode gainp1
            gainp1 = gainp1 + resultat;                 //lire gain p1 et "rajouter le sens de rotation"
            break;                                  
        case 1:
            gainp2 = gainp2 + resultat;
            break;
        case 2:
            gainp3 = gainp3 + resultat;
            break;
        case 3:
            tau1 = tau1 + resultat;
            break;
        case 4:
            tau2 = tau2 + resultat;
            break;
        default:                                // sinon (mode inconnu)
            break;                                  // rien
          }
          afficher(emode);                         //afficher le nouveau mode
        }
 //fin !!!!!!!!!!!!!!!!!
   }
//fin ////////// fonction permettant de lire le selecteur rotatif ///////////////

void afficher(byte mode){       // afficher la valeur du mode en cours
 serial.print("mode ");
 serial.print(mode);
 serial.print(" ");
    switch (mode){     //idem ci-dessus !!!!!!!!!!!!
    case 0:
      serial.println(gain_p1);
      break;
    case 1:
      serial.println(gain_p2);
      break;
    case 2:
      serial.println(gain_p3);
      break;
    case 3:
      serial.println(tau_1);
      break;
    case 4:
      serial.println(tau_2);
      break;
    default:
      break;
  }
}
// fin  // afficher la valeur du mode en cours

// bouton = "lecture du pin"
 byte test_pouss(byte bouton) {
   if (digitalread(bouton) == high) {              // si le bouton été tourné attendre un peu pour autoriser le débounce(retard)
     delay(debouncedelay);
     return digitalread(bouton);                   // lire le bouton de nouveau et le retourner
   }
   else {                                          // si le bouton n'a pas été appuiyé pas besoin du debounce
     return low;
   }
 }
//fin // bouton = "lecture du pin"

char lire_selecteur() {   // fonction permettant de lire le selecteur rotatif ///////////////
 static byte pin_diala_inf = low;
 char edir = 0;
 byte n = digitalread(pin_diala);
 if ((pin_diala_inf == low) && (n == high)) {
   if (digitalread(pin_dialb) == low) {
     edir = -1;
     //serial.print("-1");
   }
   else {
     edir = 1;
     //serial.print("1");
   }
 }
 pin_diala_inf = n;
 //serial.println(edir);
 return edir;
}
////////// fin de la fonction permettant de lire le selecteur rotatif ///////////////

////////// fonction saturation ///////////////
void fonc_sat(){    
 if (sprop>sprop_max|| scor1>scor1_max || scor2>scor2_max || scor3>scor3_max)
 {sprop=sprop_max; scor1=scor1_max; scor2=scor2_max; scor3=scor3_max;}  
if (sprop<sprop_min|| scor1<scor1_min || scor2<scor2_min || scor3<scor3_min)
 {sprop=sprop_min; scor1=scor1_min; scor2=scor2_min; scor3=scor3_min;}
}
////////// fin fonction saturation ///////////////



Arduino Forum > International > Français (Moderators: jfs, Snootlab) > Aide à propos d'un asservissement [urgent]


arduino

Comments

Popular posts from this blog

opencv3, tbb and rasp pi 2 - Raspberry Pi Forums

small ethernet problem - Raspberry Pi Forums

Multithumb configuration params not working? - Joomla! Forum - community, help and support