#include "esp_system.h"
#include "rom/ets_sys.h"
# define DIST_TRIGGER 18
# define COIL_PULSE 19
hw_timer_t *timer = NULL;
//variables to keep track of the timing of recent interrupts
const int pulsePerRev = 2; // 4 cylinder engine
unsigned long trigger_time = 0;
unsigned long last_trigger_time = 0;
unsigned long period = 1;
unsigned long advance;
unsigned long ign_delay;
unsigned int rpm = 0;
int pulseDelay = 3;
void ARDUINO_ISR_ATTR Ign_Pulse() {
int entry = timerReadMilis(timer);
//ets_printf("\n entry @ %u\n",entry);
digitalWrite(COIL_PULSE, LOW);
while (timerReadMilis(timer) < entry+2){}
digitalWrite(COIL_PULSE, HIGH);
}
void IRAM_ATTR isr() {
timerWrite(timer, 0); //reset timer for this cycle
timerAlarm(timer, ign_delay*1000, false, 0); //set time in us until next ign pulse
trigger_time = millis();
period = trigger_time - last_trigger_time; //Period between interrupts indcates RPM
last_trigger_time = trigger_time;
}
void setup() {
Serial.begin(115200);
pinMode(DIST_TRIGGER, INPUT_PULLUP);
pinMode(COIL_PULSE, OUTPUT);
digitalWrite(COIL_PULSE, HIGH);
attachInterrupt(DIST_TRIGGER, isr, FALLING);
timer = timerBegin(1000000); //timer 1Mhz resolution
timerAttachInterrupt(timer, &Ign_Pulse); //attach callback
}
void loop() {
//Serial.print( fireFlag ); // prints true
advance = 10;
rpm = 60000/(period*pulsePerRev);
float msec_per_deg = 1000.*60./360./rpm;
float adv_msec = advance * msec_per_deg;
ign_delay = period - adv_msec;
//Serial.printf("Period is %u msec\n", period);
//Serial.printf("RPM is %u \n", rpm);
//Serial.printf("msec/deg is %.1f \n", msec_per_deg);
//Serial.printf("adv msec is %f \n", adv_msec);
//Serial.printf("ign delay %u \n", ign_delay);
//Serial.printf("Timer value = %u\n", timerReadMilis(timer));
}