Go Down

Topic: Asservissement moteur et variable rpm (Read 1 time) previous topic - next topic

Mike74

Nov 07, 2012, 12:38 pm Last Edit: Nov 07, 2012, 12:46 pm by Mike74 Reason: 1
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 ?

Code: [Select]

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  :D

Super_Cinci

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

Mike74

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

fdufnews

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

Mike74

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

fdufnews

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

B@tto

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é.
Blog électronique : http://battomicro.wordpress.com/
Photographie : www.interactive-celebration.fr

Mike74

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

fdufnews

Code: [Select]
// 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.
Code: [Select]
// 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;
    }



Super_Cinci

Code: [Select]
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 { ???

Mike74

pourquoi ce code ne fonctionne pas ?

Code: [Select]


// 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;
   }

68tjs

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.

Mike74

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

Code: [Select]

// 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;
    }



fdufnews


Go Up