// Forum: https://forum.arduino.cc/t/complex-pwm-suggestions/1105836
// Code by: chrisdancer
// This Wokwi project: https://wokwi.com/projects/360369566076945409
/*
Pneumatic vibrator v.1.00 2023
*/
#define va 2
#define vb 3
unsigned long timenow;
unsigned long overrun;
unsigned long per_ab = 10000; //Period ab = 10ms (100Hz)
unsigned long dur_a = 3000; //Duration a = 3ms
unsigned long dur_b = 4000; //Duration b = 4ms
unsigned long half_per_ab;
unsigned long t_a_start;
unsigned long t_a_end;
unsigned long t_b_start;
unsigned long t_b_end;
boolean ledstate = false;
boolean start = true;
boolean run_ab = false;
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
pinMode(va, OUTPUT);
pinMode(vb, OUTPUT);
Serial.begin(9600);
half_per_ab = per_ab >> 1;
}
void loop() {
timenow = micros();
overrun = timenow - t_a_start;
if (bitRead(overrun, 31) == 0 ) { //If we're past the end of the cycle:
digitalWrite(va, true); //Valve A on
t_a_start = timenow + per_ab - overrun; //Set times for new cycle
t_a_end = timenow + dur_a - overrun;
t_b_start = timenow + half_per_ab - overrun;
t_b_end = t_b_start + dur_b;
}
else if((bitRead( (timenow - t_b_end), 31)) == 0 ) { //If we're past the end of pulse B:
digitalWrite(vb, false); //Valve B off
}
else if((bitRead( (timenow - t_b_start), 31)) == 0 ) { //If we're past the start of pulse B:
digitalWrite(vb, true); //Valve B on
}
else if((bitRead( (timenow - t_a_end), 31)) == 0 ) { //If we're past the end of pulse A:
digitalWrite(va, false); //Valve A off
}
// Serial port section goes here
digitalWrite(LED_BUILTIN, ledstate);
ledstate = !ledstate;
}