Convertisseur fréquence/tension pour compte tours

Bonjour a tous

J'ai pour projet de réaliser une copie de compte tours, qui était équipé sur les cyclomoteurs de compétition a l'époque. Pour cela je dois convertir la fréquence de rotation du moteur en une tension.

Pour cela, j'utilise la fonction pulseIn() pour mesurer la période a l'etat 1 du capteur et un autre pluseIn() pour mesurer la période a l’état 0. C'est pas très optimisé, il faut plusieurs tours pour mesure un période complète, mais je savais pas comment faire autrement...

Ensuite on convertie cette période en fréquence. Puis on multiplie la valeur obtenue par 1.02 pour qu'a 15 000 tr/min on obtienne 255. Et avec analogWrite on fait varier la longueur d'impulsion d'un sortie PWM. la sortie est directement relier a un voltmètre analogique (galvanomètre).

En soit le programme fonction très bien, mais j'ai un probleme quand on arrête le moteur... La sortie PWM remonte a 255 au lieu de chuté a 0...

Je sais pas si mes explications sont claire mais si il y a le moindre problème j’essayerai de reformulé.

Merci d'avance Alexis

const byte PIN_SIGNAL = 2;
unsigned long ttotale;
float feq;
float pwm;

void setup() {

  Serial.begin(115200);
  pinMode(PIN_SIGNAL, INPUT);

}


void loop() {

  // Mesure la durée de l'impulsion haute et basse
  noInterrupts();
  unsigned long t1 = pulseIn(PIN_SIGNAL, HIGH);
  unsigned long t2 = pulseIn(PIN_SIGNAL, LOW);
  interrupts();

  //transformation de la periode en frequence 
  ttotale=t1+t2;
  feq=1/(ttotale*0.000001);
  pwm=feq*1.02;

  if (pwm>255) pwm=255;

  analogWrite(3, pwm);

  // Affiche la durée de l'impulsion (en us) sur le port série
  //Serial.println(ttotale);
  //Serial.println(feq);
  // Serial.println(pwm);
  
}

bonjour,

mesurer la période est la bonne méthode, mais pulseIn() n'est pas le meilleur outil pour la capturer.

je sais, tu vas me répondre que c'est le seul qu'Arduino met à ta disposition.

mais Atmel a doté ses µC d'une fonction nommée capture, qui prend une "photo" de la valeur d'un timer sur un front (montant ou descendant) présent sur une entrée dédiée : en prenant le temps d'examiner la doc du µC, tu pourrais beaucoup apprendre sur l'utilisation des timers, des interruptions et de cette fameuse fonction capture, qui utilise une entrée nommée ICPn, n étant le numéro du timer utilisé.

grosso modo, un front permet de "choper" la valeur instantanée du timer, une routine d'interruption te permet de calculer la différence entre deux événements, que tu récupères ensuite dans la loop() pour calculer ta fréquence et l'exploiter.

tu mets déjà les mains dans le cambouis avec tes moteurs de kart ou de mob : lance-toi, la prog est bien plus facile que la méca !

pour ta question finale (la PWM au max alors que tu veux zéro), je n'ai pas examiné en détails ton code, mais il se peut qu'une division interdite soit effectuée dans tes calculs, d'où un résultat erroné : tu utilises un float pour ta PWM ... dans tous les cas, ce genre d'erreur peut se traiter avec un test simple : si la période dépasse une valeur max, ou si les mesures ne se font plus par absence du signal, il faut considérer que le moteur ne tourne plus.

Bonsoir

La fonction pulse in retourne 0 au bout d un certain temps si pas de signal

0+0=la tête à toto 1/0 x par ce qu'on veut... Bah ça reste division par zero

L'Arduino il a une autre fonction? Parce qu'un monostable fait ça aussi bien sans prise de tête.

Sans trop se fatiguer, la librairie FreqCount devrait pouvoir être utilisée.