#define PICKUP_PIN 2
#define IGNITION_PIN 13
volatile unsigned long lastPulse = 0;
volatile unsigned long interval = 0;
void setup() {
pinMode(PICKUP_PIN, INPUT_PULLUP);
pinMode(IGNITION_PIN, OUTPUT);
attachInterrupt(digitalPinToInterrupt(PICKUP_PIN), pickupISR, FALLING);
}
void loop() {
if (interval > 0) {
float rpm = 60000000.0 / interval;
if (rpm < 500 || rpm > 15000) return;
float advanceDeg;
if (rpm < 2000) advanceDeg = 5;
else if (rpm < 5000) advanceDeg = 10;
else if (rpm < 8000) advanceDeg = 18;
else advanceDeg = 22;
float delay_us = interval * (advanceDeg / 360.0);
delayMicroseconds((int)delay_us);
digitalWrite(IGNITION_PIN, HIGH);
delayMicroseconds(100);
digitalWrite(IGNITION_PIN, LOW);
}
}
void pickupISR() {
unsigned long now = micros();
interval = now - lastPulse;
lastPulse = now;
}Loading
st-nucleo-c031c6
st-nucleo-c031c6