#include <Arduino.h>
const int camPin = 8; // 0-5v digital signal out emulating cam sensor
const int crankPin = 9; // 0-5v digital signal out emulating crank sensor
const int potPin = A3; // potentiometer, assumed to be 10kOhm
#define SERIAL_DEBUG false
class timing
{
public:
uint_fast16_t delay_micro;
bool Cam_Val = false;
bool Crank_Val = false;
bool *Cam_Bits;
bool *Crank_Bits;
// Constructor
timing(unsigned int idle_rpm, unsigned int idle_duration, signed int cam_bit_shift, bool *caa, bool *cra)
{
Cam_Bits = caa;
Crank_Bits = cra;
int idle_step_count = (delay_micro * 1000000) / idle_duration;
}
void set_RPM(unsigned int val)
{
if (val < idle_rpm)
{
val = idle_rpm;
}
else if (val > 9000)
{
val = 9000;
}
rpm = val;
#if SERIAL_DEBUG
Serial.print("rpm Set to: ");
Serial.println(rpm);
#endif
}
void set_step_size(signed int size)
{
if (size >= 255)
{
size = 255;
}
else if (size >= 1)
{
size = 1;
}
step_size = size;
}
int get_angle()
{
return step;
}
void do_steps()
{
step = step + step_size;
if (step >= 360)
{
step = 0;
}
Cam_Val = Cam_Bits[step];
Crank_Val = Crank_Bits[step];
//=============PROBLEM CHILD============
delay_micro = (step_size / ((rpm * 6) / 1000000.0)); // without the ".0" to signify float, the arduino does integer math and crashes mid execution
#if SERIAL_DEBUG
Serial.print("step: ");
Serial.println(step);
Serial.print("Cam_Bits: ");
Serial.println(Cam_Val);
Serial.print("crank: ");
Serial.println(Crank_Val);
Serial.print("delay_micro: ");
Serial.println(delay_micro);
#endif
}
private:
unsigned int crank_offset_bit_shift;
unsigned int step;
unsigned int idle_rpm = 500; // RPMs
unsigned int idle_duration; // seconds
unsigned int idle_step_count;
unsigned int rpm = 500;
unsigned int step_size = 1;
};
bool CamArray[360] = {1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
bool CrankArray[360] = {1,1,1,1,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0};
timing CM2250(750, 30, 0, CamArray, CrankArray); // idle rpm, Idle Duration (seconds), Cam Array, Crank Array
void setup()
{
#if SERIAL_DEBUG
Serial.begin(115200);
#endif
pinMode(camPin, OUTPUT);
pinMode(crankPin, OUTPUT);
pinMode(potPin, INPUT);
CM2250.set_RPM(750);
CM2250.set_step_size(1);
}
void loop()
{
if (CM2250.get_angle() == 0)
{
CM2250.set_RPM((6 * analogRead(potPin)) + 1);
}
CM2250.do_steps();
digitalWrite(camPin, CM2250.Cam_Val);
digitalWrite(crankPin, CM2250.Crank_Val);
delayMicroseconds(CM2250.delay_micro);
}
Crank
Cam