Reprise de projet, lecture RPM (tours par minute), moteur 4 temps

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:

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

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

// 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!

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

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

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

dfgh:
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!

fdufnews:

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

Comme ça

fdufnews:

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

inductce

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

Bonsoir,

Artouste:
Une diode de roue libre devrait aussi être bienvenue :grin:

J'ai supposé qu'elle était présente dans le circuit de pilotage des injecteurs.

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

Diode de roue libre ça me parle :stuck_out_tongue: 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?

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.

Brasiligun:
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:
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 :stuck_out_tongue: les tests approchent

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

Cdt.
Marcus.

Entrée.JPG

Inj.JPG

Inj2.JPG

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

[url=http://[![](https://image.noelshack.com/minis/2018/28/6/1531562395-inj.png)](https://www.noelshack.com/2018-28-6-1531562395-inj.png)

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)

Je suis parti du principe que les injecteurs recevaient du +12V juste pour l'ouverture. Hier j'ai fait mes essais en me piquant sur l'injecteur 1 [cette moto possède 2 rampes d'injections, la seconde ne s'active qu'à 8000 donc on ne focus que l'injection primaire]

Je me suis branché hier sur le fil surligné en jaune, et c'est sur lui que je voyais mon 12/14V. Est-ce que ça vaut le coup que je me connecte sur le fil entouré au bleu, commun à chaque injecteur? Celui que tous les injecteurs partagent et qui va jusqu'au relais

Schéma Elec:

Cible:

Je voit pas bien les images.
3 I. Vérifier la polarité des injecteurs Vérifier la polarité de vos injecteurs (+/ -) : Tout d abord, la résistance doit être égale ou supérieure à 10 ohms. Avant tout montage, réglez votre multimètre sur 12 Volts. Placez l électrode rouge contre la borne + de la batterie et placez l autre électrode contre l embout de l injecteur. Mettre le contact sans faire tourner le moteur. Le «12 volts» identifié c'est la commande.

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)

Bah merte alors :stuck_out_tongue: Hier en me piquant sur le câble surligné en jaune du schéma juste au dessus, j'avais bien une augmentation des tours/min mais avec un décalage de 600/700? Si les injecteurs c'est trop compliqué, je peux me décaler sur le signal qui contrôle une des deux bobines d'allumage

Je vais réessayer d'ici quelques minutes. Mais merci à tous de vos indications en tout cas

EDIT:

J'ai mis les images en PJ, pour les avoir en grand

le fil entouré au bleu, commun à chaque injecteur?
c'est le 12V

Non c'est pas compliqué, si tu branche ton voltmètre entre le + de la batterie et le moins sur une des broches du connecteur femelle de l'injection, celle qui te donnera 12V c'est celle que tu doit prendre pour ton RPM.
C'est le même système pour l'allumage si tu as des bobines compact.