Go Down

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

Mike74


fdufnews

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.

Mike74

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

Merci

Mike74

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

Mike74

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  :smiley-roll-sweat:

68tjs

Tu n'as pas l'impression que si tu nous décrivais ton montage en détail et si tu nous donnais un lien vers la datasheet de ton capteur cela nous éviterait de regarder dans notre boule de cristal ?

Mike74

le capteur est basé sur un capteur magnetic KMZ10A, ci joint le lien pour la datasheet :

http://www.dz863.com/datasheet-817149763-KMZ10A_Magnetic-Field-Sensor/

le code que j'utilise :

Code: [Select]


unsigned long timeold ;                   // variable temps
volatile byte rpmcount;                   // variable rpmcount
unsigned int rpm;                          // variable rpm

void setup(){
attachInterrupt(0, rpm_fun, RISING);
rpmcount = 0;
rpm = 0;
timeold = 0;
}

void loop(){

// Tachymetre
if (rpmcount >= 20 ){
 rpm = 60*1000 / (millis() - timeold)*rpmcount;
 timeold = millis();
 rpmcount = 0;
}

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

// Fonction RPM
void rpm_fun() {
rpmcount++;                //Each rotation, this interrupt function is run twice
}





68tjs

Première chose à voir : la prise d'information, il faut être sur qu'elle est correcte, le code viendra après.
Le capteur est en fait un pont de Wheatstone. comment recueille tu l'information :
1) en dissymétrique en n'utilisant qu'une sortie, référencée par rapport à la masse ?
2) en symétrique avec un montage différentiel ?

A tu pu vérifier l'amplitude du signal qui sort du capteur ?
Est ce que tu as essayé avec un programme ultra simple et le capteur actionné à la main de voir si le micro détecte quelque chose ?

Quand cela ne fonctionne pas il faut décomposer en élément les plus simples possibles et avancer petit à petit dans la chaîne et sûrement pas avec le programme final mais avec des bouts de programme adaptés.

Bons test élémentaires.

Mike74

oui bien j'ai testé simplement ce code avec affichage du rpm sur le moniteur série et j'ai comparé les valeurs avec les mesures prises avec un tachymètre laser, elles sont correctes.






68tjs

J'ai un doute : est-ce que la fonction "millis()" est compatible avec l'usage des interruptions ?
Officiellement je crois que s'est oui, mais il semble qu'il traîne encore des bugs, c'est ce que j'ai cru comprendre mais je n'ai pas approfondit, donc sgdg.

Go Up