Newsgroup: it.hobby.elettronica.digitale
Titolo: Precisione sintesi di frequenza con PIC

Ciao a tutti,
dovrei realizzare 3 onde quadre con pic microchip (628 oppure qualcosa di
più piccolo) alla frequenze di 274 Hz, 173 Hz e54687 Hz. Mi chiedevo se con
un quarzo standard a 30 ppm posso ottenere una tolleranza di 0.5 Hz, anche a
lungo termine (invecchiamento quarzo).
Siccome direi di no, pensavo di utilizzare una frequenza esterna di 15625 Hz
di cui sono certo della precisione e stabilità. Moltiplicare questa
frequenza non è un problema, per cui volevo un consiglio su come procedere
per la stesura del software. Uso questa frequenza moltiplicata come clock e
mi servo di TMR0 e prescaler oppure avete qualche altra idea??
Grazie per le dritte.
--
FLA

 oppure avete qualche altra idea??
Se vuoi generare qualcosa di periodico meglio evitare come la peste i timer
interni... per quanto ne so vanno bene solo per una gestione "one-shot".
Un'eccezione a questo e' l'uscita PWM hardware dei PIC piu' grandi che e'
fatta apposta per generare un carrier costante, pero'i rapporti di divisione
impostabili difficilmente permetterebbero di ottenere la terza frequenza....
a meno di non regolare il moltiplicatore di cui parli per arrivare ad avere
il giusto rapporto di divisione.
Claudio F

Se è solo per la frequenza che devi generare e moltiplicarne una esterna non
è un problema allora non deve essere un problema nemmeno dividerla!

 mi servo di TMR0 e prescaler oppure avete qualche altra idea??
Uno o più NCO (Numerically Controlled Oscillator). Permettono di
generare con buona precisione uno o più segnali contemporaneamente, in
particolar modo onde quadre.
In pratica, si costruisce un loop di durata rigorosamente costante.
Supponiamo che il loop si ripeta FL volte al secondo.
Ogni segnale d'uscita necessita di un accumulatore di fase PH dotato
di B bit. Maggiore B, maggiore la "risoluzione in frequenza" ottenibile.
PH rappresenta la fase istantanea del segnale da sintetizzare.
Al range di valori 0..(2^B)-1 corrisponde lo "spazzolamento" di un
periodo del segnale. La fase (in gradi) è data da 360*2^B/PH
Dalla fase, per mezzo di una tabella di look-up WAVE[x] (eventualmente
ristretta ai bit più significativi di PH per ridurne le dimensioni)
si ricava il valore digitale del segnale da sintetizzare. Per le onde
quadre non serve nessuna tabella, basta prendere direttamente il bit
più significativo di PH come uscita.
loop: PH = PH + X (addizione a B bit, si trascura l'overflow)
      OUT = WAVE[PH]
      goto loop
Se X=1, per generare un intero periodo del segnale occorrono 2^B cicli
del loop. Quindi la frequenza sintetizzata è: FL/(2^B).
Per un generico X=N ottengo una frequenza N*FL/(2^B).
Con un accumulatore a B bit si genera un segnale a passi di FL/(2^B) Hz,
da 0 fino a una frequenza max teorica (sistema campionato) pari a FL/2.
In pratica è meglio fermarsi più in basso.
Per ottenere contemporaneamente più frequenze diverse, basta replicare
il codice usando altri accumulatori di fase e registri d'incremento.
Lo svantaggio di un NCO è che tanto più si sale in frequenza (rispetto
FL), tanto meno spettralmente puro è il segnale. Su un'onda quadra ci
sarà un jitter sui fronti di commutazione che può arrivare a 1/FL.
In pratica più si sale in frequenza, più il duty cycle traballa attorno
al 50%.
Circuit Cellar aveva pubblicato anni fa (n.99/1998, "Digital Frequency
Synthesis") un progetto basato su un PIC a 20MHz che generava via
software con l'ausilio di un dac esterno segnali sinusoidali fino a
qualche decina di kHz. 
http://www.dtweed.com/circuitcellar/caj00099.htm
(c'è il sorgente .asm)
Ciao
Adriano

Grazie mille ragazzi, siete stati molto utili.
Mi scarico un po' di datasheet e mi metto al lavoro.
Forse forse riesco a fare il tutto con un economicissimo 628. Ci provo e vi
faccio sapere.
Ciao
FLA