Problème ordre des conditions (asservissement)

Bonjour à tous,

je rencontre un problème dans un projet d’asservissement en vitesse de 2 moteurs (moteurs d’un véhicule chenillé).

J’utilise des capteur à fourche pour connaitre la vitesse des 2 moteurs. J’ai alors une boucle qui “regarde” la vitesse des moteurs.

Je distingue alors 3 cas :

  • Si le moteur de gauche va plus vite que le moteur de droite, alors je ralenti le moteur de gauche.
  • Si le moteur de droite va plus vite que le moteur de gauche, alors je ralenti le moteur de droite.
  • Si les moteurs vont à la même vitesse, il conserve cette commande.

C’est la que mon problème intervient, j’utilise des conditions “if” or, je me rend compte qu’elle ne fonctionne pas en “parallèle”, que l’ordre à une importance et donc seul la première condition fonctionne …

Avez vous une solution ?

Ci dessous mon programme !

/*------------------------------------FONCTION AVANCER--------------------------------------*/

void avancer() {
  
  int n = 0 ;             // On initialise un compteur.
  int values_D = 255 ;    // On définit la vitesse d'initalisation du moteur de droite comme la vitesse maximum (allant de 0 à 255).
  int values_G = 255 ;    // On définit la vitesse d'initalisation du moteur de gauche comme la vitesse maximum (allant de 0 à 255).
       
  digitalWrite (M1, LOW) ;      // On définit le sens du moteur de droite (sens avant).
  digitalWrite (M2, LOW) ;      // On définit le sens du moteur de gauche (sens avant).
  analogWrite (E1, values_D) ;  // On définit la vitesse du moteur de droite.
  analogWrite (E2, values_G) ;  // On définit la vitesse du moteur de gauche.
    while (n<60) {    // n < x fois 200 ms (= temps que SEED avance).
      
      vitesse () ;    // On appele la fonction vitesse afin de connaitre les vitesses du moteur gauche et droit.
  
      if ((Vitesse_D < 105) && (Vitesse_G < 105)) {   // On filtre les informations parasites.

          if (Vitesse_D < Vitesse_G) {                                            // Dans le cas où la vitesse du moteur droit est inférieur à la vitesse du moteur gauche.
            
            int values_G2 = values_G - 100 ;    // On va donner une nouvelle "values" au moteur gauche afin qu'il soit moins rapide.
                                                                              // On soustrait à la "values" actuelle, la différence (en values) des vitesses des moteurs gauche et droit.
            analogWrite (E1, values_G2) ;                                         // On donne cette nouvelle "values" au moteur gauche.
            analogWrite (E2, values_D) ;                                          // Le moteur droit conserve sa vitesse actuelle (255).
            Serial.println ("Ralenti Gauche") ;
          }
     
         else if (Vitesse_G < Vitesse_D) {                                            // Dans le cas où la vitesse du moteur gauche est inférieur à la vitesse du moteur droit.
            
            int values_D2 = values_D - 100 ;    // On va donner une nouvelle "values" au moteur droit afin qu'il soit moins rapide.
                                                                                  // On soustrait à la "values" actuelle, la différence (en values) des vitesses des moteurs gauche et droit.                                          
            analogWrite (E1, values_G) ;                                         // On donne cette nouvelle "values" au moteur droit.
            analogWrite (E2, values_D2) ;                                          // Le moteur gauche conserve sa vitesse actuelle (255).  
            Serial.println ("Ralenti droite") ;
          }
          
           
      
          else {                            // Dans le cas où les 2 moteurs vont à la même vitesse.
            analogWrite (E2, values_D) ;    // Le moteur droit conserve sa vitesse actuelle (255).
            analogWrite (E1, values_G) ;    // Le moteur gauche conserve sa vitesse actuelle (255).
            
           
          }
          
       }
   
       n=n+1 ; // On incrémente le compteur.     
    }

}

/*----------------------------------FIN FONCTION AVANCER------------------------------------*/

Keep one of the motors at a fixed speed and only change the speed of the other one (up or down) to match