Thanks for your input,
I'd like to update the output sqaurewave as quick as possible, accuracy wise, an error margin of around 5% would be acceptable.
I've merged your code into mine, have I understood your code correctly?
/*
Read square wave speed signal in on pin2 and output squarewave speed on pin4
*/
volatile uint32_t lastPulseTime = 0;
volatile uint32_t lastPulseWidth = 0;
const int speed_in = 2; //sqaure wave input from speed source
const int gear_in = 3; //gear select input
const int speed_out = 4; //sqaure wave output
// variables for calculation
const float ratio1 = 1/ 2.315;
const float ratio2 = 1/ 1.731;
const float FD = 1 / 4.7;
const float idler = 1.04;
const float pulses = 4; //pulses per simultated revolution
float square_in; //speed received
float square_out; //speed to send
// the setup routine runs once when you press reset:
void setup() {
// initialize the digital pin as an output.
pinMode(speed_in, INPUT);
pinMode(speed_out, OUTPUT);
pinMode(gear_in, INPUT);
}
// the loop routine runs over and over again forever:
void loop() {
//Sample data to test
square_in = 1000000UL / lastPulseWidth;
/*
read the square wave speed input from "speed_in" into variable "sqaure_in"
*/
if (gear_in == HIGH) { //ratio1 is selected
square_out = square_in / 2 * ratio1 / idler * FD * pulses;
}//end of ratio1
square_out = square_in / 2 * ratio2 / idler * FD * pulses;
/*
//output the variable "sqaure_out" as square wave to "Speed_out"
*/
}
void registerPulse() {
uint32_t cur = micros();
lastPulseWidth = cur - lastPulseTime;
lastPulseTime = cur;
}