Asservissement moteur et variable rpm

bonjour à tous, voilà je souhaite crée un asservissement d'un moteur en fonction de la variable rpm (capteur magnétique) mais le code suivant ne fonctionne pas car lorsque je dépasse 1000 rpm, le moteur reste sur la valeur 1, auriez vous une idée ?

int motorVal_1 = 100;                      // variable moteur 1
int motorVal_2 = 255;                      // variable moteur 2

unsigned long rpmcount;       // variable rpmcount
long rpm;                          // variable rpm
String rpm1;

void loop(){
// Tachymetre
if (rpmcount > 100 ){
  rpm = 1000000*60/(millis() - timeold)*rpmcount;
  timeold = millis();
  rpmcount = 0;
  rpm1 = (String(rpm));
  ELCD_Cursor_Position(5, 1);
  ELCD_put_chr(rpm1.charAt(0));
  ELCD_Cursor_Position(6, 1);
  ELCD_put_chr(rpm1.charAt(1));
  ELCD_Cursor_Position(7, 1);
  ELCD_put_chr(rpm1.charAt(2));
  ELCD_Cursor_Position(8, 1);
  ELCD_put_str("0");
  ELCD_Cursor_Position(9, 1);
  ELCD_put_str("0");

// Start
if (startVal == 1){
    analogWrite(motorPin, motorVal_1);
    motorState = 1;
    }
else if ((startVal == 1) && (rpm > 1000)){
    analogWrite(motorPin, motorVal_2);
    motorState = 2;
else {
    analogWrite(motorPin, 0);
    motorState = 0;
    }
  }

ps: j'utilise les doubles parenthèses Barbudor, tu as vu :smiley:

Elles viennent d'où, tes variables motorVal_1 et motorVal_2? on ne peut rien te dire si on n'a pas toutes les données...

oui désolé, voilà c'est corrigé :slight_smile:

Le code semble incomplet. C'est incompréhensible.

:astonished: J'ai bien évidement mis que la partie intéressée, je n'ai pas mis la partie setup

Tel que le programme est là, la variable rpmcount ne change pas dans le cours du programme.
Donc en pratique rien ne se passe puisqu'on ne rentre jamais dans le if (rpmcount > 100)
De plus il doit manquer une accolade fermante dans le else if

C'est normal que ça plante : ta premiere condition est (startval == 1), si elle est fausse les conditions de ton else le sont aussi. Si elle est vrai, alors ton else n'est pas executé.

il faut que je mette if alors si je comprend bien ou à la méthode switch

// Start
if (startVal == 1){
    analogWrite(motorPin, motorVal_1);
    motorState = 1;
    }
else if ((startVal == 1) && (rpm > 1000)){
    analogWrite(motorPin, motorVal_2);
    motorState = 2;
else {
    analogWrite(motorPin, 0);
    motorState = 0;
    }

Si startVal est à 1 on exécute le if et du coup on ne passera jamais dans le else if qui est derrière.

Une autre écriture qui devrait plus coller à ce que tu veux.

// Start
if (startVal == 1){
    if (rpm <= 1000){
         analogWrite(motorPin, motorVal_1);
         motorState = 1;
    }
    else{
        analogWrite(motorPin, motorVal_2);
        motorState = 2;
    }
}
else {
    analogWrite(motorPin, 0);
    motorState = 0;
    }

ok super, merci.

if (startVal == 1){
    analogWrite(motorPin, motorVal_1);
    motorState = 1;
    }
else if ((startVal == 1) && (rpm > 1000)){
    analogWrite(motorPin, motorVal_2);
    motorState = 2;
else {
    analogWrite(motorPin, 0);
    motorState = 0;
    }

il ne te manque pas un } entre les lignes motorState = 2; et else { ???

pourquoi ce code ne fonctionne pas ?

// Start
if (startVal == 1){
    if ((rpm < 1000) && (rpm < 4000)){
         analogWrite(motorPin, motorVal_1);
         motorState = 1;
    }
    else if ((rpm >= 1000) && (rpm < 4000)){
        analogWrite(motorPin, motorVal_2);
        motorState = 2;
    }
    else if ((rpm >= 1000) && (rpm >= 4000)){
        analogWrite(motorPin, motorVal_3);
        motorState = 3;
    }

}
else {
    analogWrite(motorPin, 0);
    motorState = 0;
    }

N'y aurait-il pas des erreurs dans l'écriture des conditions ?

if ((rpm < 1000) && (rpm < 4000))
Si rpm est inférieur à 1000 je ne vois pas comment il pourrait ne pas être inférieur à 4000 !

else if ((rpm >= 1000) && (rpm >= 4000))
Idem si rpm est supérieur à 4000, comment ne pourrait-il pas être supérieur à 1000 ?

C'est des "OU" ou des "ET" qu'il faut mettre ? Commence par énoncer les conditions en bon français et traduit les ensuite en ligne code.

oui tu as raison mais si je mets cela ? ca ne fonctionne pas

// Start
if (startVal == 1){
    if (rpm < 1000){
         analogWrite(motorPin, motorVal_1);
         motorState = 1;
    }
    else if ((rpm >= 1000) && (rpm < 4000)){
        analogWrite(motorPin, motorVal_2);
        motorState = 2;
    }
    else if ((rpm >= 4000)){
        analogWrite(motorPin, motorVal_3);
        motorState = 3;
    }

}
else {
    analogWrite(motorPin, 0);
    motorState = 0;
    }

est-ce que startVal vaut 1 ?

oui pour chaque condition

Ce n'était pas le sens de ma question.
Comme on ne voit qu'un bout de ton code on ne peut pas juger de l'ensemble.
Es-tu certain que la variable startVal soit bien à un? Si ce n'est pas le cas tu n'entreras jamais dans le if et tu ne feras jamais tourner ton moteur.
La même question se pose pour rpm. Est-ce que rpm contient une valeur suffisante pour entrer dans l'une des conditions?
D'ailleurs depuis le début tu ne nous as pas expliqué ce qui ne fonctionne pas.

oui mais en fait le code fonctionne, le problème vient de la variable rpm, mais j'ouvre un nouveau sujet pour cela.

Merci

bien en fait c'est la variable rpm que je n'arrive pas à récupérer je ne comprend pas pourquoi :cold_sweat:

Le problème est en fait lié au taux de rafraichissement trop rapide et à l'instabilité de la variable rpm.

Quelqu'un as t il une solution ? merci :cold_sweat: