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.
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_dgbvoid 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_Cor1PD* //////////
void fonc_Cor1(){ //calcul de sCor1 en fonction de Epsilon avec GainP2 et TauD2
sCor1 = GainP2 * (1+Tau2333) Epsilon - GainP2*(Tau2*333) * Epsilon_1 ;
}
////////// fin fonc_Cor1///////////////////////// fonc_Cor2PI //////////
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_Cor3PID //////////
void fonc_Cor3(){ //calcul de sCor3 en fonction de Epsilon avec GainP2 et TauD2
sCor3 = GainP2 * (1+3/Tau1+Tau2333) * Epsilon - GainP2(Tau2*333) * Epsilon_1 + sCor3_1;
}
////////// fin fonc_Cor3 ///////////////