Aide pour remplacer des if par des switch case

Bonjour,

Ayant un projet allant se compliquer, je voulais savoir comment faire pour réécrire mon programme avec des swith ( ) et case () et peut être des while.

Mais d’abord il me semble que je dois expliquer mon programme

Dans ce dernier, je controle la vitesse du moteur de manière à ce que la valeur de la vitesse de reglage appelée « Setpoint » soit fonction de la tension de sortie du moteur appelée « val-output » et de sa vitesse réelle appelée « moyenne ». Je prends la vitesse moyenne pour avoir une valeur stable et se rapprocher de la valeur de la vitesse réelle.

Aussi cette moyenne est négative quand le moteur tourne dans le sens back() et positive dans le sens advance ().

Ces 3 données « Setpoint » , « val-output » et «« moyenne » sont issues d’un algorithme PID qui a pour but de s’approcher de la vitesse désirée « Setpoint » avec le moins de marge d’erreur possible.
L’algo PID corrige l’erreur de vitesse en baissant ou augmentant la tension du moteur

Deslors si je regle le programme avec une vitesse 45 en AVANT
Setpoint=45;
advance();
Je dois avoir une vitesse moyenne = 45 et
Setpoint=45;
back();
Je dois avoir une vitesse moyenne = -45
et val-ouptut est entre 53 et 55 dans les deux cas.

Les données Setpoint et val-ouput sont toujours positives. Elles sont proportionnelles et quasi linéaire proportionnelles : pour une vitesse moins elevée, il faut une tension moins elevée

Grâce à l’algo PID, si je bloque le moteur la tension augmente --> la donnée val-ouput augmente et
si j’accompagne le moteur dans son sens de fonctionnement (si je l’accelere un peu) --> la donnée val-output diminue.

Ce que j’ai programmé est Si j’ai l’état Setpoint=55 et marche AVANT qu’on pourrait nommer «55 Set A » et val-output > 70 alors je baisse la vitesse en donnant un nouveau reglage Setpoint= 35, que j’aimerai nommer « 35 Set A ».

Mon moteur est maintenant réglé à Setpoint= 35, advance () nommé « Set 35 A » ; à cette vitesse la tension de sortie du moteur val-output est environ = 50.

Puis à partir de cette état, il y a deux conditions :

-Soit j’accompagne le mouvement dans le sens avant, ce qui fait baisser la tension et augmenter la vitesse, et si dans ce cas les seuils val-output < à 40 et la moyenne > 40 sont valides alors le programme revient à la vitesse 55 en marche avant donc revient à Set 55 A

-Soit je freine le mouvement et je bloque une peu le moteur et la vitesse diminue et si les paramètres
val-output > 50 et moyenne < 30 sont valide alors le programme va la vitesse 25 en marche avant donc à l’état Set 25 A

//--------------------------- 35 Set A---------------------------

     //------- FREINAGE de 55 Set A 

 if  (Setpoint>54.9 && Setpoint<55.1  && val_output > 70    ) 

       {advance();

       Serial.println (" From----- 55 Set A to---- 35 Set A "); // reglage venant de 55 Set A à 35 Set A
       
              Setpoint=34.75; //  55 --> 34.8 .  ici val-outpout = 43 et moyenne =35
   
         }



//--------------------------25 Set A 2 ====  (24.7 Set A ) --------

      //--------------- FREINAGE de Setpoint = 34.75 advance to  24.7 SET advance
          
          
         else if  (Setpoint>34.74  && Setpoint<34.76  && val_output>50 && moyenne<35 ) 
         
         
         {advance();
 
            Serial.println ("FROM 34.75 ADVANCE TO 24.7 Set A1 "); // From 35 Set A to 25 Set A 2 

              Setpoint= 24.7; //  34.75 ---> 24.7 



   //------ 35 Set A 2----//---FROM 25 Set A---------  

          //-----------------ACCOMPAGNEMENT du SENS avant de 25  SET A2 to  35 Set A2

          
        else if  (Setpoint>24.69  && Setpoint<24.71 && val_output<threshold-60 && moyenne>35 ) 

                 {advance();  // 
                 
                Serial.println ("  ADVANCE 34.75 FROM 24.7 SET A ");
                
               Setpoint= 34.75; //  accompagnement du sens --> la moyenne accelere à 35
              
              
       
       }
             
                           
       }

Je ne mets pas excatement Setpoint=25 ou Setpoint = 35 pour les états 25 Set A et 35 Set A mais 24.7 et 34.75 car j'ai besoin de différencier ces états avec 25 Set B et 35 Set B auxquelles j'assigne donc des Setpoint différents 25.3 et 34.8.

C'est pour éviter que le programme fasse des confusions quand il doit savoir si l'état actuel du moteur est en marche avant ou arrière. :o

Plus tard, j'aimerai que mon paramètre de Setpoint suivent une fonction sinusoïde et que si je bloque ou accélère le mouvement du moteur celui se recoller à la courbe sinusoïde.

Mais avant est il possible d'utiliser des switch case.

Merci pour vos aides.

Cordialement,

Salut,

En C, un switch/case ne teste que des valeurs, pas des intervalles.

Ainsi un

case 54.9<Setpoint<55.1 :

ou un simple

case 54.9<Setpoint :

ne sont simplement pas valide.

Tu peux toujours bidouiller en faisant une fonction de normalisation en amont, mais ca va etre totalement redondant avec ton code. Ca se fait cependant couramment pour rendre le code plus clair ou pour rendre abstraites les conditions dans du code objet.

A+