unsigned long time, timer, eventTime=0, waitUntil_1 =0, waitUntil_2 = 0; //waitUntil_2 to be seeded with Phase shift in PWMs unsigned long eventInterval =1000; //Time [in mS] interval between each forward reverse event int fwdPinState, revPinState, stopPinState; const int fwdPin = 7; const int revPin = 3; const int stopPin = 2; const int PWM1_Pin = 13; // the number of the Output pin for PWM1 Signal boolean PWM1_Pin_state = false; // the state of PWM1 Signal const int PWM2_Pin = 12; // the number of the Output pin for PWM2 Signal boolean PWM2_Pin_state = false; // the state of PWM2 Signal const int PWM3_Pin = 11; // the number of the Output pin for PWM3 Signal boolean PWM3_Pin_state = false; // the state of PWM3 Signal const int PWM4_Pin = 10; // the number of the Output pin for PWM4 Signal boolean PWM4_Pin_state = false; // the state of PWM4 Signal boolean resetOnReversal = true; //Allows resettign all the variable once for reversal int Half_Pulse_Width = 14; //Half pulse width in milli Seconds int Pulse_Offset = 7; //Pulse offset in milli Seconds void setup(){ Serial.begin(9600); // used to debug program and write data to std out during run time pinMode(fwdPin, INPUT); pinMode(revPin, INPUT); pinMode(stopPin, INPUT); pinMode(PWM1_Pin, OUTPUT); pinMode(PWM2_Pin, OUTPUT); pinMode(PWM3_Pin, OUTPUT); pinMode(PWM4_Pin, OUTPUT); } void forwardMotor(unsigned long int forEventTime) { timer = 0; waitUntil_1 = 0; waitUntil_2 = Pulse_Offset; //making sure Pulse2_starts after the offset time in mS PWM1_Pin_state = false; PWM2_Pin_state = false; PWM3_Pin_state = false; PWM4_Pin_state = false; Serial.print("timer ="); Serial.print(timer); while (timer <= eventInterval) { if (timer >= waitUntil_1 ) { Serial.print("\n timer ="); Serial.print(timer); PWM4_Pin_state = !PWM4_Pin_state; PWM2_Pin_state = !PWM4_Pin_state; waitUntil_1 += Half_Pulse_Width; } if (timer >= waitUntil_2 ) { PWM3_Pin_state = !PWM3_Pin_state; PWM1_Pin_state = !PWM3_Pin_state; waitUntil_2 += Half_Pulse_Width; } digitalWrite(PWM1_Pin, PWM1_Pin_state); digitalWrite(PWM2_Pin, PWM2_Pin_state); digitalWrite(PWM3_Pin, PWM3_Pin_state); digitalWrite(PWM4_Pin, PWM4_Pin_state); timer = millis() - forEventTime; } return ; } void reverseMotor(unsigned long int revEventTime) { timer = 0; //re-setting timer to count for reversal waitUntil_1 = 0; waitUntil_2 = Pulse_Offset; //making sure Pulse2_starts after the offset time in mS PWM1_Pin_state = false; PWM2_Pin_state = false; PWM3_Pin_state = false; PWM4_Pin_state = false; while (timer <= eventInterval) { if (timer >= waitUntil_1 ) { PWM1_Pin_state = !PWM1_Pin_state; PWM3_Pin_state = !PWM1_Pin_state; waitUntil_1 += Half_Pulse_Width; } if (timer >= waitUntil_2 ) { PWM2_Pin_state = !PWM2_Pin_state ; PWM4_Pin_state = !PWM2_Pin_state; waitUntil_2 += Half_Pulse_Width; } digitalWrite(PWM1_Pin, PWM1_Pin_state); digitalWrite(PWM2_Pin, PWM2_Pin_state); digitalWrite(PWM3_Pin, PWM3_Pin_state); digitalWrite(PWM4_Pin, PWM4_Pin_state); timer = millis() - revEventTime; } return; } void loop(){ fwdPinState = digitalRead(fwdPin); revPinState = digitalRead(revPin); stopPinState = digitalRead(stopPin); if ( fwdPinState == HIGH ) { Serial.print("forward ="); // Serial.print (time); Serial.print (revPinState); forwardMotor(millis()); } if ( revPinState == HIGH) { Serial.print("Reverse ="); // Serial.print (time); Serial.print ("\n FPinState ="); Serial.print (fwdPinState); reverseMotor(millis()); } }