this was code I implemented some time ago to measure the phase difference between two pulses - it was running on an ESP32 but should work on any fast microcontroller
// ESP32 - measure pulse width and and phase difference between two pulses
// updated for Arduino ESP32 core 3.0 see
// https://docs.espressif.com/projects/arduino-esp32/en/latest/api/timer.html
// note using hw_timer_t or micros() give similar values
hw_timer_t *Timer1_Cfg = NULL; // timer object
// pulse timing data
volatile uint32_t riseTime16, period, phaseTime;
// rising edge interrupt calculate period uSec
void IRAM_ATTR rising16() {
uint32_t rise = micros();
period = rise - riseTime16;
riseTime16 = rise;
}
// falling edge interrupt calculate pulse width uSec
void IRAM_ATTR rising17() {
phaseTime = micros() - riseTime16;
}
void setup() {
Serial.begin(115200);
delay(1000);
Serial.printf("\n\nESP32 measure pins 16 and 17 pulse information \n");
//Timer1_Cfg = timerBegin(0, 80, true); // API 2.x setup timer for 1uSec
if ((Timer1_Cfg = timerBegin(10000000)) == NULL) // API 3.0 setup timer for 1uSec
Serial.println("timerBegin Failed!!");
Serial.print("timerBegin() OK frequenmcy ");
Serial.println(timerGetFrequency(Timer1_Cfg));
// setup interrput routines - connect signal to pins 16 and 17
attachInterrupt(digitalPinToGPIONumber(16), rising16, RISING); // detect rising edge on pin 16
attachInterrupt(digitalPinToGPIONumber(17), rising17, RISING); // detect falling edge on pin 17
Serial.println("displaying results");
}
void loop() {
static unsigned long int timer = millis();
// if 2 seconds have elapsed since last redaing print results
if (millis() - timer > 2000) {
timer += 2000;
Serial.printf("period %lduSec frequency %.2fHz phaseTime = %lduSec phase difference %.1f \n",
period, 1000000.0/period, phaseTime, 360.0*phaseTime/period);
}
}
serial output 100Hz 50degree phase difference
period 9999uSec frequency 100.01Hz phaseTime = 1389uSec phase difference 50.0
period 10000uSec frequency 100.00Hz phaseTime = 1387uSec phase difference 49.9
period 10000uSec frequency 100.00Hz phaseTime = 1388uSec phase difference 50.0
period 10000uSec frequency 100.00Hz phaseTime = 1389uSec phase difference 50.0
period 10000uSec frequency 100.00Hz phaseTime = 1388uSec phase difference 50.0
period 10000uSec frequency 100.00Hz phaseTime = 1389uSec phase difference 50.0
period 10000uSec frequency 100.00Hz phaseTime = 1389uSec phase difference 50.0 ```
oscilloscope display
100Hz 120degree phase difference
period 10000uSec frequency 100.00Hz phaseTime = 3334uSec phase difference 120.0
period 10001uSec frequency 99.99Hz phaseTime = 3334uSec phase difference 120.0
period 10000uSec frequency 100.00Hz phaseTime = 3334uSec phase difference 120.0
period 10000uSec frequency 100.00Hz phaseTime = 3333uSec phase difference 120.0
period 10000uSec frequency 100.00Hz phaseTime = 3330uSec phase difference 119.9
period 10000uSec frequency 100.00Hz phaseTime = 3334uSec phase difference 120.0
period 10000uSec frequency 100.00Hz phaseTime = 3332uSec phase difference 120.0
period 10000uSec frequency 100.00Hz phaseTime = 3334uSec phase difference 120.0

