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