Newsgroup: it.hobby.elettronica.digitale
Titolo: Comparare due clock

Ciao,
supponiamo di avere in ingresso a un PIC due segnali a onda quadra di 
30-40 Hz ciasuno. Voglio rilevare la differenza di fase *ad ogni ciclo* 
tra i due. Quale strada è più semplice/elegante?
Pensavo di usare semplicemente due interrupt e misurare il tempo tra i 
due eventi, date le basse frequenze in gioco la precisione sarebbe più 
che ottima.
Escluderei gli ingressi capture, perché sarebbero comodi per fare una 
media, ma mi perdo la possibilità di stimare il ritardo/anticipo ad ogni 
ciclo.
Altre idee? :)
Marco / iw2nzm

 ha scritto nel messaggio
news:admMf.9429$PR2.1...@twister2.libero.it...


Mi sembra che la tua idea sia corretta; se vuoi fare una cosa veramente
precisa devi usare la funzione "input capture" presente sulla serie
f87x per esempio, che permette di "memorizzare" l'istante di arrivo di
un segnale esterno con la precisione del ciclo di clock del PIC stesso.
Così ti puoi svincolare dall'interrupt (per la lettura vera e propria
della differenza di fase) che potrebbe risentire di jitters dovuti ad
altri interrupt concomitanti, da pezzi di codice critici con interrupt
disabilitati ecc....
Ciao

 che ottima.
I due segnali hanno la stessa frequenza? Se sì, per evitare di usare due
ingressi e due diverse ISR puoi combinare i segnali con una porta XOR.
Dopodiché la fase fra i due segnali sarà data dal duty cycle del segnale
ottenuto. Questa per inciso è la tecnica che utilizzano i comparatori di
fase digitali come il 4046 e amici (sul datasheet di quest'ultimo trovi
qualche informazione che può esserti utile).
-- 
asd

 qualche informazione che può esserti utile).
Vado a leggermi il datahseet. Immagino però che se la frequenza non è la 
stessa (come può avvenire nel mio caso) avrei una fase crescente 
linearmente (escludendo eventuale jitter) e quindi un duty-cycle 
variabile legato alla frequenza.
Forse però risulta ancora comoda come strada. Grazie!
Marco / iw2nzm

 un segnale esterno con la precisione del ciclo di clock del PIC stesso.
Non ho ancora usato la funzione capture ma avevo capito servisse per 
incrementare il registro del timer usando un segnale esterno. 
Probabilmente però si può usare anche in altro modo, come infatti 
suggerisci tu.
In questo caso come funziona? Ad ogni ciclo del segnale sul capture cosa 
succede?
Ciao e grazie,
Marco / iw2nzm

La funzione di input capture serve per svincolare completamente la CPU
per il calcolo di frequenze e fasi tra i segnali. Non fa altro che
memorizzare il valore di un contatore free running (Timer1) in
appropriati registri quando su un pin di ingresso c'e' un evento
selezionato da programma (rising edge, falling edge, any edge...). Il
programma deve comunque leggere il contenuto del registro prima che
accada un altro evento trigger, ma nel tuo caso (40Hz) non penso sia un
problema. Io ho usato questo approccio nella lettura di un
accelerometro Analog Devices che tirava fuori per ogni asse un segnale
a frequenza uguale e con duty cycle variabile con l'accelerazione. Se i
segnali non hanno la stessa frequenza il tutto si complica infatti non
so se ha un senso di parlare di differenza di fase, ma di misura di
frequenza: il discriminatore di fase con XOR non e' il migliore che si
possa fare, infatti funziona bene solo se le due frequenze sono
abbastanza vicine, in caso di range piu' ampio ci vuole un approccio
con dei latches (...).
Ciao

 variabile legato alla frequenza.
Direi proprio di sì, in quel caso la soluzione con i due ingressi separati
diventa molto più semplice. Se però usi i due ingressi, può essere
necessario che sfrutti le funzioni capture: due segnali a frequenza
arbitraria sono sostanzialmente asincroni fra di loro, e nelle circostanze
nelle quali i fronti si "avvicinano" troppo, le latenze degli interrupt e
del codice di gestione potrebbero introdurre un errore troppo grande.
Dipende tutto da quale precisione vuoi ottenere, e più in generale da qual
è lo scopo della tua applicazione.
-- 
asd