#define PWM1_PIN PA8
#define PWM2_PIN PA6
#define CAPTURE1_PIN PA0
#define CAPTURE2_PIN PA1
volatile uint32_t rise1 = 0;
volatile uint32_t period1 = 0;
volatile uint32_t rise2 = 0;
volatile uint32_t period2 = 0;
bool lastState1 = LOW;
bool lastState2 = LOW;
bool pwm2State = false;
uint32_t lastToggle = 0;
void setup()
{
Serial.begin(115200);
pinMode(PWM1_PIN, OUTPUT);
pinMode(PWM2_PIN, OUTPUT);
pinMode(CAPTURE1_PIN, INPUT);
pinMode(CAPTURE2_PIN, INPUT);
/* Hardware PWM : 100Hz */
analogWriteFrequency(100);
analogWrite(PWM1_PIN, 128);
}
void loop()
{
/* Software 500Hz generation */
if(micros() - lastToggle >= 1000)
{
lastToggle = micros();
pwm2State = !pwm2State;
digitalWrite(PWM2_PIN, pwm2State);
}
measureInput1();
measureInput2();
static uint32_t lastPrint = 0;
if(millis() - lastPrint >= 1000)
{
lastPrint = millis();
float freq1 = 0;
float freq2 = 0;
if(period1 > 0)
freq1 = 1000000.0 / period1;
if(period2 > 0)
freq2 = 1000000.0 / period2;
Serial.print("Freq1 = ");
Serial.print(freq1);
Serial.print(" Hz ");
Serial.print("Freq2 = ");
Serial.print(freq2);
Serial.println(" Hz");
}
}
/* -------- Measure CH1 -------- */
void measureInput1()
{
bool currentState = digitalRead(CAPTURE1_PIN);
if(currentState == HIGH && lastState1 == LOW)
{
uint32_t now = micros();
period1 = now - rise1;
rise1 = now;
}
lastState1 = currentState;
}
/* -------- Measure CH2 -------- */
void measureInput2()
{
bool currentState = digitalRead(CAPTURE2_PIN);
if(currentState == HIGH && lastState2 == LOW)
{
uint32_t now = micros();
period2 = now - rise2;
rise2 = now;
}
lastState2 = currentState;
}