Il
TSA6057 è un integrato vecchio e fuori produzione (il datasheet riporta
la data del 1997) ma ancora reperibile facilmente. Si tratta di un PLL
che accetta segnali da VCO esterni da 512KHz a 30 MHz (ingresso AM) e
da 30MHz a 150 MHz (ingresso FM), in questo progetto viene usato solo
l'ingresso FM. La comodità di usare questo integrato sta nel fatto che
non occorre impegnarsi in calcoli estenuanti per determinare i componenti
che formano il filtro, essi sono già forniti dal produttore e al
progettista spetta solo, una volta decisa la frequenza di interesse e lo
step di frequenza (che in questo chip purtroppo è limitato solo a
tre valori), deve effettuare una semplice divisione per ricavarne un
certo valore che va inserito in tre registri, DB0, DB1 e DB2. Questi
dati,
assieme all'indirizzo, al subaddress e a quelli di altro registro (DB3) devono essere inviati al chip tramite il protocollo I2C BUS, in totale, quindi, per poter
programmare il TSA6057 gli devono essere inviati 6 byte.
Il lavoro suddetto
viene facilitato dalla libreria "wire.h" di Arduino che implementa
semplici funzioni che gestiscono il protocollo I2C BUS, inoltre il
software da me creato evita anche di fare quella divisione di cui ho
parlato sopra,
fa tutto il programma, si deve solo inserire nelle varabili dello sketch i valori della frequenza e dello step desiderati.
L'aggancio
è veloce e la frequenza agganciata è precisa fino alla decina di
migliaia di Hz, (si hanno veloci variazioni attorno al KHz). Qui sotto
le immagini di tre frequenze agganciate, 50MHz, 66MHz e 80Mhz.
.
In
questo progetto l'insieme VCO-PLL riesce a coprire una banda di
frequenze che va da 50MHz a 80MHz quindi larga 30MHz, questa larghezza
di banda dipende dal guadagno del VCO.
La banda di interesse
dipende dalle nostre scelte a quale frequenza centrale
vogliamo far corrispondere i 2.5V, nel mio progetto ho scelto
66MHz, ma ognuno di noi può scegliere la frequenza centrale che più
desidera ricordandosi però che la larghezza di banda rimarrebbe sempre
di 30MHz e la frequenza più alta (o quella più bassa) agli estremi
della banda dovrebbe rimanere nei limiti di accettazione da parte
dell'ingresso FMI (30MHz a 150 MHz).
Tutto
il lavoro è stato eseguito a mano; lo schema elettrico a matita e le
piste della scheda sono state disegnate con pennarelli indelebili
(sempre a mano ovviamente). Qui sotto lo schema elettrico ed il piano
di montaggio:
Parliamo
ora del VCO cominciando dalla scelta del punto di riposo, se si sceglie
una corrente troppo bassa si ha bassa potenza in uscita, se si
sceglie una troppo alta si ha un notevole aumento di potenza, ma,
sempre tenendo conto dei limiti in corrente ed in potenza del
transistor, l'assorbimento cresce e questo potrebbe essere un problema
se si vuole alimentare il sistema con una batteria.
La mia scelta
è ricaduta su 10mA (ICQ), con questa corrente si riesce a fare erogare al transistor una potenza di:
PE = (VCC - VR8) * ICQ / 2 = (5 - 1) * 0.01 / 2 = 20 mW (13dBm)
Nella formula è stata trascurata la tensione di saturazione del transistor, VR8 è la caduta su R8.
Ora occorre assicurarsi che tutti i parametri (tensione, corrente e potenza) rientrino nei limiti del transistor.
La
tensione di alimentazione è 5V, trascurando la caduta su R8 si può
considerare che questa tensione sia presente tra il collettore e
l'emettitore, la VCE0 del transistor è 15V quindi più che il doppio
della tensione di alimentazione e possiamo stare tranquilli. La
corrente massima che sopporta il transistor è 100mA e anche per la
corrente stiamo a posto, per ultimo la potenza dissipata dal transistor
è PD = VCC * ICQ = 5 * 0.01 = 50mW che è molto minore di quella massima sopportata
dal transistor (0.5W per una temperatura del case di 100C° che,
in questo VCO, si potrebbe raggiungere solo mettendo il BJT sui
fornelli e non certo facendogli erogare la misera potenza di 13dBm).
Passiamo
ora al dimensionamento di R8, questa resistenza decide il valore della
corrente che vogliamo far passare nel transistor (10mA in questo caso),
la tensione (VR8) ai suoi capi è una questione di scelta, se si
scegliesse alta (relativamente ai 5V) si avrebbe una buona
stabilizzazione del punto di riposo del BJT ma si avrebbe meno
escursione del segnale (tra il collettore ed l'emettitore è presente
una tensione più bassa di quella di alimentazione (5V- VR8).
Se
si scegliesse bassa (sempre rispetto ai 5V) l'escursione del segnale
aumenterebbe ma il punto di riposo sarebbe meno stabile, la "rule del
thumb" ci indica la strada giusta e cioè la tensione VR8 può avere
valori compresi tra un 0.1 * VCC a 0.2 * VCC, la mia scelta è ricaduta
sulla seconda possibilità ovvero VR8 = 1V, da questo ricavo R8:
R8 = VR8 / ICQ = 1 / 0.01 = 100 ohm
Per quanto riguarda le resistenze di bias si procede in questo modo.
Si sceglie di far scorrere nelle due resistenze R9 - R10 una corrente IP = 0.1 * ICQ = 1mA. Si calcola la Resistenza R9:
R9 = VR9 / IP = (1 + 0.7) / 0.001 = 1700 ohm
e:
R10 = VR10 / IP = (5 - 1.7) / 0.001 = 3300 ohm
Dato
che spesso la teoria e la pratica fanno a pugni e anche perché ho dovuto
portare R9 ad un valore commerciale più vicino (1800 ohm)
conviene, nella fase iniziale del progetto, sostituire R10 con un trimmer con in serie una resistenza fissa in modo che il valore si possa variare attorno a 3300 ohm,
ad esempio, da 1000 ohm a 11K (un trimmer da 10K con una resistenza
fissa da 1K), alimentato poi il BJT bisogna regolare il
trimmer per avere una caduta su R8 pari ad 1 volt, fatto questo
bisogna dissaldare il trimmer e la resistenza fissa e misurare il valore
complessivo della serie. Per R10, quindi, scegliete una resistenza fissa
di valore commerciale il più vicino a quello letto, rifare poi la
misura della tensione VR8, se è molto diversa da 1V occorre usare per
R10 più di un resistore in serie o in parallelo (in questo progetto non
è stato necessario).
"Optimum resistance" ovvero la resistenza che dovrebbe vedere il BJT per erogare 20mW si calcola nel seguente modo:
RO = (VCC - VR8)^2 / (2 * PE) = (5 - 1)^2 / ( 2 * 0.02) = 400 ohm
Usando la carta di smith o i programmi in rete ho calcolato i valori di L2 e C19 per adattare i 400 ohm ai 50 ohm in uscita.
Per la "rule del thumb" la R.F.C. deve presentare una impedenza di almeno 10 volte la "Optimum resistance" in modo da non attenuare la tensione in uscita, quindi:
XLrfc = 10 * 400 = 4000 ohmda questo valore della reattanza ho ricavato il valore dell'induttanza alla frequenza più bassa della banda (50Mhz):
Lrfc = XLrfc / (2 * Pi * 50000000) = 12.7 uHNon
avevo un induttanza di quel valore che potesse sopportare una corrente
di 10 mA e allora ne ho usata una da 10uA 1A, a tal proposito quando vi
occorre una induttanza e ne trovate una con filo avvolto su nucleo ferromagnetico
guardate sul suo datasheet se va bene per le frequenze di vostro
interesse.
Per
dimensionare L1, C16 e C17, compito apparentemente semplice, richiede
molto tempo, non esistono procedimenti analitici date le diverse
variabili in gioco e occorre procedere per tentativi con l'ausilio
della carta di Smith.
Unica formula (blasonata) è quella per determinare L1:
L1 = 1/ [(2 * Pi * 66MHz)^2 * CT]dove:
CT = [C16 * C17 /(C16 + C17)] + CV dove CV è la capacità del Varicap a centro banda corrispondente a 2.5V.
In
realtà la formula è approssimata per la presenza di R8 in
parallelo a C17 tanto che [C16 * C17 /(C16 + C17)] diventa precisa solo
quando R8 risulta trascurabile rispetto alla reattanza di C17. Comunque
come dato di partenza si può utilizzare la formula suddetta, decidendo
a priori un valore per L1, si ricava il valore di CT e di seguito,
conoscendo CV, si ricavano i valori dei due condensatori C16 e
C17 ipotizzando che R8 non sia presente.
In
un circuito risonante più il Q è alto e più si approssima a quella
sinusoidale
la forma del segnale generato, il Q è proporzionale
alla resistenza vista dall'induttanza L1e inversamente proporzionale al
valore dell'induttanza stessa, ovviamente non si può scendere troppo
con il valore di L1 per questioni costruttive e perché le induttanze
parassite (ad esempio quelle costituite dalle piste) prevalgono
in maggior misura quanto è più piccola l'induttanza L1 rendendone
ininfluente la presenza. A questo punto per avere un Q decente non
rimane altro che far vedere ad L1 il più alto valore possibile di
resistenza.
Dalla parte del diodo varicap L1 vede R7 di 10 Kohm.
Dalla
parte di
C16, C17 L1 vede la resistenza R8 aumentata di valore (grazie alla
partizione dei condensatori), vedremo tra un po' di quanto viene
aumentata.
Come
partenza bisogna decidere che valore dare a L1, conviene
non scendere sotto i 100nH per i motivi sopra citati, io ho
scelto 110nH, la formula seguente va eseguita alla frequenza di
centro banda, nel mio caso a 66MHz.
CT =1/ [(2 * Pi * 66MHz)^2 * L1] = 1/ [(2 * Pi * 66MHz)^2 * 110nH)] = 52.8pF [C16 * C17 /(C16 + C17)] = CT - CV = 52.8 - 30 = 22.8pFdove CV è stato ricavato dal grafico seguente:
Per ricavare C16 e C17 (trascurando R8) basta moltiplicare per due il valore ricavato:
C16 = C17 = 22.8* 2 = 45.7pF Il valore commerciale più vicino è 47pF.
Ora, però bisogna verificare alcune cosine con l'ausilio del diagramma di Smith.
Per
avere un alto guadagno del VCO (KVCO), ovvero una elevata variazione
della frequenza per unità di volt, occorre che nella variazione di
capacità per cambiare frequenza sia predominante quella del diodo
varicap rispetto a quella fissa vista verso C16, C17 e R8 (Cvista), in
teoria quest'ulttima dovrebbe essere pari a zero per avere il massimo
guadagno, ma ovviamente questo non è possibile, comunque per avere un
discreto guadagno basta che la capacità vista sia dello stesso
ordine di grandezza di quella presentata dal varicap.
Usando la
carta di smith ho ricavato la capacità vista dal varicap che risulta
essere di CVista = 24.7pF (si nota che R8 in questo progetto influisce
poco sulla capacità complessiva che avrebbe dovuto essere 23.5pF se
l'avessi calcolata come semplice serie dei condensatori C16, C17).
Il
guadagno del VCO è il seguente:
KVCO = 9.4 MHz / V(si tenga presente che
nei calcoli precedenti e quelli a venire ho trascurato e trascurerò le
capacità parassite e quelle ai terminali del transistor).
Infine
la resistenza vista (Rvista) verso C16, C17 e R8 è pari a 427 ohm
e si trova in parallelo con la capacità equivalente, vedi foto sotto.
Mettendo
in parallelo a Rvista e Cvista la capacità del varicap e la R7, si ottiene il circuito equivalente che
viene visto da L1:
Ora determino il valore di L1 (sempre a 66MHz) con i nuovi valori:
L1 = 1/ [(2 * Pi * 66MHz)^2 * CT] = L1 = 1/ [(2 * Pi * 66MHz)^2 * 54.7pF] = 106.3nHed il Q:
Q = RT * Sqr(CT / L1) = 409 * Sqrt(54.7pF / 106.3nH) = 9.2Si
potrebbero ottenere Q più alti cambiando il rapporto C17 / C16
con C17 > C16 e mantenendo il valore della loro serie
invariato (23.5pF), in questo modo la R8 sarebbe trasformata a valori
più alti con il beneficio di ottenere un Q più alto, aumentando troppo il
rapporto R17 / R16 si rischia, però, di inibire la partenza
dell'oscillazione alle frequenze più basse, di fatto limitando
l'escursione del VCO, io, francatetta, con questo lavoro desideravo più
conoscere le performance del PLL che ottimizzare il VCO, se ne avete
voglia, comunque, sappiate che potreste farlo.
Per la programmazione del TSA6057 si procede in questo modo:
Si
immette il valore dell'indirizzo nel registro MODULE ADDRESS (nel
riquadro rosso nella foto sottostante), attenzione l'indirizzo è lungo 7
bit e non 8, il primo bit del registro (A0) è riservato al bit lettura
/ scrittura e viene gestito dalla funzione di scrittura su I2CBUS che
lo pone a zero. A1 può essere 1 o 0 e dipende dal pin AS del TPS6057
che può essere collegato a 5V o a gnd, questo serve per poter
indirizzare due integrati, io, il pin AS, l'ho messo a GND ,
quindi l'indirizzo da inserire nel registro "address" nello sketch di
Arduino è:
"address" = 0B1100010;
e NON 0B11000100
Il registro SUBADDRESS deve essere a zero.
Si sceglie la frequenza e lo step di frequenza, nel mio caso:
F = 66MHzStep = 25KHzSi ricava N:
N = F / Step = 66MHz / 25KHz = 2640Si converte N in binario:
Nb = 101001010000Si inserisce il numero binario nei registri DB0, DB1, DB2 come nella foto seguente (nel riquadro verde):
Il bit D0 di DB0 (CP) deve essere posto a zero (riquadro viola).
Il bit D2 di DB2 (BS) deve essere posto a zero (riquadro arancione).
Il bit D4 di DB2 (FM/AM OPAMP) deve essere posto a zero. (riquadro viola).
Il bit D5 di DB2 (FM/AM ) deve essere posto a uno. (riquadro marrone).
I bit D7, D6 di DB2 (REF1, REF2) debbono essere posti rispettivamente a uno e a zero (25KHz), (riquadro blu).
Tutto il registro DB3 deve essere posto a zero.
Qui di seguito ulteriori informazioni:
Nello sketch
di Arduino dovrete solo immettere la frequenza in hertz nella variabile
"frequenza" e lo step nella variabile "f_step", lanciato il programma
verranno visualizzate sul Modulo Seriale le due informazioni inserite
ed il valore binario nelle variabili DB0, DB1 e DB2 come nella foto sotto:
Il programma una
volta inviato i dati all'integrato si mette a riposo (sleep();) per far
assorbire meno corrente dalla alimentazione esterna (40mA nella
breve fase appena alimentato il sistema, 20mA a regime).
Alcune informazioni per l'audio modulante.
Il
segnale audio per modulare in frequenza il VCO viene inviato tramite
C20, R12, C21 al varicap, la banda passante è vocale (300Hz - 4KHz) qui
sotto alcune misure con l'analizzatore di spettro:
Audio in = 3V 1KHz
Audio in = 3V 4KHz
Per finire alcuni ritocchi.
Una
volta alimentato il sistema fatelo lavorare alla frequenza centrale da
voi scelta, con un tester tenete sotto controllo la tensione ai capi
del varicap, ruotate C3 per avere una migliore precisione della
frequenza, ruotate C19 per avere un maggiore livello di segnale in
uscita, allungate o stringete L1 fino a leggere sul tester una tensione di
2.5V, se non è sufficiente togliete o aggiungete spire a L1.
Qui il programma.
Fabio