Go Down

Topic: Reprise de projet, lecture RPM (tours par minute), moteur 4 temps (Read 4404 times) previous topic - next topic

Brasiligun

Bonjour à tous! J'ai de nouveau l'occasion de bosser sur un de mes projets en standby, à savoir lire les tours/minutes d'un moteur 4 temps par une arduino avec les Interruptions.

Pour récupérer mon signal, je me suis piqué sur le +12V d'un de mes injecteurs (en réalité on est plus à 14V)

Moteur 4 temps, donc dès que mon injecteur cible se déclenche, on peut considérer que 1 tour est validé


Pour l'acquisition, et pour ne pas cramer mon arduino, j'ai fait un petit pont diviseur R1 = 20K et R2=10k pour rester dans les tolérances des entrées de l'arduino

N'y connaissant absolument rien en interruption, j'ai fait des essais avec ce code:

Code: [Select]

volatile byte half_revolutions;
 unsigned int rpm;
 unsigned long timeold;
 void setup()
 {
   Serial.begin(9600);
   attachInterrupt(0, rpm_fun, RISING);
   half_revolutions = 0;
   rpm = 0;
   timeold = 0;
 }
 void loop()
 {
   if (half_revolutions >= 20) {
     //Update RPM every 20 counts, increase this for better RPM resolution,
     //decrease for faster update
     rpm = 30*1000/(millis() - timeold)*half_revolutions;
     timeold = millis();
     half_revolutions = 0;
     Serial.println(rpm,DEC);
   }
 }
 void rpm_fun()
 {
   half_revolutions++;
   //Each rotation, this interrupt function is run twice
 }


ça marche a peu près, sauf qu'il a une belle marge entre ce que mon compteur dit, que ce que l'arduino perçoit

Ralenti réel à 1100 tr/min

Arduino: 360 tr/min

Je me doute que le problème vient du code, mais je ne vois pas comment modifié pour obtenir ce que je souhaite. Et j'en ai fait des tests bizarres pourtant :p

J'aurai besoin d'avoir les RPM refresh le plus rapidement possible, et les plus proches possible de la réalité (10% d'erreurs  c'est largement correct pour ma petite réalisation)


Idéalement, je suis parti de ce petit bout de code qui doit plus correspondre à mon type de signal, mais je n'ai jamais su afficher les RPM à partir de lui, je dois passer à coté de quelque chose.

Il m'indique (après modification), toujours -1


Code: [Select]
// settings
int launch = 4000; // rpm to launch at
int step = 25 * 1000; // 25ms stepper
 
// inputs
int injectorPin = 1; // injector signal
int clutchPin = 2; // clutch
 
// outputs
int ignitionCoilPin = 6; // ignition coil power (using MOSFET)
 
// variables
int rpm = 0;
unsigned long lastInterruptTime;
 
// setup
void setup()
{
  Serial.begin(9600);
 
  // attach interrupt to injectors
  attachInterrupt(injectorPin, rpmCalculation, RISING);
 
  // set clutch mode
  pinMode(clutchPin, INPUT);
 
  // set ign coil as output
  pinMode(ignitionCoilPin, OUTPUT);
 
  // enable by default
  digitalWrite(ignitionCoilPin, HIGH);
 
  // wait 1 seconds
  delay(1000);
}
 
// loop
void loop()
{
  // check if actual rpm is equal or greater than launch rpm, and if clutch petal is down
  if (rpm >= launch && digitalRead(clutchPin) == HIGH)
  {
    // cut power to ignition coil for some milliseconds.
    digitalWrite(ignitionCoilPin, LOW);
    delayMicroseconds(step);
    digitalWrite(ignitionCoilPin, HIGH);
    delayMicroseconds(step);
  }

}
 
// calculate rpm
void rpmCalculation()
{
  unsigned long now = micros();
 
  rpm = 60 / ((now - lastInterruptTime) / 1000000) / 2;
 
  lastInterruptTime = now;
}



Merci à vous!
 

dfgh

hello
tu nous parles de compte tours et dans ton code tu coupe l'allumage pour 25ms à 4000tr/mn
voici dejà un code pour un compte tour
testes le et reviens nous voir si tu ne réussi pas à faire ta coupure à 4000tr
nota, j'ai mis le serial à 115200
Code: [Select]

volatile byte compteur_injections = 0;// settings
byte memo_compteur_injections=0;
unsigned long premiere_injection=0;
int injecteur_Pin = 2; // injector signal
int rpm = 0;

void setup()
{
  Serial.begin(115200);
  attachInterrupt(0, comptage_injections, RISING);
  premiere_injection=micros();
  pinMode(2,INPUT_PULLUP);
}
 
void loop()
{
  if (compteur_injections==1){premiere_injection=micros();}
  if (compteur_injections>=10)
  {
    memo_compteur_injections=compteur_injections;
    compteur_injections=0;
    int rpm=(60000000/((micros()-premiere_injection)/(memo_compteur_injections-2)));
   Serial.println(rpm);
  }
}

void comptage_injections()
{
  compteur_injections++;
}

fdufnews

Pour récupérer mon signal, je me suis piqué sur le +12V d'un de mes injecteurs (en réalité on est plus à 14V)
Pour l'acquisition, et pour ne pas cramer mon arduino, j'ai fait un petit pont diviseur R1 = 20K et R2=10k pour rester dans les tolérances des entrées de l'arduino
1) il faudrait en plus mettre une zener 5V en parallele de la 10K car il peut y avoir des surtensions.

2) il faudrait t'assurer du fait que le signal que tu captes tombe bien à zéro sinon tu peux rater des impulsions.

Brasiligun

tu nous parles de compte tours et dans ton code tu coupe l'allumage pour 25ms à 4000tr/mn
voici dejà un code pour un compte tour
testes le et reviens nous voir si tu ne réussi pas à faire ta coupure à 4000tr
nota, j'ai mis le serial à 115200

C'est ça la coupure d'allumage a 4000 (ou autre) c'est pour la suite, et ça marche déjà très bien en mode forcé. Le but c'est de pouvoir interagir avec les vraies valeurs du moteur

La moto est dans mon garage, je fais l'essais demain avec ton bout de code, merci à toi!


1) il faudrait en plus mettre une zener 5V en parallele de la 10K car il peut y avoir des surtensions.

2) il faudrait t'assurer du fait que le signal que tu captes tombe bien à zéro sinon tu peux rater des impulsions.
Normalement les injecteurs font bien du 0 ou 12 quasi de façon binaire, vraiment comme des robinets qui seraient ouverts/fermés

Merci pour le conseil de la zener, par contre je dois la monter dans quel sens du coup? Je n'ai pas trop l'habitude des zener  :smiley-roll-blue:

fdufnews

Comme ça

Artouste

1) il faudrait en plus mettre une zener 5V en parallele de la 10K car il peut y avoir des surtensions.

2) il faudrait t'assurer du fait que le signal que tu captes tombe bien à zéro sinon tu peux rater des impulsions.
Bonsoir
8)

oui
Je ne suis pas du tout spécialiste des"injecteurs" , mais basiquement et "électroniquement parlant" AMHA çà reste un simple solénoïde/inductance.

Une diode de  roue libre devrait aussi être bienvenue :smiley-mr-green:





inductce

68tjs

La zéner est une protection indispensable mais je prendrais plutôt une 4,7V.

Les zéners 5V  font en réalité 5,1V +/- 5%
La tension zéner "théorique" pourra atteindre  5,1V * 1,05 = 5,35 V.

Ce n'est pas tout : une zéner possède une résistance dynamique dans la zone de régulation zéner. Cette résistance n'est hélas pas nulle. Elle est faible pour les tensions zéner supérieures à 6,2V et augmente pour les tensions inférieures.
La tension aux bornes de la zéner 5,1 V pourra facilement atteindre 5,5V.


Si le Vcc  est dans sa limite basse (5V -5% = 4,75 V) l'entrée pourra se trouver à 5,5V  - 4,75= 0,75V au dessus de la tension Vcc. La spec du micro dit qu'il ne faut pas dépasser 0,5V sinon le micro est alimenté par son entrée.

Je te conseille plutôt une zéner  4,7V

fdufnews

Bonsoir,
Une diode de  roue libre devrait aussi être bienvenue :smiley-mr-green:
J'ai supposé qu'elle était présente dans le circuit de pilotage des injecteurs.

Brasiligun

Je prend bonne note de vos conseils! En tout cas merci de vous investir autant

Diode de roue libre ça me parle :p J'utilise habituellement des 1n400x quand j'utilise des relais, comme celui qui gère mes coupure d'allumage d'ailleurs.

Je vais farfouiller dans ma réserve, je suis sur d'avoir des Zener, après des 4.7 ou des 5, ça mystère

Et tant que nous parlons de protection, pour du +12V théorique, qui tape plus du 14 réel, peut-être même du 15V (en prévention), pour mon pont diviseur, je garde le couple 20K/10K? Ou je pousse un peu plus en prévention? J'ai de quoi faire 22K/10K ou 30K/10K sous la main


Merci à vous et bonne soirée

EDIT: j'ai fouillé dans mes cadavres, j'ai une diode inconnue bleue à bague noire, marqué BAT46 (inconnue au bataillon), et malheureusement qu'une Zener 5V1

Il vaut mieux mettre cette Zener en sécurité même si idéalement vous me préconisez une 4.7?

68tjs

Bien sur qu'il faut mettre la zéner même en 5,1 V, le conseil de fdufnew est très judicieux.
Tu n'aurais pas eu de diode il était préférable de prendre une 4,7V mais ce n'est pas une imposition obligatoire.

Si tu as bien suivi mon raisonnement tu n'aura jamais de tension à  des valeurs théoriques et donc il ne faut jamais croire qu'un 5V annoncé fera exactement 5V.
C'est pour cela qu'on fixe des limites et pour les alim c'est généralement +/- 5%.

Le risque que j'ai soulevé c'est dans le cas où l'alim Vcc serait à 5V - 5% et que la zéner est à 5,1V +5%
J'insiste la démarche est à comprendre et à appliquer dans le choix des composants pour ne pas avoir à se prendre la tête et ne rien avoir à vérifier.
Le cas que j'ai traqué est possible mais statistiquement rare. La difficulté est que quand on s'y trouve il se produit des fonctionnements erratiques  et en général ce n'est pas aux alims qu'on pense en premier.

Dans le cas de ton application unique tu peux faire des vérifications simples.
-  tu mesure le Vcc .
- tu mesures la tension aux bornes de la zéner en remplaçant la source injecteur (le nom est probablement faux je ne connais rien en mécanique) par une source de tension que tu fais varier de 10V à la valeur max probable.
Si la tension zéner ne monte pas au dessus du Vcc mesuré + 0,5V c'est bon.

Pour générer ce 10V à 14/18 V  point besoin d'une alimentation de laboratoire, il suffit d'approvisionner (1€ sur Ebay, 4 semaines de délais) un convertisseur de tension STEP-UP et de régler sa sortie à 12, 14, 18 V.

micol

Moteur 4 temps, donc dès que mon injecteur cible se déclenche, on peut considérer que 1 tour est validé
Si le déclenchement correspond à l'admission dans un cylindre donné, alors il n'a lieu que tous les 2 tours.
*** Micol *** Les talibans du politiquement correct ont encore frappé. En 2017, la dernière victime est TEX.

Brasiligun

Si le déclenchement correspond à l'admission dans un cylindre donné, alors il n'a lieu que tous les 2 tours.

Exact, avec le recul je me rend compte que j'ai dis une connerie

Merci :p les tests approchent


marcus_95

Bonjour,
la commande d'un injecteur n'est pas sur  +12V.

Cdt.
Marcus.

Brasiligun

Bonjour, tu es sur? Parce que j'ai bien du 12-14V quand je mesure au voltmètre


marcus_95

Certain, j'ai fabriquer un boitier pour rouler a l'ethanol en augmentant le temps d'injection. (un 328 pour gérer les temps en standalone)

Go Up