i added a taskscheduler to have multiple loops for different functions other than the interrupt... one is just to print on the serial monitor every 3 seconds... what i noticed is that to print the info causes instability of the signal but also without printing there are other factors to get hid off
i used one of the outputs of the arduino as a clock generator to test the rpm meter and worked but there is still some instability
i added the limits of the rpm and injector timing respectively 0-7000rpm 0-5v , 1ms and 10ms.
so the accelerator set the rpm and the arduino set the injectors parameters until it matches the rpm desired
anyone who wants to help finding problems and solutions for them i appreciate
unsigned long newtime;
unsigned long lasttime;
#include <TaskScheduler.h>
int clocksignal = 3; // //input interrupt 1 / pin 3
float injectiontime = 5; //ms injection timming
int injector = 13; // injector output
int rpmread = 0;
int accel = A0; // analog/digital accelerator signal
int pressure = A1;
int rpmset = 0; // rpm determined by analog/digital accelerator
String state;
float timeincrement = 0.1;
float timedecrement = 0.1;
int mininjectiontime = 1;
float maxinjectiontime=10;
int maxrpmset=7000;
int clockcount=0;
int lastclockcount;
int fakerpm=20; // 10ms=6000rpm 20ms=3000 30ms= 2000 60= 1020rpm 75 =780 //fakesignal repetition
int fakeclock = 5; //pin5 output fakeclock --- connect to pin 3 for simulating engines on .. controle its rpm at task t4
void t1Callback();
void t2Callback();
void t3Callback();
void t4Callback();
//Tasks
Task t1(300, TASK_FOREVER, &t1Callback); //
Task t2(3000, TASK_FOREVER, &t2Callback); //
Task t3(500, TASK_FOREVER, &t3Callback); //
Task t4(fakerpm, TASK_FOREVER, &t4Callback); // 10ms=6000rpm 20ms=3000 30ms= 2000 60= 1020rpm 75 =780 //fakesignal repetition
Scheduler runner;
void INJECTION() { //interrupt routine
digitalWrite(injector, HIGH);
delayMicroseconds(injectiontime*1000);
digitalWrite(injector, LOW);
clockcount++;
// Serial.print("INJECTED FOR: ");Serial.print(injectiontime);Serial.println("injectiontime");
//Serial.println(clockcount);Serial.println("");Serial.println("");
//Serial.print(rpmread);
//Serial.println(" RPM Measured ");
}
void t1Callback() {
rpmset=constrain((analogRead(accel)*6),0,maxrpmset); // rpm determined by analog/digital accelerator
if (rpmset > rpmread ) {
state="Accelerating" ; // injection time increase
injectiontime=constrain((injectiontime+timeincrement),1,10);
}
else {
state="Deaccelerating"; // injection time reduce
injectiontime=constrain((injectiontime-timedecrement),mininjectiontime,maxinjectiontime);
}
}
void t2Callback() {
Serial.print("Accelerator ");
Serial.print(rpmset);
Serial.println(" RPM SET");
Serial.print("Injection Time ");
Serial.print(injectiontime);
//Serial.print(injectiontime);
Serial.println(" miliseconds");
Serial.print(rpmread);
Serial.println(" RPM Measured ");
Serial.println(state);
Serial.println(lastclockcount);
}
//____________________________________________________________________________________________________task3
void t3Callback() {
rpmread=(clockcount-lastclockcount)*60*2;
lastclockcount=clockcount;
}
//____________________________________________________________________________________________________task4
void t4Callback() {// fake signal
digitalWrite(fakeclock, HIGH);
delayMicroseconds(100);
digitalWrite(fakeclock, LOW);
}
void setup() {
Serial.begin(9600);
pinMode(clocksignal, INPUT_PULLUP);
pinMode(injector, OUTPUT);
pinMode(fakeclock, OUTPUT);
attachInterrupt(1, INJECTION, FALLING);
runner.init(); //"Initialized scheduler"
runner.addTask(t1);
runner.addTask(t2);
runner.addTask(t3);
runner.addTask(t4);
t1.enable();
//t2.enable();
t3.enable();
t4.enable();
;}
void loop() {
runner.execute();
}