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.

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_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 ///////////////

Voici la suite de mon programme

////////// 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 a é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 a é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 a é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 ///////////////

Salut,

As2ad:
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.

Le problème c'est que juste en disant " j'ai un problème" ça va être dur de t'aider. On ne sait absolument pas ce qui déconne !

Merci pour ta réponse, le problème c'est que quand j'appuis sur le bouton poussoir il ne se passe rien, je n'arrive pas non plus à changer les valeurs du menu en cours. et je ne vois pas du tout où est-ce que j'ai commis l'erreur.

Dans la fonction Test_Pouss() il n'est pas évident que le delay(debounceDelay); fasse correctement le boulot.
Un serial.print() permettrait de voir ce qui s'y passe.

Christian_R:
Dans la fonction Test_Pouss() il n'est pas évident que le delay(debounceDelay); fasse correctement le boulot.
Un serial.print() permettrait de voir ce qui s'y passe.

Justement rien ne s'affiche sur le moniteur à part d'autres valeurs d'autres fonctions du programme je n'arrive pas à avoir les valeurs du menu en cours sur le moniteur

remplacer provisoirement l'appel de la fonction Afficher(eMode);
par un simple Serial.print(eMode); pour voir ce qui se passe lors de l'appui du bouton