calcolare il tempo trascorso tra impulsi

usando la millis() entrano in gioco i tempi di durata del loop. In pratica un loop deve durare MENO della (almeno metà) durata del segnale alto o basso più corto. Pena non accorgersi del segnale.

gli interrupt da parte loro devono mantenersi leggeri o sminchiano i timer, quindi hai il problema del loop snello. dall'altra parte hai il problema che quindi i dati sono da elaborare nel loop, anche perchè molte funzioni all'intrno di una interrupt sono impossibili (in pratica tutto ciò che usa altri interrupt, come aggiornamento dei timer(i timer restano alla data di inizio interrupt, e il tempo perso non viene recuperato...), aggiornamento PWM(rimane il segnale di entrata in interrupt), e il discorso non è nemmeno così facile.
Diciamo che la via che reputo migliore è creare un buffer circolare di tempi-durata (dati grezzi, le elaborazioni rallenterebbero l'interrupt), l'interrupt riempie il buffer, e il riempimento del buffer deve avvenire in un tempo maggiore necessario ad un completo ciclo di loop più completa elaborazione di tutti i dati nel buffer.

mi sembra che potrebbe andare se non fosse che dovrei avere un tempo un po più preciso quello che ho adesso è una cosa nel ordine dei secondi

direi che il tuo problema è affrontabile con la millis, se nel tuo codice non usi delay o cicli molto pesanti computazionalmente, difficilmente il loop superera la durata di qualche centinaio di microsecondi (0.01 millisecondi, o 0.00001 secondi)

la precisione che puoi ottenere con gli interrupt è di circa 4microsecondi, dato che il timer si incrementa di 4micosec alla volta