Pages: [1] 2   Go Down
Author Topic: Asservissement moteur et variable rpm  (Read 1507 times)
0 Members and 1 Guest are viewing this topic.
Lausanne
Offline Offline
Full Member
***
Karma: 1
Posts: 116
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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-grin
« Last Edit: November 07, 2012, 06:46:33 am by Mike74 » Logged

Bretagne
Offline Offline
Edison Member
*
Karma: 16
Posts: 1398
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Lausanne
Offline Offline
Full Member
***
Karma: 1
Posts: 116
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

oui désolé, voilà c'est corrigé  smiley
Logged

France
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3627
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Lausanne
Offline Offline
Full Member
***
Karma: 1
Posts: 116
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

France
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3627
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Ales
Online Online
Faraday Member
**
Karma: 39
Posts: 3771
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Lausanne
Offline Offline
Full Member
***
Karma: 1
Posts: 116
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

France
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3627
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
// 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:
// 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;
    }
Logged

Lausanne
Offline Offline
Full Member
***
Karma: 1
Posts: 116
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ok super, merci.
Logged

Bretagne
Offline Offline
Edison Member
*
Karma: 16
Posts: 1398
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
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 { ???
Logged

Lausanne
Offline Offline
Full Member
***
Karma: 1
Posts: 116
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

pourquoi ce code ne fonctionne pas ?

Code:

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

IDF/SO
Offline Offline
Edison Member
*
Karma: 41
Posts: 2281
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Lausanne
Offline Offline
Full Member
***
Karma: 1
Posts: 116
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

Logged

France
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3627
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

est-ce que startVal vaut 1 ?
Logged

Pages: [1] 2   Go Up
Jump to: