//variables to keep track of the timing of recent interrupts
unsigned long trigger_time = 0;
unsigned long last_trigger_time = 0;
unsigned long period = 100;
unsigned long idle = 1;
unsigned int rpm = 0;
const int pulsePerRev = 2;
float pulseDelay = 10; //degrees
float retard;
float usec_per_deg;
unsigned int fireFlag = 0;
void IRAM_ATTR isr() {
trigger_time = millis();
period = trigger_time - last_trigger_time;
last_trigger_time = trigger_time;
retard = pulseDelay * usec_per_deg;
retard = 2;
while (millis() < trigger_time + retard){}
digitalWrite(19, LOW);
while (millis() < trigger_time + retard +1){}
}
void setup() {
Serial.begin(115200);
pinMode(18, INPUT_PULLUP);
pinMode(19, OUTPUT);
digitalWrite(19, HIGH);
last_trigger_time = millis();
attachInterrupt(18, isr, FALLING);
}
void loop() {
rpm = 60000/(period*pulsePerRev);
usec_per_deg = 1000000.*60./360./rpm;
//Serial.printf("Period is %u msec\n", period);
Serial.printf("RPM is %u \n", rpm);
Serial.printf("usec/deg is %.1f \n", usec_per_deg);
Serial.printf("retard is %f\n",retard);
//printf("deg/usec is %.1 \n", deg_per_usec);
}