// DECLARATION OF VARIABLES //
#include "digitalWriteFast.h"
//
// INPUT- OUTPUTS //
int COIL1 = 32;
int COIL2 = 36;
int COIL3 = 40;
int COIL4 = 44;
int LED = 13;
int COILTR = 11;
int SYNCTR1 = 9;
int SYNCTR4 = 3;
//INITIAL SYSTEM GLOBAL//
int OFFRET = 0;
int SYNCNT1 = 0;
int SYNCNT4 = 0;
int NEXTCOIL = 0; //
int SYNCED = 0;
int RUNNING = 0;
int SPARKS = 0;
int RPM = 0;
unsigned long LASTMILLIS = 0;
unsigned long COILDUR;
unsigned long SYNCDUR1;
unsigned long SYNCDUR4;
//
// ** SETTINGS ** //
int FIRSTCOIL = 0;
int DWELL = 1500; // INITIAL DWELL IN MICROSECONDS //
//
int MAXDWELL = 2750; // MAX DWELL IN MICROSECONDS FOR MAPPING WITH RPM //
int MINDWELL = 2200; // MIN DWELL IN MICROSECONDS FOR MAPPING WITH RPM //
//
int MAXOFFRET = 0; // MAX OFFSET RETARD MICROSECONDS FOR MAPPING WITH RPM //
int MINOFFRET = 0; // MIN OFFSET RETARD IN MICROSECONDS FOR MAPPING WITH RPM //
//
void setup() {
//Serial.begin(115200);
pinModeFast(COIL1, OUTPUT);
pinModeFast(COIL2, OUTPUT);
pinModeFast(COIL3, OUTPUT);
pinModeFast(COIL4, OUTPUT);
pinModeFast(LED, OUTPUT);
//
pinModeFast(COILTR, INPUT);
pinMode(SYNCTR1, INPUT_PULLUP);
pinMode(SYNCTR4, INPUT_PULLUP);
//
}
// the loop routine runs over and over again forever:
void loop() {
// SYNCHING ///
if (SYNCED == 0){
//
// SYNCDUR1 = pulseIn(SYNCTR1, LOW);
// SYNCDUR4 = pulseIn(SYNCTR4, LOW);
SYNCDUR1 = digitalRead(SYNCTR1);
SYNCDUR4 = digitalRead(SYNCTR4);
// Serial.println(SYNCDUR);
//
if (SYNCDUR1 < HIGH){
SYNCNT1++;
} else if (SYNCDUR4 < HIGH){
SYNCNT4++;
}
if (SYNCDUR1 > 0 && SYNCNT1 > 1){ // AT LEAST 2 SYNCHS BEFORE SET AS SYNCED //
FIRSTCOIL = 2;
NEXTCOIL = FIRSTCOIL;
SYNCED = 1;
digitalWriteFast(LED, HIGH);
SYNCNT1 = 0;
} else if (SYNCDUR4 > 0 && SYNCNT4 > 1){ // AT LEAST 2 SYNCHS BEFORE SET AS SYNCED //
FIRSTCOIL = 3;
NEXTCOIL = FIRSTCOIL;
SYNCED = 1;
digitalWriteFast(LED, HIGH);
SYNCNT4 = 0;
}
}
//
if (SYNCED == 1){
COILDUR = pulseIn(COILTR, HIGH,500000);
//
OFFRET = map(RPM,0,10000,MAXOFFRET,MINOFFRET);
DWELL = map(RPM,0,10000,MAXDWELL,MINDWELL);
//
}
if (COILDUR > 0 && SYNCED == 1){
// OFFSET RETART //
//delayMicroseconds(OFFRET);
//
if (NEXTCOIL == 1){
FIRE_COIL1();
NEXTCOIL = 3;
}else if (NEXTCOIL == 3){
FIRE_COIL3();
NEXTCOIL = 4;
}else if (NEXTCOIL == 4){
FIRE_COIL4();
NEXTCOIL = 2;
}else if (NEXTCOIL == 2){
FIRE_COIL2();
NEXTCOIL = 1;
}
if (RPM > 200 && RUNNING == 0){
RUNNING = 1;
}
}
// CALCULATES RPM //
if (SPARKS >= 2) {
RPM = 30*1000/(millis() - LASTMILLIS)*SPARKS;
LASTMILLIS = millis();
SPARKS = 0;
}
// RPM IS LOWER OF 80 WILL DESYNCH //
if (RPM < 200 && RUNNING == 1){
SYNCED = 0;
RUNNING = 0;
digitalWriteFast(LED, LOW);
}
SPARKS++;
}
void FIRE_COIL1(){
digitalWriteFast(COIL1, HIGH);
delayMicroseconds(DWELL);
digitalWriteFast(COIL1, LOW);
}
void FIRE_COIL2(){
digitalWriteFast(COIL2, HIGH);
delayMicroseconds(DWELL);
digitalWriteFast(COIL2, LOW);
}
void FIRE_COIL3(){
digitalWriteFast(COIL3, HIGH);
delayMicroseconds(DWELL);
digitalWriteFast(COIL3, LOW);
}
void FIRE_COIL4(){
digitalWriteFast(COIL4, HIGH);
delayMicroseconds(DWELL);
digitalWriteFast(COIL4, LOW);
}