UNIVERSITA’ DEGLI STUDI DI CAGLIARI
Facoltà di Scienze Matematiche, Fisiche e Naturali
Corso di Laurea in Fisica
PROGETTAZIONE E REALIZZAZIONE DI UN SISTEMA DI
ACQUISIZIONE PER SPETTROSCOPIA γ
Relatore:
Prof. Paolo Randaccio
Tesi di Laurea di:
Alessio Atzori
Anno Accademico 2009/2010
1
INDICE
CAPITOLO 1
Introduzione
1.1
Introduzione........….............................................................................pag.5
1.2
Spettroscopia γ......................................................................................pag.5
-Rivelatori a scintillazione.......................................................................pag.5
-Il drogaggio negli scintillatori inorganici...................................................pag.10
-Il fotomoltiplicatore...........................................................................................pag.12
1.3
parametri di misura nella spettroscopia γ.........................pag.14
-Forma dell'impulso.............................................................................................pag.14
-Canali e conteggi............................................................................................pag.16
-Tempo vivo e tempo morto..............................................................................pag.16
CAPITOLO 2
Il dispositivo
2.1 Descrizione del dispositivo
…...............................................................pag.17
-Criteri di progettazione del dispositivo..........................................................................pag.17
-Caratteristiche Generali..................................................................................................pag17
-Schema a blocchi...........................................................................................................pag.18
2.1.1 Sezione di preamplificazione
-Circuito di attenuazione del segnale...................................................................pag19
-Circuito di amplificazione del segnale..............................................................pag.20
-Convertitore single ended – differenziale...........................................................pag21
2.1.2 Circuito di trigger...............................................................................pag.22
2
2.1.3 Circuito digitale
-L'ADC e il buffer...............................................................................................pag.23
-La RAM, i contatori e e le latch.........................................................................pag.25
-Il PIC32...............................................................................................................pag28
2.1.4 Sezione di alimentazione..................................................................pag30
2.2 Il processo di misura
-Diagramma di flusso: lato dispositivo …....................................................................pag. 31
-Diagramma di flusso: lato interfaccia grafica................................................................pag.32
2.3 Il firmware del PIC32 …..........................................................................pag.33
2.4 L'interfaccia grafica..................................................................................pag.46
2.5 Il prototipo e il circuito stampato.....................................................pag.48
CAPITOLO 3
Taratura del dispositivo
3.1 Taratura dei fondoscala..........................................................................pag.51
1.
-Taratura dell'offset del buffer----------------------------------..--------------------------------pag51
-Taratura dell'offset dell'amplificatore di guadagno........................................................pag.52
-Taratura dei fondoscala..................................................................................................pag.53
3.2 Taratura della banda passante...........................................................pag. 54
3.3 Taratura del circuito di trigger...........................................................pag.58
-Taratura dell'intervallo di variazione della tensione di soglia........................................pag.58
-taratura dell'isteresi........................................................................................................pag.59
3.4 Taratura dei fondoscala personalizzati..........................................pag.59
3
CAPITOLO 4
Un'applicazione : Misura di spettri di sorgenti monocromatiche e taratura
in energia di un rivelatore con scintillatore NaI(Tl)
4.1 Introduzione...................................................................................................pag.60
4.2 Apparato sperimentale.............................................................................pag.62
4.3 Procedimento ….............................................................................................pag.63
4.4 Elaborazione dei dati................................................................................pag.67
CONCLUSIONI
4
CAPITOLO 1
1.1
Introduzione
Lo scopo di questo lavoro di tesi è analizzare le procedure che portano alla progettazione e alla
realizzazione di un dispositivo di acquisizione dati per spettroscopia γ . Verranno analizzati i
principali dispositivi di rivelazione dei raggi γ prestando particolare attenzione ai rivelatori a
scintillazione inorganici usati in questo lavoro di tesi per ottenere una stima delle prestazioni del
dispositivo realizzato.
Sarà descritto dettagliatamente il circuito elettronico, il firmware del microcontrollore che gestisce
l'intero processo di misura, l'interfaccia grafica che ci consente la taratura dello strumento e l'analisi
dei dati provenienti dal dispositivo. Inoltre sarà illustrato il procedimento con cui è stato progettato
e realizzato il prototipo e il circuito stampato.
1.2
Spettroscopia γ
La spettroscopia γ si occupa di analizzare la distribuzione energetica relativa al decadimento γ di un
insieme di nuclei esaminati. Da tale distribuzione si ricava la probabilità che un nucleo in seguito ad
un decadimento γ emetta un fotone di una determinata energia .
Il metodo di rivelazione cambia a seconda del tipo di rivelatore . I rivelatori più comunemente
utilizzati nella spettroscopia γ si dividono in due categorie:
•
•
Rivelatori a scintillazione
Rivelatori a semiconduttore
In questo lavoro di tesi mi occuperò solamente dei rivelatori a scintillazione, usati per ottenere una
stima delle caratteristiche del sistema di acquisizione.
1.2.1
Rivelatori a scintillazione
Il funzionamento di un rivelatore a scintillazione si basa su una serie di processi che coinvolgono gli
atomi di cui è composto lo stesso scintillatore. In linea generale il processo che unisce l'incidenza
del fotone che vogliamo rivelare e l'effettiva captazione di tale fotone è scandito da 4 passaggi
1 il fotone γ incide sullo scintillatore
2 lo scintillatore reagisce producendo un certo numero di fotoni luminosi
3 tali fotoni vengono convertiti in elettroni da un fotocatodo
4 il flusso di elettroni viene “amplificato” da un fotomoltiplicatore
Le modalità di rivelazione di raggi γ dipendono dal tipo di interazione che tali raggi hanno con il
rivelatore stesso. Principalmente i meccanismi di interazione dei γ con la materia sono di tre tipi:
5
•
•
•
•
Effetto fotoelettrico
Effetto Compton
produzione di coppie
Ciascun effetto prevale sugli altri a seconda dell'energia del fotone incidente e del numero atomico
del materiale assorbitore.
Illustrazione 1: Grafico della dominanza degli effetti :
Fotoelettrico, Compton, produzione di coppie
Questi meccanismi portano al trasferimento dell'energia della radiazione ad uno o più elettroni che
compongono il rivelatore.
- Effetto fotoelettrico:
L'effetto fotoelettrico è generato dall'interazione di un fotone con un nucleo appartenente allo
scintillatore. Come si può vedere dal grafico l'effetto fotoelettrico è predominante alle basse energie
(per lo Iodio tipicamente al di sotto di 400 keV ).
Il fotone viene completamente assorbito, ciò vuol dire che tutta l'energia del fotone viene utilizzata
per eccitare l'atomo interessato alla collisione.
L'energia viene ceduta ad un elettrone da parte del fotone che assume un energia cinetica pari a
E e =ℏ −E s
Dove Es è l'energia di legame relativa ad una generica shell s .
Se l'energia del fotone è maggiore dell'energia di legame l'elettrone che viene accelerato può
passare in banda di conduzione . Successivamente questo si diseccita, tornando in banda di valenza
6
ed emettendo radiazione X di energia pari al gap che separa la banda di conduzione dalla banda di
valenza. In queste condizioni il fotone X che viene emesso viene riassorbito subito in quanto
possiede l'energia necessaria per compiere un'altra ionizzazione per effetto fotoelettrico. Tale
fenomeno viene chiamato “autoassorbimento”
La probabilità di interazione per effetto fotoelettrico dipende dall'energia del fotone incidente e dal
materiale di cui è composto l'assorbitore. Ecco un esempio dell'andamento della sezione d'urto in
funzione dell'energia del fotone incidente per uno scintillatore .
Illustrazione 2: Sezione d'urto per
l'effetto fotoelettrico
Si può notare il picco di probabilità per le shell K e L.
- Effetto Compton
L'effetto Compton è predominante nell'intervallo di energie che vanno (per lo Iodio) dalle centinaia
di keV fino a circa una decina di MeV . Il processo si può descrivere in questo modo: Un fotone con
energia molto maggiore dell'energia tipica di legame, incidendo su un atomo causa l'espulsione di
un elettrone che assume un'energia cinetica che dipende dall'energia del fotone e dall'angolo di
scattering. L'energia addizionale viene utilizzata per la creazione di un nuovo fotone.
Illustrazione 3: Schema di interazione per
l'effetto Compton
Energia cinetica dell'elettrone espulso: T =h −h '
7
h
Energia del fotone dopo la collisione: h ' =
h
1−cos 
m0 c 2
è l'energia dell'elettrone a riposo pari a 511 keV
1
Dome m0 c 2
La Sezione d'urto per singolo elettrone decresce al crescere dell'energia del fotone incidente.
Illustrazione 4: Sezione d'urto per
l'effetto Compton
-Produzione di coppie
Nella produzione di coppie si ha la conversione dell'energia del fotone in massa dovuta all'
interazione del fotone con il campo elettrico generato dal nucleo. Tale processo ha una soglia di
energia minima, ovvero energia del fotone deve essere superiore a 1,022 MeV .
In queste condizioni, l'energia del fotone viene convertita nella massa a riposo di una coppia
elettrone positrone. L'energia del fotone eccedente si sviluppa sotto forma di energia cinetica
associata alla coppia prodotta:
E e E e =h −2m 0 c 2
-
+
Illustrazione 5: Sezione d'urto della
produzione di coppie
8
Sezione d'urto totale
La sezione d'urto totale per l'interazione di un fotone con il materiale del rivelatore è data dalla
somma delle sezioni d'urto relative ai tre effetti sopraelencati:
= fotoZ  C  coppie
La sezione d'urto Compton σC è la sezione d'urto per singolo elettrone, per cui viene moltiplicata
per il numero atomico Z. La sezione d'urto totale è rappresentata dal grafico seguente:
Illustrazione 6: Sezione d'urto totale
Per poter rilevare efficientemente raggi γ, abbiamo bisogno di uno scintillatore in cui sono
predominanti l'effetto fotoelettrico e la produzione di coppie rispetto all'effetto Compton. Difatti
nell'effetto fotoelettrico e nella produzione di coppie il fotone γ viene completamente assorbito
mentre nel Compton solamente una parte dell'energia viene utilizzata. Se il fotone scatterato non
subisce altre interazioni può uscire dallo scintillatore senza venir rivelato . Come si può vedere dal
grafico (Illustrazione 1 ) la sezione d'urto per ognuno dei tre processi dipende dal numero atomico.
Precisamente :
Effetto fotoelettrico ~ Z4
Produzione di coppie ~ Z2
Effetto Compton ~ Z
La dipendenza dal numero atomico è molto più marcata nell'effetto fotoelettrico e nella produzione
di coppie.
Per aumentare l'efficienza di rivelazione dei fotoni γ possiamo quindi utilizzare materiali composti
da atomi con elevato numero atomico, in maniera tale da minimizzare l'effetto Compton.
9
Il drogaggio negli scintillatori inorganici.
L'aggiunta di impurità in scintillatori inorganici comporta l' aggiunta di livelli energetici nella
banda proibita chiamati “centri attivatori” .
Illustrazione 7: Schema a bande di un cristallo inorganico drogato
L'incidenza di un fotone nel cristallo può causare la creazione di una coppia elettrone lacuna libera
oppure può causare la formazione di un eccitone, ovvero uno stato legato formato da elettrone e
lacuna, la cui energia si trova appena sotto la banda di conduzione.
Una volta che è stata creata la coppia elettrone - lacuna, questi sono liberi di migrare
rispettivamente in banda di conduzione e banda di valenza. Se una lacuna incontra un centro
attivatore, strappa un elettrone da quest'ultimo, di conseguenza viene emesso un fotone . Se invece
un elettrone in banda di valenza incontra un centro attivatore, viene catturato e viene emesso un
fotone. In entrambi i casi l' energia dei fotoni emessi è minore del gap fra banda di conduzione e
banda di valenza, quindi questi hanno minore probabilità di essere riassorbiti dal materiale.
Nei cristalli drogati si avrà quindi un alta efficienza luminosa grazie all'attenuazione del fenomeno
dell'autoassorbimento . In secondo luogo si avrà uno spostamento della spettro del fotone incidente
comunemente chiamato “stokes shift”
Esistono diversi tipi di scintillatore, fra cui possiamo elencare :
•
Scintillatori organici :
Hanno un ottima risposta temporale (qualche ns) ma bassa risoluzione energetica .
Hanno un alta sensibilità al tipo di particella incidente, possono essere usati per analisi con
discriminazione di forma dell'impulso.
Sono composti a base di carbonio (Z=6), quindi non sono adatti alla rivelazione di γ a causa
della predominanza dell'effetto Compton
10
•
Scintillatori inorganici
Hanno una risposta temporale lenta (circa 10-7s)
Hanno una buona risoluzione energetica
Ha un emissione di luce che dipende dal tipo di particella incidente, possono essere usati per
analisi con discriminazione di forma dell'impulso.
Possono essere composti da atomi ad alto Z, quindi sono adatti alla rivelazione dei γ.
•
Scintillatori Plastici
Hanno un ottima risposta temporale (qualche ns) e buona risoluzione energetica
11
Il Fotomoltiplicatore
Per poter avere una misura dell'energia del fotone rivelato abbiamo bisogno di convertire i fotoni
prodotti nello scintillatore in una grandezza facilmente trattabile. Per questo motivo vengono
utilizzati i fotomoltiplicatori
Illustrazione 8: Schema di un tipico
fotomoltiplicatore
I fotoni provenienti dallo scintillatore incidono sul fotocatodo, qui per effetto fotoelettrico vengono
prodotti elettroni . L'energia dell' elettrone prodotto è data dalla formula E e =h − , dove 
è la frequenza del fotone incidente mentre  è la energia di prima ionizzazione dei materiali
(tipicamente Rubidio e Cesio) di cui è costituito il fotocatodo. L'efficienza di conversione del
fotocatodo dipende quindi dalla energia del fotone incidente e dal tipo di materiale utilizzato per la
realizzazione dello stesso.
Un altro importante parametro che indica la risoluzione spettrale del fotocatodo è l'efficienza
quantica definita come :
=
numero di fotoelettroni prodotti
numero di fotoni incidenti
Gli elettroni prodotti dal fotocatodo vengono emessi in direzioni casuali. Occorre quindi focalizzare
il flusso di elettroni sul primo dinodo attraverso l'elettrodo di focalizzazione. Tali elettrodi hanno
una forma che consente di creare una distribuzione spaziale di potenziale che permette di indirizzare
al meglio gli elettroni verso il primo dinodo:
12
Illustrazione 9: Schema del fotocatodo e del
focalizzatore
Gli elettroni urtando il primo dinodo producono elettroni secondari. Il processo di emissione di tali
elettroni è molto simile al processo di fotoemissione, l'unica differenza sta nel fatto che il fotone è
sostituito dall'elettrone.
Per ogni dinodo il guadagno del numero di elettroni dipende dal coefficiente di emissione
secondario. Tale coefficiente dipende dalla tensione applicata fra due dinodi V d secondo la
relazione:
= K V d 
Il guadagno totale alla fine della catena di moltiplicazione sarà:
G=n= KV d n
Dove n è il numero di dinodi presenti nel fotomoltiplicatore.
Per mantenere una tensione costante fra ogni dinodo successivo viene applicata fra il fotocatodo e
l'ultimo dinodo una differenza di potenziale di circa 1000 – 1500 V . La differenza di potenziale fra
due dinodi successivi dipende dal numero di dinodi. Viene utilizzato un partitore di tensione per
fornire a ciasuna coppia di dinodi una differenza di potenziale pari a un ennesimo della tensione di
alimentazione.
Disegno 1: Schema circuitale di un fotomoltiplicatore
13
Per evitare sbalzi di tensione agli ultimi stadi del fotomoltiplicatore vengono posti in parallelo alle
resistenze del partitore dei condensatori .
In uscita dal fototubo avremo una corrente che è proporzionale al numero di fotoelettroni emessi
dal fotocatodo il cui numero è proporzionale all'energia del fotone γ che ha inciso sul rivelatore .
In questo modo avremo una misura dell'energia del fotone che ha inciso sullo scintillatore.
1.3
Parametri di misura nella spettroscopia γ
Forma dell'impulso
La forma dell'impulso misurato all'uscita dal fotomoltiplicatore, dipende sostanzialmente
dall'elettronica presente nel fotomoltiplicatore. Il circuito all'interno di un fotomoltiplicatore può
essere schematizzato in questo modo:
Illustrazione 10: circuito equivalente di
un fotomoltiplicatore
Si suppone che il fotomoltiplicatore si comporti come un generatore di corrente ideale. La
resistenza e il condensatore sono la rappresentazione della resistenza e della capacità totale dei
dinodi, ovvero delle resistenze del partitore e dei condensatori di livellamento.
Supponiamo che la forma dell'impulso erogato dal generatore di corrente ideale abbia una forma
esponenziale del tipo:
−t
GNe   
I t=
e
s
s
Dove G è il guadagno del fotomoltiplicatore, N il numero dei fotoelettroni emessi, e la carica
dell'elettrone e τs è la costante di decadimento caratteristica dello scintillatore.
Questa ipotesi si avvicina molto alla realtà in quanto negli scintillatori il tempo di salita è molto più
piccolo del tempo di discesa.
La funzione di trasferimento del circuito è:
14
I t=
V t 
dV t 
C
R
dt
che ha per soluzione:
 GNeR 
 t 
 t 
−
 exp  −  − exp  −  
 τ 
 τ −τs 
 τs
V (t ) = 
 t 
  GNeR 
⋅
t
⋅
exp


− 
2

 τs
  τs 
per τ ≠ τ s
per τ =τ s
Dove τ=RC .Semplificando ulteriormente le formule sopraelencate si può ridurre la forma
dell'impulso al prodotto di due funzioni esponenziali.
V(t)
 t  
 t 
V0 (t ) = S 0 ⋅ exp  −  ⋅  1 − exp  −  
 τ1 
 τ 2 
 t 
V1 (t ) = S1 ⋅ exp  − 
 τ1

 t 
V2 (t ) = S 2 ⋅  1 − exp  −  
 τ 2 

S0 = S1 ⋅ S2
t
Illustrazione 11: Grafico dell'interpolazione
dell' impulso
Queste informazioni sono utili nel caso in cui si voglia calcolare la funzione matematica di
interpolazione dell'impulso.
Questa tecnica ci permette di rendere più precisa l'analisi degli impulsi. Difatti grazie
all'interpolazione dell'impulso possiamo andare oltre la risoluzione dei convertitori analogicodigitale che per loro natura convertono il segnale continuo in una serie di valori discreti. L'altro
vantaggio dell'interpolazione sta nel fatto che possiamo misurare impulsi la cui ampiezza cade al di
fuori dell' intervallo di misurazione . Questo ci permette di estendere l' intervallo di misura oltre il
limite imposto dal fondoscala prescelto . Questa tecnica consiste nel calcolare un impulso unitario
(S0 =1 ) in corrispondenza dell' impulso misurato . Per ogni valore di ascissa il rapporto fra valore
misurato e il corrispondente valore dell' impulso unitario è costante . Ovviamente questo non è vero
per impulsi reali soggetti a fluttuazioni statistiche dovute al rumore. In generale l'altezza istantanea
misurate è funzione lineare dell'altezza istantanea dell' impulso unitario:
yreale = m ⋅ yunitario + i
15
Dove m è il coefficiente angolare e i è l'intercetta. Tale metodo consiste quindi nel calcolare la retta
dei minimi quadrati considerando come variabile indipendente l'altezza istantanea dell' impulso
unitario . Se si scala l'impulso in maniera tale da rendere nulla l'intercetta i, l'altezza dell' impulso
calcolato sarà uguale al coefficiente angolare della retta dei minimi quadrati.
Canali e conteggi
Lo scopo della spettroscopia γ è quello di determinare la distribuzione di energia dei decadimenti di
un determinato emettitore γ. Per far ciò, sarà necessario poter disegnare un istogramma che ha per
ascisse i valori di energia misurati per ogni decadimento e in ordinata il numero di volte in cui
quella determinata energia si è presentata. Sperimentalmente non è possibile disegnare una
distribuzione continua, poiché ciò significherebbe avere uno spettrometro con risoluzione
infinitesima, per questo motivo vengono utilizzati i canali . I canali consentono di ridurre i valori di
energia distinguibili raggruppando tali valori all'interno di intervalli detti appunto canali.
Solitamente il numero di canali è una potenza di due . Se ad esempio si compie una misura di
spettro su 512 canali con un convertitore analogico-digitale da 12 bit (4096 divisioni), in ogni
canale cadranno 8 valori di energia.
L'utilizzo dei canali consente inoltre di velocizzare il processo di misura . Difatti la probabilità che
un determinato valore di energia cada in un canale è inversamente proporzionale al numero dei
canali.
Tempo vivo – tempo morto
Si può definire come tempo di misura, l'intervallo temporale che va dal superamento della tensione
di soglia da parte dell'impulso fino all'effettiva misurazione di questo . Questo intervallo di tempo è
in generale diviso in due parti :
-tempo vivo
-tempo morto
Si definisce tempo vivo l'intervallo di tempo che va dal superamento della tensione di soglia fino
all'interruzione della misura . In quest'intervallo si manifesta l'impulso che vogliamo misurare .
Il tempo morto invece è definito come l'intervallo compreso fra l'interruzione della misura e
l'effettivo risultato registrato (che può essere numerico o grafico) .
Ciò che assume un ruolo importante nella rivelazione di particelle è il tempo morto . Se ad esempio
si vogliono eseguire misure di temporizzazione è fondamentale che il tempo morto sia il più piccolo
possibile. Nel caso della spettroscopia γ tale parametro è di secondaria importanza in quanto ciò che
ci interessa misurare è l'energia dei fotoni incidenti. In ogni caso, il processo fisico che sta alla base
del decadimento γ è di natura probabilistica e quindi per migliorare la misurazione dello spettro
possiamo semplicemente prolungare la sessione di misura .
Ciononostante il tempo morto dev'essere comunque il più piccolo possibile per poter eseguire la
misura dello spettro nel tempo più breve possibile.
16
CAPITOLO 2
2.1
Descrizione del dispositivo
-Criteri di progettazione del dispositivo:
Il dispositivo è stato progettato tenendo in considerazione alcuni semplici criteri:
•
•
•
•
•
•
•
Deve essere in grado di misurare impulsi provenienti da rivelatori per spettroscopia γ
Deve dare la priorità alla misurazione delle ampiezze piuttosto che alla temporizzazione
degli impulsi.
Una volta assemblato deve poter essere completamente sviluppabile via software .
Deve essere realizzato limitando al massimo il numero di componenti con montaggio
superficiale.
Deve essere realizzato utilizzando il più possibile componenti facilmente reperibili
Il protocollo di comunicazione dev'essere il più semplice possibile.
Deve avere la possibilità di funzionare come un oscilloscopio digitale.
-Caratteristiche tecniche Generali:
•
•
•
•
•
•
•
•
•
•
Banda passante analogica di 10 MHz.
Frequenza di campionamento massima di 20 Msamples/s.
Risoluzione verticale massima di 1/4095 dell'intervallo di fondoscala.
Risoluzione orizzontale minima di 50ns.
Capacità del buffer di memoria di 64000 campioni a schermata
Risoluzione della soglia del trigger 1/255 dell'intervallo di fondoscala
Completamente configurabile dal PC
Tensione di alimentazione 5V
Corrente assorbita 400mA
Alimentazione diretta da porta USB o da alimentatore esterno .
17
-Schema a blocchi
Illustrazione 12: Diagramma a blocchi del dispositivo
18
2.1.1 Sezione di preamplificazione
il preamplificatore è composto da un limitatore un buffer un traslatore di livello, un amplificatore
invertente e infine da un convertitore single ended - differenziale. Alcuni parametri del
preamplificatore come il guadagno e l'offset vengono regolati da potenziometri digitali della
Microchip (MCP41050), che possiedono una resistenza massima di 50 kΩ e sono comandabili
attraverso la porta SPI (Serial Peripheral Interface) del microcontrollore. Il contatto mobile di tali
potenziometri può assumere 255 posizioni. La risoluzione di resistenza è quindi 1/255 di 50 kΩ
ovvero circa 196 Ω. Per maggiori dettagli sul protocollo di comunicazione si rimanda alla
sezione ....Firmware ecc ecc.
Circuito di attenuazione del segnale
il limitatore è composto da i due relè reed SIL05 -1A72 . comandati dal demultiplexer 74LS138 che
funge da buffer fra le porte RA3 RA4 e RA5 del PIC32 e gli avvolgimenti del relè.
Illustrazione 13: Schema circuitale dell'attenuatore e del buffer
E' possibile selezionare due tipi di attenuazione: la prima è nulla,ovvero il segnale passa attraverso
il relè RL1 senza venire attenuato la seconda comporta un attenuazione di 10 volte attraverso la rete
resistiva compensata costituita dalle resistenze da 900kΩ (R6 in parallelo con R7) e 100kΩ (R2) e
dal condensatore variabile C46. Si è scelto di comporre la resistenza da 900kΩ con due resistenze
da 1,8 MΩ in parallelo, in maniera tale da non dover ricorrere a resistenze di precisione all'1%. Va
19
sottolineato il fatto che per entrambe le attenuazioni l'impedenza in ingresso è di 1MΩ .Questo
permette di adattare lo strumento alle tipiche sonde “10x” che si trovano comunemente in
commercio. Tali sonde hanno una struttura circuitale di questo tipo:
Illustrazione 14: schema di una tipica sonda 10x
Questo tipo di sonda presenta uno switch con cui possiamo selezionare l'attenuazione del segnale
(1x o 10x), una resistenza di 100Ω, una resistenza da 9MΩ e un condensatore variabile tipicamente
alloggiato all'interno della sonda stessa. Nel caso in cui si selezioni l'attenuzione “10x” la
resistenza da 9 MΩ forma con la resistenza in ingresso di 1MΩ dello strumento un partitore di
tensione compensato che attenua il segnale di 10 volte.
Una volta attraversato lo stadio di attenuazione il segnale arriva ad un buffer a fet con architettura
cascode . Questo tipo di inseguitore di tensione è particolarmente indicato per misure di tensioni sia
alternate che continue in quanto presenta un elevata impedenza di ingresso e un elevata banda
passante.
I diodi D2 e D3 (1N4148) assicurano la protezione da tensioni maggiori di +5 V e minori di -5V
Il trimmer R1 consente la taratura dell'offset in uscita dall'inseguitore di tensione.
Circuito di amplificazione del segnale
Illustrazione 15: Schema circuitale del circuito di amplificazione
20
il segnale passa attraverso il partitore di tensione formato dalle due resistenze da 1k (R9 e R10) che
permette di dimezzare l'ampiezza del segnale e di aggiungere un offset determinato dal
potenziometro digitale U1 attraverso l'operazionale U5 che funge da adattatore di impedenza
(inseguitore di tensione) .In questo modo all'uscita del buffer costituito dall'integrato U8 abbiamo la
possibilità di ottenere un segnale sempre maggiore di zero.
Questo fatto è importante, in quanto il potenziometro digitale che funge da regolatore di guadagno,
che si trova nello stadio successivo, non accetta tensioni minori di -600mV rispetto al ground
analogico. Nel caso in cui la frequenza del segnale sia sufficientemente elevata tali circuiti integrati
sonno protetti da tensioni minori di -600mV, ciò non è vero nel caso di tensioni continue. Tale
inconveniente è risolto dal diodo Schottky D9 connesso a terra .
l'amplificatore invertente consente di ottenere un amplificazione con un guadagno variabile fra -0,5
e -10 Grazie al potenziometro digitale U10 configurato come resistenza variabile in serie
all'amplificatore invertente.
In parallelo al potenziometro digitale è posto il trimmer R15 che consente di regolare più finemente
il guadagno nei fondoscala la cui taratura è più critica, ovvero nei fondoscala che richiedono un più
elevato guadagno.
Al segnale proveniente dal buffer viene sommato attraverso la resistenza R22 una tensione costante
minore di zero settata dal trimmer R18 questo accorgimento consente di rimuovere l'offset aggiunto
nel precedente stadio.
Convertitore single ended – differenziale
Il convertitore single ended - differenziale consente di convertire il segnale singolo in una coppia
differenziale attraverso i due amplificatori operazionali U12 configurato come amplificatore
invertente e U13 configurato come amplificatore non invertente .Entrambi hanno guadagno
unitario.
Illustrazione 16: Schema circuitale del convertitore single ended-differenziale
21
Per ognuno dei due amplificatori viene aggiunto un offset di 1V fornito dalla stessa ADC .
Difatti il pin 4 dell'ADC fornisce una tensione altamente stabilizzata di un volt che consente di
avere un valore di riferimento stabile per la conversione analogico digitale. Questa tensione di
riferimento viene inviata al convertitore singolo-differenziale attraverso l'operazionale U17
configurato come inseguitore di tensione, che funge da adattatore di impedenza.
I diodi Schottky D4 e D5 fungono da protezione contro tensioni minori di -200 mV mentre i diodi
D6 e D7 proteggono l'adc da tensioni maggiori di 2V.
All'uscita dei due amplificatori avremo due tensioni, la cui differenza è pari al doppio della tensione
in ingresso.
Il Convertitore single-ended - differenziale ci permette di ridurre al minimo il rumore.
Infatti se supponiamo che su i due rami del convertitore agiscano rumori casuali, la differenza di
questi tenderà a zero mentre il segnale coerente viene amplificato correttamente.
2.1.2Circuito di trigger
il circuito di trigger è costituito dal comparatore AD8561 un potenziometro digitale MCP41050 con
buffer, il multiplexer 74LS151 e un doppio flip flop 74LS74.
Illustrazione 17: Schema circuitale del circuito di trigger
Il segnale analogico proveniente dall'uscita non invertente del convertitore single ended –
differenziale arriva al pin 3 del comparatore . qua viene confrontato con una tensione di riferimento
fornita dal potenziometro digitale U14 attraverso l'operazionale U18 che funge da adattatore di
impedenza. Per evitare falsi "scatti" del trigger ho preferito utilizzare l'architettura del comparatore
con isteresi . Attraverso la rete formata dal trimmer R31 e dalla resistenza R37, la tensione di
riferimento viene retroazionata con l'uscita del comparatore stesso.
22
In questo modo la tensione di riferimento oscilla con frequenza uguale alla tensione analogica in
ingresso, mantenendo comunque la forma di onda quadra. l'ampiezza di tale onda è pari a:
A=
R1
R1
⋅V CC −1=4
R1 R2
R1R 2
In questo modo il comparatore presenta una finestra di insensibilità attorno alla tensione di
riferimento di ampiezza pari all'ampiezza dell' onda presente sul pin 2 . quindi il comparatore scatta
alto soltanto se il segnale analogico attraversa sia il valore minimo della finestra sia il valore
massimo. Viceversa il comparatore scatta basso solo se il segnale attraversa sia il valore massimo
che il valore minimo.
In questo modo si evita che segnali piu o meno rumorosi facciano scattare più volte il comparatore
in vicinaza della tensione di riferimento.
il comparatore AD8561 presenta oltre all'uscita sul pin 7 anche l'uscita negata. Entrambi i segnali
vengono inviati al multiplexer 74ls151. Possiamo dunque selezionare quale dei due segnali di
trigger utilizzare attraverso il pin 11 del multiplexer comandata dalla porta RA6 del PIC32. Se tale
pin è posto a livello alto (3.3V) si seleziona l'uscita del comparatore negata, viceversa se si pone il
pin 11 a livello basso viene selezionata l'uscita del comparatore non negata.
Il doppio flip flop ha due funzioni :
La prima è quella di sincronizzare il segnale di trigger con il clock dell'adc .In secondo luogo,
attraverso una retroazione dell'uscita del primo flip flop nel clock del secondo, ci si assicura che
l'uscita del secondo flip flop scatti una sola volta . Tale circuito è comunemente detto circuito di
"one shot".
Attraverso il pin 4 del primo flip flop è possibile azionare il circuito di one shot. Se tale pin è posto
a livello basso il flip flop è insensibile a qualsiasi passaggio di stato del segnale di trigger. Appena
il pin 4 è posto a livello alto attraverso la porta RA7 del PIC32 il flip flop scatta basso in
corrispondenza del fronte di discesa del clock più vicino al fronte di discesa del segnale di trigger
avvenuto dopo il settaggio del pin4.
L'uscita Q del secondo flip flop rimane bassa fino al prossimo fronte di salita del set
2.1.3Circuito digitale
il circuito digitale è composto dall'ADC, da due buffer, da due RAM da due contatori e da due
Latch.
L'ADC e il buffer [6]
l'AD9235 è un ADC con architettura multistage differential pipeline con logica di correzione degli
errori .
23
Illustrazione 18: Schema circuitale dell'ADC e del buffer
L'ADC AD9235 della Analog Devices è in grado di convertire un segnale analogico in un numero
binario a 12 bit (un numero compreso fra 0 e 4095) che viene trasmesso in parallelo attraverso i 12
pin da 15 a 22 e da 25 a 28.
L AD9235 presenta due ingressi differenziali pin 9 e 10. L'intervallo massimo di conversione è
compreso fra 0,5 e 1,5 V.
Per analizzare al meglio il processo di conversione analogico-digitale, d'ora in poi, piuttosto che
riferirmi alla coppia differenziale che effettivamente viene convertita dall'ADC, mi riferirò al
segnale analogico come al segnale che troviamo all'uscita dell' amplificatore single-ended ovvero
all'uscita dell'operazionale U11.
L' intervallo compreso fra 0,5V e 1,5V corrisponde a un ampiezza massima del segnale single ended di 1 V da picco a picco centrato attorno a 0V .Il segnale analogico in uscita da tale
amplificatore varierà fra i -500mV e i +500mV.
Questo implica che la minima tensione convertibile all' uscita dell' amplificatore di guadagno U11 è
1V
, cioè 244 uV. Tale valore corrisponde alla risoluzione della conversione analogico
4095
digitale.
Il pin 1 è il pin Out of range, tale pin scatta a livello alto quando il segnale analogico supera il
limite di +0,5V o scende sotto i -0,5V
l'AD9235 è in grado di fornire una tensione di riferimento molto stabile al pin 4 . Si può comunque
scegliere se utilizzare la tensione di riferimento interna o una esterna semplicemente cambiando il
valore di tensione al pin 3 (SENSE)
Per la mia applicazione ho scelto la tensione di riferimento interna collegando il pin sense al ground
analogico.
L'AD9235 è in grado di campionare i segnali ad una frequenza massima di 40 milioni di campioni
per secondo.
La frequenza di clock massima generabile dal PIC32 non può superare i 20 MHz . Tale limite è
imposto dal circuito di temporizzazione delle periferiche . tale circuito a differenza del circuito di
temporizzazione della CPU presenta solamente dei divisori di frequenza. Quindi è possibile ottenere
24
solamente frequenze minori di 20 MHz, valore imposto dalla frequenza del cristallo. Tale frequenza
inoltre, è la massima sopportabile da tutte le periferiche del PIC32MX460l512f
Il pin 2 (MODE) consente di selezionare il formato dei dati in uscita . E' possibile scegliere fra
offset binary e two complements con o senza duty cycle stabilizer. per la mia applicazione ho scelto
il formato offset binary con duty cycle stabilizer ponendo il pin 2 a 1/3 della tensione di
alimentazione analogica attraverso la rete resistiva formata dalle resistenze R38, R39 e R40.
In questo modo alla tensione di - 500mV all' uscita dell' amplificatore U11 corrisponde il numero 0
(0000 0000 0000 in binario ) e alla tensione di 500mV corrisponde il numero 4095 (1111 1111 1111
in binario ).
Le uscite digitali passano attraverso un buffer tristate azionabile dal pin PWD.E' possibile quindi
porre tutte le uscite digitali ad alta impedenza. Purtroppo tali buffer non possono essere utilizzati
come comuni tristate nelle diverse procedure di scrittura e lettura, infatti settando a livello alto il pin
PWD si configurano i pin digitali da uscite a pin ad alta impedenza ma, contemporaneamente,
questo causa lo spegnimento totale dell'ADC. Questa modalità è stata progettata per soddisfare le
richieste di risparmio energetico in dispositivi alimentati a batteria . Difatti tutti i condensatori
interni che stabilizzano la tensione di riferimento vengono scaricati e l'intera ADC (a clock fermo)
consuma 1mW.
Il problema sta nel fatto che la carica e la scarica dei condensatori richiede circa 3ms, il che
comporterebbe un notevole ritardo fra le varie procedure di acquisizione. Se vogliamo ridurre al
minimo il tempo morto siamo costretti ad utilizzare un buffer tristate esterno, nel mio caso il
74HC245.
La RAM, i contatori e le latch
Illustrazione 19: Schema circuitale delle RAM, dei contatori e delle latch
25
Il dato binario a 13 bit (12 bit di dati + 1 di Out of range) all'uscita del buffer, viene inviato a due
ram da 8 bit dati e 17 bit di indirizzi in parallelo della Cypress CY7C1009.
Le due ram hanno quindi 131071 posti di memoria. La scelta della dimensione della memoria è
stata compiuta in base a parametri di reperibilità dei componenti e di semplicità del circuito. Difatti
in commercio gli integrati che svolgono funzioni di contatori latch e buffer hanno un numero di
porte che solitamente è multiplo di 2.indirizzare una memoria da 17 bit richiederebbe un minimo di
3 integrati per il contatore degli indirizzi e 3 integrati per la latch . Si è scelto di usare solo 65535
posti in maniera tale da indirizzare la memoria con 16 bit anzichè 17 rendendo possibile l'utilizzo di
due contatori binari a 8 bit e due latch a 8 bit .
Il salvataggio dei dati provenienti dall'ADC viene svolto sfruttando il metodo della decimazione .
Difatti l'ADC lavora a prestazioni sempre più elevate (quindi con errori sempre meno marcati) più
ci si avvicina alla frequenza di campionamento massima [6] .
Si è scelto quindi di far lavorare l'ADC ad una frequenza costante di 20 Megasamples/s mentre la
ram lavora a frequenze variabili comprese fra un massimo di 20 MegaSamples/s e un minimo che si
può portare ad un valore arbitrariamente basso.
I clock che temporizzano l'adc e il contatore che gestisce gli indirizzi sono sincronizzati, vale a dire
che sebbene le frequenze siano in generale diverse, ad un fronte di salita del primo corrisponde il
fronte di salita del secondo . Per mantenere la sincronia fra i due clock si è scelto di ridurre le scelte
della frequenza di campionamento a multipli di 1, 2 e 5 (tutti sottomultipli di 20) .
Sono possibili quindi frequenze di campionamento di 20MS/s, 10MS/s, 5MS/s,2MS/s, 1 MS/s e
cosi via . Se ad esempio scegliamo una frequenza di campionamento di 10 MS/s nella ram verrà
salvato un dato si e uno no, se invece scegliamo una frequenza di 2 MS/s verrà salvato un dato ogni
10.
La scelta della frequenza di campionamento condiziona il tempo massimo di misura. il tempo
massimo di misura è dato dal prodotto del periodo di clock per il massimo numero di posti
disponibili nella ram ovvero 65535.
Ad una frequenza di 20MS/s ad esempio il periodo di clock corrisponde a 50 ns, il tempo massimo
di misura è
N dati =Periodo ck⋅65535=50ns⋅65535=3,27 ms
E' ovvio che la scelta di una frequenza di campionamento più bassa comporta tempi di misura più
lunghi .
Sono presenti nelle ram anche dei pin di selezione fra cui due chip enable (CE1 e CE2) il write
enable WE e l'output enable OE. Per la mia applicazione ho scelto di tenere il CE2 a livello logico
alto mentre il CE1 può essere comandato dalla porta RC1 del PIC.
E' stata prevista comunque una modalità di lavoro che non prevede la partecipazione della RAM. In
questa modalità il PIC32 preleva i dati direttamente dal buffer dell'ADC. Tale modalità e' stata
prevista per campionamenti molto lenti come ad esempio nel caso della taratura di una termocoppia.
Per questo tipo di applicazioni il CE1 può essere tenuto a livello logico alto per disattivare la RAM.
Con i pin WE e OE si gestiscono le fasi di scrittura e lettura. Per la fase di scrittura, il pin WE
dev'essere posto a livello logico basso mentre il pin OE a livello logico alto. Vale il viceversa nella
fase di lettura.
Durante la fase di progettazione è risultato evidente che la gestione dei livelli WE e OE è piuttosto
critica durante la fase di scrittura. Difatti se si mantiene basso WE per tutto il periodo di scrittura, si
presentano sovente degli errori digitali dovuti a dati scritti non correttamente in memoria. Questo
può essere causato dal fatto che la sincronia fra gli indirizzi forniti dal contatore e i dati provenienti
26
dall'adc non è perfetta. se si tiene basso WE si rischia di scrivere un dato parzialmente o non
correttamente in un indirizzo e magari invalidare anche il dato nell'indirizzo successivo. per
Aggirare questo problema Ho preferito collegare il WE con il clock del contatore . In questo modo
la scrittura può avvenire solo quando l'indirizzo fornito dai contatori è stabile. Difatti, fornendo un
clock con il 50% di duty cycle, deve passare almeno mezzo periodo di clock prima che il dato possa
essere scritto. In questo tempo l'indirizzo ha la possibilità di stabilizzarsi all'uscita del contatore.
In secondo luogo fra il clock del contatore il dato binario corrispondente al conteggio esiste un
piccolo ritardo quantificabile attorno ai nanosecondi. Chiudendo la scrittura pochi nanosecondi
prima che l'indirizzo cambi ci si assicura che nella RAM venga salvato l'ultimo dato in uscita dal
buffer dell'ADC.
I contatori sn74lv8051 sono contatori a 32 bit con uscita demultiplexata da 32 a 8. Uno solo di
questi contatori è in grado di contare fino a 4'294'967'295 (il corrispettivo di 2 32-1), ma all'uscita
può presentare al massimo un numero a 8 bit . Per la mia applicazione mi sono servito di due
contatori di questo tipo configurati entrambi come contatori a 16 bit. Entrambi contano fino a 65535
ma dal primo seleziono attraverso il decoder interno il byte basso (primi 8 bit) e dal secondo
seleziono il byte alto (ultimi 8 bit). In questo modo ho un contatore a 16 bit in parallelo che è in
grado di indirizzare correttamente la RAM.
E' importante sottolineare il fatto che tale contatore arrivato all'ultimo conteggio si autoazzera e
continua il conteggio. Questo implica che l'architettura della memoria è ad anello .
I pin GBL e GBU di entrambi i contatori vengono collegati a i 3.3V digitali, mentre il pin GAL nel
contatore del byte basso, collegato con il pin GAU dell'altro contatore, viene utilizzato come pin di
tristate . Ponendo a livello basso tali pin si seleziona il byte basso nel primo contatore e il byte alto
nel secondo i quali si presentano ai pin di uscita dei rispettivi contatori. Ponendo a livello alto GAL
e GAU le uscite passano nello stato di alta impedenza.
I pin CCLR posti a livello logico basso consentono di azzerare il conteggio.
Le Latch 74LS373 consentono di memorizzare l'indirizzo corrispondente all'istante di trigger .
Le uscite sono connesse a gli ingressi, ed entrambi sono connessi in parallelo al bus degli indirizzi.
Ponendo a livello logico alto il pin 11 (ENABLE) di ciascuna latch si setta lo stato di scrittura.
Tale pin è connesso all'uscita del flip flop, un fronte di discesa su questo pin quindi, corrisponde ad
un evento di trigger.
Quando il pin 11 viene posto a livello logico basso le latch tengono in memoria l'ultimo indirizzo
presente agli ingressi prima del fronte di discesa . In questo modo Abbiamo a disposizione un punto
di riferimento per la fase di lettura dalla ram, ovvero abbiamo l'indirizzo di memoria in cui si è
manifestato l'evento di trigger.
Ponendo il Pin 1 (OUTPUT CONTROL) a livello logico alto configuriamo le uscite della latch
nello stato di alta impedenza. In questo modo possiamo chiudere le porte in uscita durante la fase di
scrittura, aprirle poco prima della fase di lettura per leggere l'indirizzo di trigger e richiuderle
durante la fase di lettura per consentire al PIC32 di Indirizzare correttamente la RAM.
27
Il PIC32 [2]
Illustrazione 20: Schema circuitale del PIC32
Il PIC32MX460l512f è un microcontrollore della Microchip con core a 32 bit e architettura mips.
può raggiungere un massimo di 80 milioni di istruzioni al secondo .E' dotato di interfaccia USB con
cui può comunicare con un PC .
Il PIC32 presenta oltre alla CPU diverse periferiche che possono funzionare in maniera
indipendente da essa. Fra le periferiche disponibili sono state utilizzate:
•
•
•
•
Timer 2,3,4,5.
Output Compare
Porte I/O (A,B,C,D,E)
SPI
I timer sono dei contatori binari interni al pic che "contano" il numero di pulsazioni provenienti dal
cristallo (20MHz). Attraverso dei divisori di frequenza è possibile incrementare il conteggio in
presenza di un determinato fronte di salita del segnale fornito dal cristallo. Tali divisori vengono
chiamati prescaler e la scelta del divisore di frequenza è limitata a 1, 2, 4,8, 16, 32, 64 e 256 . Ad
28
esempio se si sceglie il prescaler 1, il timer conterà ogni fronte di salita, lavorando quindi ad una
frequenza di 20MHz se si sceglie il prescaler 4 invece il contatore conta un fronte di salita ogni 5
lavorando ad una frequenza di 5 MHz.
Come già ho anticipato la frequenza massima di lavoro dei timer è limitata a 20 MHz proprio per il
fatto che sono presenti solo dei divisori di frequenza.
I timer sono stati utilizzati per due scopi.
1)Generazione dei segnali di clock
2)Temporizzazione dei processi
Per generare i segnali di clock che regolano la frequenza di campionamento dell'ADC e la
frequenza di decimazione della ram sono stati utilizzati rispettivamente i timer 2 e 3.Si tratta di
contatori a 16 bit, capaci quindi di contare fino ad un massimo di 65535 fronti di salita . Il timer 2
Viene impostato ad una frequenza fissa di 20MHz per ottimizzare le prestazioni dell'ADC, mentre il
timer 3 può scendere fino ad un minimo di 1KHz.
Il modulo output compare permette di generare un segnale impulsivo la cui durata (tempo di ON e
tempo di OFF) viene regolata dai timer . Per poter generare segnali di clock ho bisogno che l'output
compare generi impulsi in maniera continua .Per fare questo impongo che l'output compare scatti
ogni volta che il timer raggiunge il conteggio numero 0 . Regolando il periodo del timer si riescono
ad ottenere segnali di clock con tutte le frequenze di cui abbiamo bisogno
I timer 4 e 5 sono stati utilizzati invece per la temporizzazione dei processi. In particolare è stata
utilizzata la funzione Timer45() che permette di far funzionare i due timer a 16 bit come un unico
timer a 32 bit, prendendo il timer 4 come word bassa e il timer 5 come word alta . Il Timer45 Viene
utilizzato durante la fase di “tempo vivo“ per avere una misura dei tempi di pre-rigger e di posttrigger. Grazie a questo timer infatti, è possibile far scattare un interrupt che abilita il circuito di
trigger una volta che il timer di pretrigger è esaurito. Allo stesso modo, l'esaurimento del timer di
post trigger comporta un interrupt che interrompe la fase di tempo vivo.
Le porte di Input/output mi permettono di gestire tutti i segnali di controllo del circuito. Tutte le
porte possono essere configurate sia come input che come output . E' possibile mandare una porta o
un gruppo di bit appartenenti ad una porta, in uno stato di alta impedenza. Per fare questo basta
configurare la porta come input.
L'SPI è una periferica che permette di comunicare con i potenziometri digitali . Come qualsiasi
periferica di comunicazione seriale presenta un pin di clock (pin 10) e un pin di dati (pin 12). Per
poter comunicare in maniera univoca con uno dei tre potenziometri digitali, abbiamo bisogno di tre
pin di “chip enable” che servono per dichiarare quale dei tre potenziometri deve ricevere il dato
seriale. Tale compito è svolto dalle porte RA1, RA2 e RA3.
Per poter modificare la posizione del contatto mobile nei potenziometri digitali, abbiamo bisogno
di una parola a 16 bit. I primi 8 bit formano il Byte di “comando”.
La struttura del comando per l'MCP41050 è implementata in questo modo:
29
Per la mia applicazione abbiamo bisogno solamente del comando “Write Data” sul potenziometro 0,
corrispondente al dato binario 00010001.
2.1.4 Sezione di alimentazione:
Il dispositivo ha bisogno di 5 linee di alimentazione separate:
3,3V digitali : alimentano il PIC32, le RAM, i contatori, i buffer dell' ADC e parte dell'ADC.
questa tensione è fornita dal convertitore DC-DC NCP1117
5V digitali : alimentano il comparatore, il multiplexer, il demultiplexer, le latch e il flip flop.
questa tensione proviene direttamente dalla linea di 5V della porta USB
±5V analogici : alimentano tutto il circuito di preamplificazione. Sono forniti da un convertitore
DC-DC della Traco TMA0505D
3,3V analogici : alimentano la parte analogica dell ADC. Questa tensione è fornita da un NCP1117
Tutti gli integrati alimentati da tensioni digitali hanno uno o più condensatori connessi all'
alimentazione e a ground . Questo accorgimento attenua i rumori sulla linea di alimentazione che
possono causare errori nel circuito digitale.
Il dispositivo presenta inoltre due linee di ground distinte:il ground analogico e il ground digitale.
Il ground analogico è condiviso da tutti i componenti del preamplificatore, mentre il ground digitale
è condiviso dai componenti restanti. Il ground digitale è direttamente connesso alla linea di ground
della porta USB
I due ground si connettono in un solo punto attraverso un nucleo in ferrite . Questo aiuta a ridurre il
rumore che il ground digitale potrebbe iniettare nel ground analogico . Inoltre è presente un
condensatore al tantalio fra i due ground, posto vicino al convertitore DC-DC da 5 a ±5V . Questo
aiuta a ridurre il rumore di ripple causato dallo stesso convertitore DC-DC, la cui frequenza si
aggira attorno ai 100kHz.
30
2.2
Il processo di misura
Il processo di misura è gestito in parte dal PIC32 e in parte dall'interfaccia grafica . La gestione dei
processi viene eseguita rispettando una sincronia di comunicazione fra il PIC32 e l'interfaccia
grafica . Per rendere più chiara questa sincronia illustrerò il processo di misura dal punto di vista del
dispositivo e dal punto di vista dell' interfaccia grafica.
Diagramma di flusso: Lato dispositivo
Start
Modalità di m isura è One s hot
oppure Repe at
Configura
porte
Fai Partire Timer di
pre- trigger
Attendi Configurazione
daInterfaccia grafica
L'ADC salva i dati
sulla RAM
Configurazione
ricevuta?
No
Timer
esaurito?
Si
No
Si
Invia conferma di
ricezione a interfaccia
grafica
Attendi evento di
Trigger
Configura sistema
L'ADC salva i dati
sulla RAM
Si è manifestato
evento di trigger?
Abilita RAM in
scrittura
No
Si
Fai partire il timer di
post-trigger
Modalità di misura
No
è Free run?
L'ADC salva i dati
sulla RAM
Si
Timer
esaurito?
Fai partire Timer di
pos t-trigger
No
Si
Scarica RAM
L'ADC
salva i dati isulla RAM
No
Timer
esaurito?
Si
Invia dati a interfaccia
grafica
31
Diagramma di flusso: Lato interfaccia grafica
Start
Modalità di misura
è free run o Repeat?
No
Attendi comando di
avvio dall'utente
Si
Invia configurazione a
PIC32
Si
Comando di
avvio Ricevuto?
No
Attendi conferma di
configurazione
avvenuta
Conferma
ricevuta?
No
Si
Attendi pacchetto dati
Pacchetto
ricevuto?
No
Si
Elabora dati
Come si può capire dal diagramma di flusso esistono due cicli di misura principali:
1. Ciclo “Free run”
2. Ciclo “Repeat – One shot”
Nel primo caso il non si ha bisogno di nessun evento di trigger. In questa modalità il dispositivo
funziona come un comune oscilloscopio senza circuito di trigger. La fase di tempo vivo viene fatta
partire appena tutto il sistema è pronto e viene interrotta una volta che il timer di post-trigger si
esaurisce.
Questo comporta una misura asincrona con il segnale che vogliamo misurare, ma è comunque utile
per capire quale intervallo di tensioni può coprire il segnale analogico.
Nel secondo caso, invece, il PIC32 fa partire il timer di pre-trigger. Questo è un timer “di guardia”
32
nel senso che impedisce al circuito di trigger di scattare finchè non è passato un tempo maggiore o
uguale al periodo di pre-trigger. In questo periodo vengono comunque salvati i dati sulla RAM. Una
volta che il timer di pretrigger è esaurito, il PIC32 abilita il circuito di trigger . Appena si manifesta
un evento di trigger viene fatto partire il timer di post-trigger . Una volta esaurito anche il timer di
post-trigger la fase di tempo vivo si conclude.
E' da sottolineare il fatto che durante le fasi di tempo vivo il pic non esegue nessuna operazione di
controllo del circuito . Nel diagramma di flusso,ho evidenziato queste fasi in arancione . Durante il
salvataggio dei dati sulla RAM, il PIC32 rimane in attesa di un evento di trigger oppure attende che
i timer si esauriscano.
La sincronia fra il PIC32 e l'interfaccia grafica è mantenuta da alcune funzioni di controllo . Nel
diagramma di flusso ho evidenziato tali funzioni. Precisamente ho evidenziato con gli stessi colori i
processi di comunicazione che avvengono fra PIC32 e l'interfaccia.
Tutte le comunicazioni avvengono tramite la porta USB attraverso un protocollo di emulazione
seriale : IL CDC SERIAL EMULATION. Viene cioè installato sul computer un driver che permette
di riconoscere la porta USB come se fosse una porta seriale . Il PIC32 si serve di apposite librerie
per poter comunicare con questo metodo mentre l'interfaccia grafica usa il protocollo della porta
seriale già esistente. Questa scelta permette di rendere le comunicazioni fra PIC32 e l'interfaccia
seriale molto semplici e dirette, a discapito però della velocità di comunicazione. Grazie a questo
tipo di comunicazione, si possono richiamare solo due tipi di eventi : trasmissione e ricezione.
2.3
Il firmware del PIC32
/**************************************************************************
FIRMWARE PAI_SCOPE - OSCILLOSCOPIO DIGITALE
ALESSIO ATZORI
***********************************************************************/
/************
* Includes *
************/
#include "HardwareProfile.h"
#include "GenericTypeDefs.h"
#include "usb/usb.h"
#include "usb/usb_device_cdc_serial.h"
//#include "io_cfg.h"
#include "plib.h"
#include "p32xxxx.h"
#include "stdio.h"
#include "stdlib.h"
33
/**********************
* Configuration Bits *
**********************/
#ifndef OVERRIDE_CONFIG_BITS
#pragma config UPLLEN = ON
// USB PLL Enabled
#pragma config FPLLMUL = MUL_20
// PLL Multiplier
#pragma config UPLLIDIV = DIV_5
// USB PLL Input Divider
#pragma config FPLLIDIV = DIV_5
// PLL Input Divider
#pragma config FPLLODIV = DIV_1
// PLL Output Divider
#pragma config FPBDIV = DIV_1
// Peripheral Clock divisor
#pragma config FWDTEN = OFF
// Watchdog Timer
#pragma config WDTPS = PS1
// Watchdog Timer Postscale
#pragma config FCKSM = CSDCMD
// Clock Switching & Fail Safe Clock Monitor
#pragma config OSCIOFNC = OFF
// CLKO Enable
#pragma config POSCMOD = HS
// Primary Oscillator
#pragma config IESO = OFF
// Internal/External Switch-over
#pragma config FSOSCEN = OFF
// Secondary Oscillator Enable
#pragma config FNOSC = PRIPLL
// Oscillator Selection
#pragma config CP
= OFF
// Code Protect
#pragma config BWP = OFF
// Boot Flash Write Protect
#pragma config PWP = OFF
// Program Flash Write Protect
#pragma config ICESEL = ICS_PGx2
// ICE/ICD Comm Channel Select
#pragma config DEBUG = OFF
// Debugger Disabled for Starter Kit
#endif // OVERRIDE_CONFIG_BITS
/***************
* Global Data *
***************/
typedef enum _app_state
{
BUFFER_EMPTY = 0,
// Buffer is empty & available to receive data.
RECEIVING_DATA,
// App is waiting to receive data from USB.
DATA_AVAILABLE,
// Data has been received, app can act on the data.
SENDING_DATA
// App is waiting for data to finish sending on USB.
} APP_STATE;
BYTE
BYTE
BYTE
BYTE
BYTE
gSize;
Comando[12];
Risposta[9];
Richiesta[2];
Data[5000];
APP_STATE gState;
// AT Command String
char gCommand[8];
int C=0;
int M=0;
int I=0;
int S=0;
int R=0;
unsigned short j=0;
WORD i=0;
int q=0;
//Uninitialized data, cleared to zero.
//Variabile configurazione :C=0 configurazione non ricevuta ; C=1 configurazione eseguita
//Variabile di misura
//Variabile di scaricamento
//Variabile di controllo invio
//Variabile di controllo ricezione
//Variabile conteggio dati
//Variabile conteggio campioni
//Variabile conteggio pacchetti
34
int d=0;
int tic=0;
//Variabile di ritardo
BYTE gain=110;
BYTE offset=110;
BYTE limit=1;
BYTE thresh=128;
BYTE clock=0;
BYTE base=7;
BYTE slope=1;
BYTE mode=1;
DWORD basediv=7999;
WORD clockdiv=1;
WORD start_ad;
WORD stop_ad;
WORD trig_ad;
// variabile di configurazione del potenziometro del guadagno
// variabile di configurazione del potenziometro dell'offset
// variabile di configurazione dei relè del limitatore
// variabile di configurazione del potenziometro del threshold
// variabile di configurazione della frequenza di campionamento
//variabile di configurazione del tempo totale di misura
//variabile di configurazione della pendenza dell'evento di trigger 1:positiva 0:negativa
//variabile di configurazione della modalità di misura 0 :free run 1 : repeat - one shot
//variabile del divisore del timer45 (32 bit)
//variabile del divisore del timer2 (clock della ram)
//indirizzo di inizio del pacchetto
//indirizzo di di fine del pacchetto
//indirizzo dell'evento di trigger
WORD pretrig;
DWORD intpre;
basediv)
WORD stop;
WORD pre_ad;
WORD last_pkt_sz;
//variabile di configurazione del timer di pre-trigger
//Variabile di normalizzazione del timer di pre-trigger (normalizza pretrig al valore di
//numero di campioni per pacchetto
//numero di campioni presenti nell'intervallo di pretrigger
//dimensione dell'ultimo pacchetto inviato
// Notification Data
CDC_NOTIFICATION gNotification =
CDC_INIT_NOTIFICATION(RESPONSE_AVAILABLE,0,CDC_COMM_INTF_ID,0);
/*************************************************************************
* Function:
CdcDemoEventHandler
*
* Preconditions: 1. The system must have been built with the CDC Serial
*
Emulation function driver.
*
*
2. This routine must be linked as the CDC Serial
*
function driver's application event handler.
*
*
3. USBInitialize must have been called to initialize
*
the USB SW Stack.
*
*
4. The host must have configured the system as a USB
*
CDC Serial Emulation Device.
*
* Input:
event
Identifies the bus event that occured
*
*
data
Pointer to event-specific data
*
*
size
Size of the event-specific data
*
* Output:
none
*
* Returns:
TRUE if the event was handled, FALSE if not
*
* Side Effects: Event-specific actions have been taken.
*
* Overview:
This routine is called by the CDC Serial Emulation
*
function driver to notify the application of events
*
that occur on the USB. If the event is recognized,
*
it is handled and the routine returns TRUE. Otherwise,
*
it is ignored and the routine returns FALSE.
*************************************************************************/
35
#ifndef min
#define min(a,b) (((a)<(b))?(a):(b))
#endif
PUBLIC BOOL CdcDemoEventHandler ( USB_EVENT event, void *data, int size )
{
UINT16
cmd_size;
LINE_CODING line_coding;
// Handle specific events.
switch ((UINT)event)
{
// The host has changed our line-control status.
case EVENT_CDC_LINE_CTRL:
// Read the new line coding.
//
// (We don't really care, but if we did, we could
// do something about it here after reading it.)
return USBUSARTGetLineCoding (&line_coding);
// The host is about to send an encapsulated command.
case EVENT_CDC_CMD:
// Read the command string.
if (size == sizeof(UINT16) && data != NULL)
{
cmd_size = (UINT16)min(sizeof(gCommand), size);
return USBUSARTGetCmdStr (gCommand, cmd_size);
}
break;
} // switch (event)
// Wasn't ours.
return FALSE;
} // CdcDemoEventHandler
//****************************************//
//*******CONFIGURAZIONE INTERRUPT****//
//****************************************//
void __ISR( _TIMER_45_VECTOR, ipl3) T45InterruptHandler(void) //Interrupt timer45 : scatta allo scadere dell'
intervallo del timer 45
//la cui durata è stabilita da intpre oppure da (basediv-intpre)
//tic (timer interrupt counter) è la variabile dello stato di conteggio,
{
//se è 0 il timer è in fase di pretrigger se è 1 è in fase di posttrigger
if (tic==0)
{
mT45IntEnable(0);
//se siamo nella fase di pretrigger:
//disabilita interrupt da timer45
36
mT45ClearIntFlag();
CloseTimer45();
mINT1IntEnable(1);
mPORTASetBits(BIT_7);
}
else
{
mT45IntEnable(0);
mT45ClearIntFlag();
//pulisci la flag dell'interrupt
M=1;
I=0;
//pulisci la flag dell'interrupt
//chiudi timer45
//abilita interrupt su trigger
//abilita flip-flop
//se siamo in fase di post-trigger
//disabilita interrupt da timer45
//esci da subroutine di tempo vivo
//entra nella subroutine di scaricamento e invio dati
}
}
void __ISR( _EXTERNAL_1_VECTOR, ipl2) INT1InterruptHandler(void)
//interrupt del trigger :scatta sul fronte di
discesa del segnale di trigger proveniente dal flip flop
{
mINT1ClearIntFlag();
//pulisci la flag dell'interrupt
mINT1IntEnable(0);
//disabilita interrupt del trigger
if (intpre!=basediv)
//se il periodo di pretrigger è diverso dal tempo totale di misura
{
tic=1;
//passa a fase di post trigger
mT45IntEnable(1);
//abilita interrupt sul timer45
OpenTimer45 (T4_ON|T4_PS_1_1|T4_32BIT_MODE_ON, (basediv-intpre));
//apri timer45 con periodo
(basediv-intpre)
}
else
//se intpre=basediv
{
M=1;
//esci direttamente dalla subroutine di tempo vivo
I=0;
//entra nella subroutine di scaricamento e invio dati
}
}
//*********************//
//*******MAIN*********//
//********************//
int main ( void )
{
/*
PIC32 Peripheral Library functions SYSTEMConfigPerformance() and SYSTEMConfig()
configures system parameters, such as Flash wait states, RAM wait states,
enable cache and set Peripheral Bus Clock (PBCLK) frequency for optimal
system performance based on the system clock frequency argument.
SYSTEMConfigPerformance() ignores the PBCLK fuse selection FPBDIV and calculates
the fastest possible PBCLK based on the system clock frequency parameter.
Use this function if you want to set the fastest PBCLK frequency.
Example: SYSTEMConfigPerformance(80000000); //@80MHz PBCLK ratio = 1:1
SYSTEMConfig() uses the PBCLK defined by configuration fuse selection FPBDIV
set in code or from the MPLAB IDE Configuration Bits menu.
Use this function if you want to maintain the PBCLK frequency set by FPBDIV.
Example: SYSTEMConfig(80000000, SYS_CFG_WAIT_STATES | SYS_CFG_PCACHE);
*/
37
SYSTEMConfig(GetSystemClock(), SYS_CFG_WAIT_STATES | SYS_CFG_PCACHE);
SpiChnOpen(2, SPICON_MSTEN|SPICON_CKE|SPICON_ON, 16);
canale due di serial peripheral interface con frequenza di 5 MHz
USBInitialize(0);
//inizializza USB
mJTAGPortEnable(DEBUG_JTAGPORT_OFF);
//Disabilita JTAG
//apertura del
//****************************************//
//**********CONFIGURAZIONE PORTE**********//
//****************************************//
mPORTASetPinsDigitalOut(BIT_0|BIT_1|BIT_2|BIT_3|BIT_4|BIT_5|BIT_6|BIT_7);
mPORTASetBits(BIT_0|BIT_1|BIT_2);
mPORTAClearBits(BIT_3|BIT_4|BIT_5|BIT_6|BIT_7);
mPORTBSetPinsDigitalIn(BIT_0|BIT_1|BIT_2|BIT_3|BIT_4|BIT_5|BIT_6|BIT_7|BIT_8|BIT_9|BIT_10|BIT_11|
BIT_12|BIT_13|BIT_14|BIT_15);
mPORTCSetPinsDigitalOut(BIT_1|BIT_2|BIT_3|BIT_4|BIT_13|BIT_14);
mPORTDSetPinsDigitalIn(BIT_2|BIT_3|BIT_4|BIT_5|BIT_6|BIT_7|BIT_8|BIT_9|BIT_10|BIT_11|BIT_12|BIT_13|
BIT_14|BIT_15);
mPORTDSetPinsDigitalOut(BIT_0|BIT_1);
mPORTESetPinsDigitalOut(BIT_5|BIT_6|BIT_7);
mPORTESetPinsDigitalIn(BIT_8|BIT_9);
mPORTEClearBits(BIT_7|BIT_13);
//***************************************//
//*********ROUTINE PRINCIPALE************//
//***************************************//
while (1)
{
USBTasks();
mINT1IntEnable(0);
mT45IntEnable(0);
Comando[10]=0;
while (C==0)
{
USBTasks();
//C=0 sequenza non eseguita C=1 sequenza eseguita
/*
Inizio prima connessione fra PIC32 e Visual Basic :
Il pic aspetta un carattere da VB, se tale carattere è "c" (0x63) il pic risponde inviando "X" (0x58).
Finchè tale processo non è completo (finchè c=0) il firmware rimane congelato in tale processo.
*/
if (USBUSARTRxIsReady())
{
USBUSARTRx(Comando, 11);
}
if ( Comando[10]==1 )
//Ricevi il comando di configurazione
// se comando[10]=1
38
{
Risposta[0]=0x59;
USBUSARTTx(Risposta, 1);
C=1;
configurazione
}
}
//Rispondi con "Y"
//esci da subroutine di
//******SEQUENZA DI CONFIGURAZIONE DEL SISTEMA*******//
limit=Comando[0];
gain=Comando[1];
offset=Comando[2];
thresh=Comando[3];
clock=Comando[4];
base=Comando[5];
slope=Comando[6];
mode=Comando[7];
pretrig=((Comando[8])<<8) | Comando[9];
//Configuro il multiplexer del limitatore;
mPORTAClearBits(BIT_3|BIT_4|BIT_5);
if (limit==0) mPORTAClearBits(BIT_3|BIT_4|BIT_5);
if (limit==1) mPORTASetBits(BIT_3);
//Configuro il potenziometro digitale del Guadagno
mPORTAToggleBits(BIT_0);
SpiChnPutC(2, 0b00010001 );
SpiChnPutC(2, gain);
for (d=1; d<=90;d++)
{
//delay
}
mPORTAToggleBits(BIT_0);
//Configuro il potenziometro dell'offset
mPORTAToggleBits(BIT_1);
SpiChnPutC(2, 0b00010001 );
SpiChnPutC(2, offset);
for (d=1; d<=90;d++)
{
//delay
}
mPORTAToggleBits(BIT_1);
//Configuro il potenziometro digitale del threshold
mPORTAToggleBits(BIT_2);
SpiChnPutC(2, 0b00010001 );
SpiChnPutC(2, thresh);
for (d=1; d<=90;d++)
{
//delay
39
}
mPORTAToggleBits(BIT_2);
//Configuro il divisore del clock del contatore indirizzi
if (clock==0)clockdiv=1;
if (clock==1)clockdiv=3;
if (clock==2)clockdiv=7;
if (clock==3)clockdiv=19;
if (clock==4)clockdiv=39;
if (clock==5)clockdiv=79;
if (clock==6)clockdiv=199;
if (clock==7)clockdiv=399;
if (clock==8)clockdiv=799;
if (clock==9)clockdiv=1999;
if (clock==10)clockdiv=3999;
if (clock==11)clockdiv=7999;
if (clock==12)clockdiv=19999;
if (clock==13)clockdiv=39999;
//Frequenza di campionamento
//20MHz
//10MHz
//5Mhz
//2MHz
//1MHz
//500kHz
//200kHz
//100kHz
//50kHz
//20kHz
//10kHz
//5kHz
//2kHz
//1kHz
//Configuro il divisore del timer del tempo di misura
//Tempo di misura
if (base==0)basediv=39;
// 500ns
if (base==1)basediv=79;
// 1us
if (base==2)basediv=159;
// 2us
if (base==3)basediv=399;
// 5us
if (base==4)basediv=799;
// 10us
if (base==5)basediv=1599;
// 20us
if (base==6)basediv=3999;
// 50us
if (base==7)basediv=7999;
/ / 100us
if (base==8)basediv=15999;
// 200 us
if (base==9)basediv=39999;
// 500us
if (base==10)basediv=79999;
// 1ms
if (base==11)basediv=159999;
// 2ms
if (base==12)basediv=399999;
// 5ms
if (base==13)basediv=799999;
// 10ms
if (base==14)basediv=1599999;
// 20ms
if (base==15)basediv=3999999;
// 50ms
if (base==16)basediv=7999999;
// 100ms
if (base==17)basediv=15999999;
// 200ms
if (base==18)basediv=39999999;
// 500ms
if (base==19)basediv=79999999;
// 1s
if (base==20)basediv=159999999; // 2s
if (base==21)basediv=399999999; // 5s
if (base==22)basediv=799999999; // 10s
Base dei tempi
50ns/div
100ns/div
200ns/div
500ns/div
1us/div
2us/dIv
5us/div
10us/div
20us/div
50us/div
100us/div
200us/div
500us/div
1ms/div
2ms/div
5ms/div
10ms/div
20ms/div
50ms/div
100ms/div
200ms/div
500ms/div
1s/div
//Configuro il selettore di slope
if (slope==0)mPORTASetBits(BIT_6);
if (slope==1) mPORTAClearBits(BIT_6);
40
//******************************//
//******ROUTINE DI MISURA****//
//******************************//
//*****INIZIO CONFIGURAZIONE SISTEMA******//
//Porta indirizzi settata come input (alta impedenza)
mPORTBSetPinsDigitalIn(BIT_0|BIT_1|BIT_2|BIT_3|BIT_4|BIT_5|BIT_6|BIT_7|BIT_8|BIT_9|BIT_10|BIT_11|
BIT_12|BIT_13|BIT_14|BIT_15);
mPORTESetPinsDigitalIn(BIT_9);
mPORTAClearBits(BIT_7);
mPORTCSetBits(BIT_14);
//Set flip flop.
//Z su buffer ADC uscite disabilitate
//RAM in Scrittura
mPORTCClearBits(BIT_1);
mPORTEClearBits(BIT_6);
mPORTCSetBits(BIT_4);
mPORTCSetBits(BIT_2);
// Z su latch uscite disabilitate
mPORTEClearBits(BIT_5);
mPORTCClearBits(BIT_3);
//Tolgo Z su contatore uscite abilitate
//Azzero Contatore
//Configuro il clock dell ADC (Timer2) e il clock della RAM (Timer3)
OpenTimer3(T3_ON|T3_PS_1_1, clockdiv);
OpenTimer2(T2_ON|T2_PS_1_1, 0x1);
OpenOC1(OC_ON |OC_TIMER2_SRC |OC_CONTINUE_PULSE, 0x0 , 0x0);
OpenOC2(OC_ON |OC_TIMER3_SRC |OC_CONTINUE_PULSE, 0x0, 0x0);
WriteTimer23(0);
//Parte il clock...
mPORTCClearBits(BIT_14);
mPORTCSetBits(BIT_3);
//tolgo Z su buffer ADC uscite abilitate
//Parte il contatore
//Configurazione interrupt
mINT1ClearIntFlag();
mT45ClearIntFlag();
mINT1SetIntPriority( 2);
mT45SetIntPriority(3);
mINT1SetEdgeMode (0);
INTEnableSystemMultiVectoredInt();
intpre=floor(pretrig*basediv/(65535));
di pretrigger
//intpre : numero compreso fra 0 e basediv, è il moltiplicatore del timer
//Configurazione modalità di misura (0:free run ;1:repeat; 3:One shot)
//Se modalità è repeat o free run abilita timer di pretrigger
if (mode==1||mode==2)
{
if (intpre>0x0385)
//se pretrigger è maggiore di 901 abilita interrupt sul timer45 e apri timer45
{
tic=0;
mT45IntEnable(1);
OpenTimer45 (T4_ON|T4_PS_1_1|T4_32BIT_MODE_ON, intpre);
}
41
else
{
//altrimenti periodo di pre-trigger è 901
tic=0;
mT45IntEnable(1);
OpenTimer45 (T4_ON|T4_PS_1_1|T4_32BIT_MODE_ON, 0x0385);
}
}
if (mode==0)
//Se modalità è free run abilita il timer di posttrigger
{
intpre=0;
tic=1;
mT45IntEnable(1);
OpenTimer45 (T4_ON|T4_PS_1_1|T4_32BIT_MODE_ON, basediv);
}
M=0;
Comando[10]=0;
//***************************************//
//****INIZIO SEQUENZA DI TEMPO VIVO***//
//***************************************//
//Finchè M=0 attendi interrupt di fine misura (interrupt di timer45 con tic=1) e tieni sveglia la connessione USB
//attraverso USBTasks()
//oppure attendi comando di aggiornamento
while (M==0)
{
USBTasks();
if (USBUSARTRxIsReady()) USBUSARTRx(Comando,11);
if (Comando[10]==1 )
//Se Comando[10]=1
{
M=1;
I=1;
C=1;
//Esci da subroutine di tempo vivo
//non entrare in subroutine di scaricamento e invio dati
//Riconfigura Sistema
}
}
/*************************************************************/
/*****************INIZIO SEQUENZA DI STOP*********************/
/*************************************************************/
//RAM in LETTURA
mPORTDSetBits(BIT_1);
mPORTCClearBits(BIT_4);
mPORTESetBits(BIT_6);
//Chiudo output compare
CloseOC1();
CloseOC2();
//Chiudo Timer
42
CloseTimer2();
CloseTimer3();
CloseTimer45();
mPORTCSetBits(BIT_14);// Z su buffer ADC uscite disabilitate
mPORTESetBits(BIT_5); //Z su contatore uscite disablitate
mPORTCClearBits(BIT_2); // Z su latch uscite abilitate
stop=(basediv+1)/(2*(clockdiv+1)); // stop: numero di campioni totali
pre_ad=floor(intpre/(2*(clockdiv+1))); //numero di campioni presenti nell'intervallo di pretrigger
//Se modalità è repeat o one shot leggi indirizzo a cui è arrivato evento di trigger dalla latch
if (mode==1||mode==2) trig_ad=(mPORTBReadBits(BIT_0|BIT_1|BIT_2|BIT_3|BIT_4)+
((mPORTBReadBits(BIT_6|BIT_7|BIT_8|BIT_9|BIT_10|BIT_11|BIT_12|BIT_13|BIT_14|BIT_15))>>1)+
((mPORTEReadBits(BIT_9))<<6));
else trig_ad=10; //altrimenti l' indirizzo è 10
mPORTCSetBits(BIT_2);//Z su latch uscite disabilitate
//Porta indirizzi output
mPORTBSetPinsDigitalOut(BIT_0|BIT_1|BIT_2|BIT_3|BIT_4|BIT_5|BIT_6|BIT_7|BIT_8|BIT_9|BIT_10|
BIT_11|BIT_12|BIT_13|BIT_14|BIT_15);
mPORTESetPinsDigitalOut(BIT_9);
//se indirizzo di pretrigger cade sotto lo zero scala l'indirizzo da 0xffff
if (trig_ad<pre_ad) start_ad=65535-(pre_ad-trig_ad);
else start_ad=trig_ad-pre_ad;
Richiesta[0]=0;
/********************************************************************************/
/*************SEQUENZA DI SCARICAMENTO RAM E INVIO DATI AL PC**************/
/********************************************************************************/
while (I==0)
{
i=0;
for (i=0;i<=stop-1;i++)
{
USBTasks();
if ((i+start_ad)<=0xffff)
//se i+start_ad <=65535
{
//indirizza la RAM
LATB=((i+start_ad)&0x001f)+(((i+start_ad)&0x7fe0)<<1);
//se il bit 15 dell' indirizzo è a livello logico alto, accendi bit 9 di PORTE
if(((i+start_ad)&0x8000)== 0x8000) mPORTESetBits(BIT_9);
else mPORTEClearBits(BIT_9);
//altrimenti spegnilo
}
else
//se i+start_ad > 65535 ovvero maggiore della dimensione massima della RAM
{
//scala l'indirizzo da 65535
LATB=(((i+start_ad)-65536)&0x001f)+((((i+start_ad)-65536)&0x7fe0)<<1);
//se il bit 15 dell' indirizzo è a livello logico alto, accendi bit 9 di PORTE
43
if ((((i+start_ad)-65536)&0b100000)==0b100000) mPORTESetBits(BIT_9);
else mPORTEClearBits(BIT_9);
//altrimenti spegnilo
}
if (j==0)
//se j=0 è l'inizio del pacchetto
{
if (stop<2047)
//se il numero di pacchetti è minore di 4096/2
{
Data[j]=((2*stop)&0xff00)>>8;
//salva il byte alto della dimensione del pacchetto
j++;
Data[j]=(2*stop)&0x00ff;
//salva il byte basso della dimensione del pacchetto
j++;
}
else
{
last_pkt_sz=((2*stop)-(4094*q));
if (last_pkt_sz>4094)
{
//dimensione dell' ultimo pacchetto inviato
//se la dimensione dell'ultimo pacchetto è maggiore di 4094
Data[j]=0x10;
j++;
Data[j]=0x00;
j++;
q++;
//salva sui primi due byte il valore 0x1000=4096
}
else
//Altrimenti salva la dimensione dell'ultimo pacchetto
{
Data[j]=(last_pkt_sz&0xff00)>>8;
j++;
Data[j]=(last_pkt_sz&0x00ff);
j++;
}
}
}
//leggi e salva il bytedei dati alto dalla ram
Data[j]=(mPORTDReadBits(BIT_10|BIT_11|BIT_12|BIT_13|BIT_14))>>10;
j++;
//leggi e salva il byte dei dati basso dalla ram
Data[j]=(mPORTDReadBits(BIT_2|BIT_3|BIT_4|BIT_5|BIT_6|BIT_7|BIT_8|BIT_9))>>2;
j++;
S=0;
R=0;
if (j==4096)
{
//Se la dimensione del pacchetto ha raggiunto 4096 invia
while (S==0)
{
USBTasks();
if (USBUSARTTxIsReady())
{
USBUSARTTx(Data, j);
S=1;
}
}
//finchè il pacchetto non è stato inviato (S=0)
//invia pacchetto
44
//************Attesa risposta da Visual Basic***************//
while (R==0)
{
//finchè il carattere di risposta da visual basic non è stato ricevuto (R=0)
USBTasks();
if (USBUSARTRxIsReady())
{
USBUSARTRx(Richiesta, 1);
R=1;
j=0;
}
//Ricevi carattere
}
}
S=0;
if (i==stop-1)
{
//se lo scaricamento è giunto all'ultimo campione invia pacchetto
while (S==0)
{
USBTasks();
if (USBUSARTTxIsReady())
{
USBUSARTTx(Data, j);
S=1;
}
}
j=0;
q=0;
}
S=0;
}
I=1;
C=0;
S=0;
}
}
}
45
2.4
L'interfaccia grafica
Per consentire una corretta visualizzazione ed elaborazione dei dati provenienti dal dispositivo sono
state realizzate due interfacce grafiche in Visual basic 6. La prima è un interfaccia di
visualizzazione del segnale molto simile alle interfacce grafiche degli oscilloscopi digitali presenti
in commercio.
Questa interfaccia ci permette di selezionare fra le opzioni:
-fondoscala : da ± 100mV a ± 20V
-frequenza di campionamento: da 1 kSample/s a 20 MSamples/s
-base dei tempi :da 50 ns/divisione fino a 5 s/divisione
-slope: positivo o negativo
-modalità di misura: Free run, repeat o one shot
-Tensione di soglia del trigger e intervalli di pre-trigger e post-trigger : selezionabili attraverso il
posizionamento del punto arancione sullo schermo
E' possibile salvare i dati in ingresso su un file di testo attraverso la casella di spunta “Log data”
E' presente l'interfaccia avanzata che consente la taratura dello strumento e dei fondoscala
personalizzati.
E' inoltre possibile Eseguire misurazioni di frequenza, minimo e massimo della schermata e salvare
i dati su un file di testo attraverso le apposite caselle di spunta
46
La seconda interfaccia consente di analizzare segnali di tipo impulsivo . La sua applicazione
principale è quella di calcolare l'ampiezza degli impulsi provenienti da uno spettrometro e di
disegnare l'istogramma relativo allo spettro della sorgente esaminata.
Come l'interfaccia precedente è possibile selezionare i fondoscala, la base dei tempi, la tensione di
soglia del trigger e lo slope.
A differenza della prima interfaccia è presente la finestra dello spettro in cui possiamo :
-selezionare il numero di canali
-azzerare l'istogramma
-scegliere fra spettro realizzato con i dati reali o con i dati interpolati
-salvare i dati dell'istogramma in un file per successive elaborazioni.
Questa interfaccia è capace di calcolare l'interpolazione dell'impulso con i metodi visti in 1.3 .
Affinchè l'interpolazione risulti il più fedele possibile ai dati misurati occorre introdurre nelle
apposite caselle di testo i parametri di tempo di salita e tempo di discesa. Tali parametri dipendono
dal rivelatore utilizzato .
47
2.5 Il protipo e il circuito stampato
Il prototipo
Illustrazione 21: Il prototipo
Il prototipo è stato realizzato su millefori usando una sorta di routing manuale . Sfruttando la griglia
da 2,54mm propria della millefori ho impostato tutte le piste usando del filo di rame nudo . Questo
ha permesso di ridurre al minimo il numero di collegamenti “volanti” minimizzando così i rumori e
le capacità parassite. Questo accorgimento ha permesso di rendere il prototipo un valido strumento
per il debug e la taratura del circuito .
Il circuito stampato
Il progetto del circuito stampato è stato realizzato con Orcad Layout plus . Il routing delle piste è
stato sviluppato manualmente . L'architettura della scheda è a 4 layer. I due layer interni sono stati
48
destinati al passaggio delle piste di ground e delle piste di alimentazione. Sul layer più vicino al
TOP passano le linee di ground digitale e ground analogico. Sul layer più vicino al BOTTOM
passano le linee di 3,3V digitale, 3,3V analogico, 5V digitale, 5 V analogico e – 5V analogico. Per
tutti i layer è stato previsto il copper pour, ovvero tutto lo spazio che non è attraversato da piste è
ricoperto da uno strato di rame che è connesso a ground . Precisamente, la zona della scheda che è
stata destinata alla sezione di amplificazione (la zona in alto a sinistra) è stata riempita con uno
strato di rame connesso al ground analogico. La parte restante è stata connessa al ground digitale.
Questo ha permesso di rendere minimi i rumori provenienti dall'esterno .
Illustrazione 22: Il layout del circuito stampato
49
Illustrazione 23: Il circuito stampato
50
CAPITOLO 3
Taratura del dispositivo
Come ogni strumento di misura questo dispositivo ha bisogno di un accurata taratura. Lo scopo
finale della taratura di questo strumento è quello di portare il segnale per ognuno dei fondoscala ad
occupare la “finestra di massima risoluzione” .La finestra di massima risoluzione corrisponde alla
finestra di conversione dell ADC che è costituita dall'intervallo di tensioni che vanno da 0,5V a
1,5V. Per ottenere tale intervallo il segnale uscente dall'amplificatore di guadagno U11 deve avere
un ampiezza di 1V da picco a picco e un offset nullo.
Il procedimento di taratura si divide in tre fasi:
-Taratura dei fondoscala
-Taratura della banda passante
-Taratura del trigger
Il Procedimento di taratura del dispositivo richiede l'utilizzo di:
-Un generatore di funzioni
-Un oscilloscopio
-Un cacciavite di precisione in plastica.
3.1 Taratura dei fondoscala
La taratura dei fondoscala va eseguita in piena banda passante. Dobbiamo cioè assicurarci di tarare
lo strumento con segnali che hanno un frequenza lontana dalla frequenza di taglio del circuito di
preamplificazione. Per questo motivo la taratura dei fondoscala va eseguita con segnali aventi
frequenze nell'ordine delle decine di kiloHertz.
Taratura dell'offset del buffer :
I due fet, insieme al transistor formano un partitore di tensione controllato in tensione. La resistenza
a terra RV1 regola la tensione minima che il buffer può erogare. La resistenza dinamica fra source e
drain di un fet è un parametro che in fase di fabbricazione del dispositivo non può essere previsto.
Per questo motivo tale importante parametro può essere ricavato dal datasheet a patto che si preveda
una larga tolleranza. Si può evitare questo problema scegliendo casualmente due fet e regolando la
resistenza variabile RV1 in maniera tale che qualunque sia il range di variazione della resistenza
dinamica possiamo comunque regolare la tensione minima erogabile dal buffer .
Procedimento :
1. Impostare il generatore di funzioni in maniera tale da avere in uscita un segnale sinusoidale
con un ampiezza di 2 Vda picco a picco con offset nullo (± 1V) e una frequenza attorno ai
100kHz
51
2. Collegare il dispositivo alla porta USB
3. Aprire l'interfaccia grafica (Pai_Scope.exe)
4. Selezionare l'opzione “Advanced Interface” in basso a sinistra e inserire il valore 1 nella
casella “Attenuation” (attenuazione 1x)
5. Posizionare la sonda dell'oscilloscopio all'uscita del buffer ovvero sul pin 3 di Q1
6. Regolare il trimmer con il cacciavite di precisione finchè sull'oscilloscopio non vediamo
l'onda sinusoidale perfettamente centrata attorno allo zero.
In questo modo ci assicuriamo che il buffer non aggiunga nessun offset al segnale in ingresso.
Taratura dell' offset dell'amplificatore di guadagno.
Come ho già scritto in precedenza i potenziometri digitali mcp41050 non accettano tensioni minori
di zero. E' necessario quindi aggiungere un offset al segnale in maniera tale all' uscita
dell'inseguitore di tensione U8 ci sia sempre una tensione maggiore o uguale a zero per qualsiasi
segnale si presenti all'ingresso. Grazie al trimmer R2 è possibile rimuovere l'offset aggiunto nel
precedente stadio. Si tratta comunque di una regolazione permanente, quindi la taratura di tale
trimmer va fatta tenendo conto della massima tensione in ingresso all'amplificatore di guadagno
ovvero 1V da picco a picco.
Procedimento:
1. Impostare il generatore di funzioni in maniera tale da avere in uscita un segnale sinusoidale
con un ampiezza di 4 V da picco a picco con offset nullo (± 2V) e una frequenza attorno ai
100kHz
2. Collegare il dispositivo alla porta USB
3. Aprire l'interfaccia grafica (Pai_Scope.exe)
4. Selezionare l'opzione “Advanced Interface” in basso a sinistra
5. inserire nella casella “Attenuation” il valore 1, nella casella “gain” il valore 250 e nella
casella “offset” il valore 243. (Tali valori derivano dalla taratura di una scheda campione e
potrebbero essere diversi per un altra scheda)
6. Posizionare la sonda dell'oscilloscopio all'uscita dell'inseguitore di tensione ovvero sul pin 6
di U8
7. Assicurarsi che sul pin 6 di U8 ci sia una tensione compresa fra 0V e 1V
Se sono presenti tensioni minori di zero ripetere dal punto 5. sostituendo al valore 243 un
numero minore.
8. Posizionare la sonda dell'oscilloscopio all'uscita dell amplificatore di guadagno ovvero sul
pin 6 di U11.
9. Assicurarsi che sul pin 6 di U11 ci sia una tensione con un ampiezza da picco a picco di 1V
Se è presente un segnale con ampiezza diversa sostituire il valore nella casella “gain”
tenendo conto del fatto che valori più bassi causano un aumento del guadagno e valori più
alti causano una diminuzione del guadagno
10. Regolare il trimmer R18 finchè il segnale non ricopre completamente tutto lo spazio
disponibile nella finestra dell'interfaccia grafica.
52
Taratura dei fondoscala
La taratura dei fondoscala viene eseguita a partire dal fondoscala più basso ovvero ±100mV. La
regolazione del trimmer R15 in parallelo con il potenziometro digitale U10 ci permette di rendere
più continua la scelta dei guadagni . Difatti la scelta della resistenza in serie dell'amplificatore
invertente è piuttosto critica per guadagni elevati.
Procedimento:
1. Impostare il generatore di funzioni in maniera tale da avere in uscita un segnale sinusoidale
con un ampiezza di 200mV da picco a picco con offset nullo (± 100mV) e una frequenza
attorno ai 100kHz.
2. Collegare il dispositivo alla porta USB
3. Aprire l'interfaccia grafica (Pai_Scope.exe)
4. Selezionare l'opzione “Advanced Interface” in basso a sinistra
5. inserire nella casella “Attenuation” il valore 0, nella casella “gain” il valore 7 e nella
casella “offset” il valore 49 .(Tali valori derivano dalla taratura di una scheda campione e
potrebbero essere diversi per un altra scheda)
6. Selezionare le caselle di spunta Max Voltage e Min Voltage, in questo modo sarà più
semplice misurare il massimo e il minimo dell'onda.
7. Regolare il trimmer R15 finchè il segnale non ricopre completamente tutto lo spazio
disponibile nella finestra dell'interfaccia grafica .
8. Potrebbe essere necessario regolare i valori di offset nell'interfaccia grafica . Nel caso in cui
il valore consigliato produca la visualizzazione dell' onda con un offset diverso da zero,
modificare il valore di “offset” e ripetere dal punto 7
9. Prendere nota dei valori di Attenuation, gain e offfset
Una volta che il fondoscala minimo è stato tarato si può procedere alla taratura di tutti i fondoscala
superiori, fino a 2V. Semplicemente si imposta il generatore di funzione affinchè produca un
segnale con picchi che toccano gli estremi del fondoscala (± 200mV, ± 500mV, ± 1V, ± 2V) e si
modificano i valori di “Attenuation”, “Gain” e “offset” finchè l'onda non ricopre perfettamente la
finestra di visualizzazione.
Per semplificare questa procedura, la seguente tabella riporta i valori da me trovati durante la
taratura della scheda campione
Attenuation
Gain
Offset
± 100mV
0
7
49
± 200mV
0
15
62
± 500mV
0
41
92
± 1V
0
96
148
± 2V
1
250
243
Prima di poter tarare i fondoscala da ±5V a ±20V è necessario eseguire la taratura della banda
passante
53
3.2 Taratura della banda passante
Per poter misurare tensioni con ampiezze maggiori di 4V da picco a picco è necessario attenuare il
segnale. Il partitore di tensione formato dalla resistenza da 900k e dalla resistenza da 100k provvede
ad un' attenuazione di 10 volte . Tale circuito però impone un decadimento della frequenza di taglio
a causa dell'elevata resistenza in serie da 900k Difatti tale resistenza, unita alla capacità fra Gate e
source del fet forma un circuito RC passa basso:
=
La frequenza di taglio di tale circuito si può calcolare dalla formula:
f=
1
2RC
Sostituendo i valori di 900k e 10pF si ottiene una frequenza di taglio (-3dB) di circa 18 kHz
Per evitare questo problema si ricorre alla tecnica della compensazione . Ad una decremento della
banda passante si contrappone un incremento della bande di ordine uguale. Per fare ciò si unisce al
circuito passa basso visto sopra un circuito RC passa alto in questo modo:
Illustrazione 24: Funzionamento di un compensatore
La compensazione risulta ottimale quando il prodotto R S ·CS e il prodotto RP ·CP sono uguali. La
compensazione può essere eseguita grazie al condensatore variabile C46 .
54
Illustrazione 25: Banda passante sovracompensata
Se il prodotto RS ·CS è maggiore del prodotto RP ·CP la compensazione risulta eccessiva .La banda
passante che si ottiene in questo caso è di questo tipo:
Questo esempio è stato ottenuto tramite una simulazione su “Circuit maker” usando questi valori:
– RS = 900kΩ
– RP = 100kΩ
- CS = 5pF
- CP = 20pF
- RS ·CS = 4,5 μs
- Rp·Cp = 2 μs
Se invece il prodotto RS ·CS è minore del prodotto RP ·CP la compensazione sarà insufficiente .La
banda passante che si ottiene in questo caso è di questo tipo:
Illustrazione 26: Banda passante sottocompensata
– RS = 900kΩ
– RP = 100kΩ
- CS = 5pF
- CP = 60pF
- RS ·CS = 4,5 μs
- Rp·Cp = 6 μs
Esiste un metodo semplice per tarare la banda passante senza dover ricorrere alla misura della
capacità del condensatore C46. Tale metodo consiste nel misurare un' onda quadra con frequenza
prossima alla frequenza di taglio del circuito passa basso e regolare il condensatore variabile C46
finchè non si ottiene la minima distorsione armonica possibile. Infatti nel caso in cui la
compensazione sia eccessiva vedremo le caratteristiche sovraelongazioni causate dall'enfatizzazione
delle armoniche superiori dell'onda quadra:
55
Illustrazione 27: Effetto di una compensazione eccessiva (CP = 60pF) in un onda quadra a 10kHz
Nel caso in cui la compensazione sia insufficiente noteremo delle sottoelongazioni di questo tipo:
Illustrazione 28: Effetto di una compensazione insufficiente (CP = 20pF) in un onda quadra a
10kHz
Per tarare correttamente la banda passante si deve seguire la seguente procedura:
1. Impostare il generatore di funzioni in maniera tale da avere in uscita un onda quadra con un
ampiezza di 10V da picco a picco con offset nullo (± 5V) e una frequenza attorno ai
10kHz.
2. Collegare il dispositivo alla porta USB
3. Aprire l'interfaccia grafica (Pai_Scope.exe)
4. Impostare la base dei tempi su 50μs/div
5. Selezionare l'opzione “Advanced Interface” in basso a sinistra
6. inserire nella casella “Attenuation” il valore 1, nella casella “gain” il valore 42 e nella
casella “offset” il valore 95 .(Tali valori derivano dalla taratura di una scheda campione e
potrebbero essere diversi per un altra scheda)
7. Regolare il condensatore varibile servendosi del cacciavite di precisione in plastica finchè
sulla finestra di visualizzazione non appare un onda quadra “pulita”, senza cioè
sovraelongazioni o sottoelongazioni.
N.B. Utilizzare un cacciavite in plastica facilita enormemente la taratura . Se utilizzassimo un
cacciavite metallico altereremmo la capacità del condensatore variabile . Difatti in questo caso alla
capacità del condensatore verrebbe sommata la capacità del corpo umano che si aggira attorno alle
decine di picoFarad.
56
Una volta tarata la banda passante occorre tarare i fondoscala restanti (± 5V, ± 10V e ± 20V ) .La
procedura è la stessa utilizzata per tarare i fondoscala precedenti, l'unica differenza è che il segnale
è attenuato di 10 volte . Questo implica che i parametri di guadagno e offset dei fondoscala ± 5V, ±
10V e ± 20V siano uguali rispettivamente ai parametri dei fondoscala ± 500mV, ± 1V e ± 2V.
Ovviamente questo è vero a patto che si prevedano i giusti errori dovuti alle tolleranze di resistenze
e condensatori. In ogni caso riporto i valori ottenuti durante la taratura della scheda campione.
Attenuation
Gain
Offset
± 5V
1
42
95
± 10V
1
96
151
± 20V
1
252
246
Una volta noti tutti i valori di “Attenuation”, “Gain” e “offset” per ogni fondoscala è possibile
salvarli in maniera permanente aggiungendo tali valori nel codice sorgente dell'interfaccia grafica.
Tali valori vanno aggiunti nel Form_Load():
Private Sub Form_Load()
' associazione array
limit(0) = 0
gain(0) = 7
offset(0) = 49
limit(1) = 0
gain(1) = 15
offset(1) = 62
limit(2) = 0
gain(2) = 41
offset(2) = 92
limit(3) = 0
gain(3) = 96
offset(3) = 148
limit(4) = 0
gain(4) = 250
offset(4) = 243
limit(5) = 1
gain(5) = 42
offset(5) = 95
limit(6) = 1
gain(6) = 96
offset(6) = 151
limit(7) = 1
gain(7) = 252
offset(7) = 246
…..
…..
57
3.3 Taratura del circuito di trigger
La taratura del circuito di trigger si articola in due fasi:
-Taratura dell'intervallo di variazione della tensione di soglia
-Taratura dell' isteresi
Taratura dell'intervallo di variazione della tensione di soglia
La taratura dell'intervallo di variazione ci permette di trovare il valore minimo e il valore massimo
per cui il circuito di trigger scatta .
Procedimento:
1. Impostare il generatore di funzioni in maniera tale da avere in uscita un onda sinusoidale
con un ampiezza di 2V da picco a picco con offset nullo (± 1V) e una frequenza attorno ai
100kHz.
2. Collegare il dispositivo alla porta USB
3. Aprire l'interfaccia grafica (Pai_Scope.exe)
4. Selezionare l'opzione “Advanced Interface” in basso a sinistra
5. Inserire nella caselle “Attenuation”, “gain” e “offset” il valori trovati durante la taratura
del fondoscala ± 1V.
6. Selezionare la casella di spunta “Enable” accanto alla casella “Threshold”
7. inserire il valore 45 nella casella “Threshold” (Tali valori derivano dalla taratura di una
scheda campione e potrebbero essere diversi per un altra scheda)
8. Se il circuito di trigger scatta verrà stampata sulla finestra di visualizzazione l' onda relativa
al trigger che è appena scattato. Se la frequenza di aggiornamento è sufficientemente veloce
Significa che è possibile abbassare ulteriormente la tensione di soglia ripetendo dal punto 7
e inserendo un valore più basso nella casella threshold. Se invece la schermata viene
aggiornata con una frequenza che si aggira attorno a una schermata al secondo significa che
il trigger scatta occasionalmente in presenza di fluttuazioni della tensione massima .In
questo caso il valore di “Threshold” deve essere aumentato.
9. Prendere nota del valore minimo per cui il trigger scatta in maniera adeguata
10. Ripetere dal punto 7 inserendo nella casella “Threshold” il valore 215
11. Prendere nota del valore massimo per cui il trigger scatta in maniera adeguata tenendo in
considerazione gli stessi criteri utilizzati al punto 8
Una volta noti i valori minimo e massimo, si può rendere permanente la taratura sostituendo tali
valori nel codice sorgente dell' interfaccia grafica . Tali valori vanno sostituiti a thresh_min e
thresh_max nel Form_Load()
Private Sub Form_Load()
' associazione array
….
….
….
thresh_max = 215
thresh_min = 45
….
….
58
Taratura dell'istersesi:
Il trimmer R31 ci permette di regolare l'isteresi del comparatore . La taratura di questo parametro è
importante se vogliamo evitare falsi scatti del trigger . Ponendo la resistenza individuata da R31 a
zero si può notare che l'onda stampata sulla finestra di visualizzazione “scatta” in orizzontale di
mezzo periodo d'onda .Questo inconveniente si manifesta a causa del rumore di fondo .Infatti nel
caso in cui lo slope sia positivo, nella fase discendente dell'onda, la tensione scende al di sotto della
soglia ma può accadere che un piccolo rumore faccia risalire la tensione al di sopra di essa causando
lo scatto del circuito di trigger nonostante la pendenza media in quel tratto di curva sia negativa.
L'aggiunta dell' isteresi ci permette di rendere il comparatore insensibile al rumore.
Procedimento:
1. Impostare il generatore di funzioni in maniera tale da avere in uscita un onda sinusoidale
con un ampiezza di 2V da picco a picco con offset nullo (± 1V) e una frequenza attorno ai
100kHz.
2. Collegare il dispositivo alla porta USB
3. Aprire l'interfaccia grafica (Pai_Scope.exe)
4. selezionare la modalità di misura “Repeat” dalla combo box in basso a sinistra
5. Regolare il trimmer finchè l'onda nella finestra di visualizzazione non rimane stabile.
Può succedere che dopo la taratura dell'isteresi sia necessario tarare nuovamente l'intervallo della
tensione di soglia . E' consigliabile quindi di regolare la finestra di isteresi affinchè la dimensione di
questa sia più piccola possibile.
3.4 Taratura dei fondoscala personalizzati
L'interfaccia avanzata, oltre alla taratura iniziale dello strumento, ci consente di aggiungere dei
fondoscala personalizzati, utili in applicazioni in cui i fondoscala classici sono inadeguati.
Nel caso della spettroscopia abbiamo spesso a che fare con impulsi unipolari, ovvero con segnali
che non superano mai i zero volt. Misurare Questi impulsi con i fondoscala di default che sono
bipolari, comporta un errore sistematico che riguarda la risoluzione dello strumento. Difatti se
usiamo i fondoscala di default per misurare tali impulsi stiamo utilizzando solamente metà della
finestra di conversione analogico-digitale. Questo implica che anziché convertire il segnale con una
risoluzione di 1/4095, lo stiamo convertendo con una risoluzione di 1/2042, cioè la metà. Abbassare
la risoluzione dello strumento nel campo della spettroscopia significa diminuire il numero di canali
dello spettrometro .
Il procedimento di taratura dei fondoscala personalizzati è identico alla taratura dei fondoscala di
default . L'unica differenza sta nel fatto che anziché sostituire i valori di “Attenuation”, “Gain” e
“Offset” nel codice sorgente, possiamo salvare tali valori in un file di configurazione (cfg.txt)
permanente. Tale configurazione sarà disponibile anche dopo la chiusura e la riapertura dell'
interfaccia grafica.
59
Procedimento:
1. Impostare il generatore di funzioni in maniera tale da avere in uscita un onda che rispecchia
esattamente (in termini di ampiezza offset, frequenza e forma d'onda) il segnale che
vogliamo misurare.
2. Modificare i valori di “Attenuation”, “Gain” e “Offset” nell' interfaccia avanzata finchè
l'onda non ricopre completamente tutta la finestra di visualizzazione.
3. Premere uno dei tasti “Save” accanto a uno slot vuoto. Se si sceglie uno slot con una
configurazione preesistente tale configurazione verrà sovrascritta.
4. Scegliere un nome per il fondoscala e impostare la tensione minima, la tensione massima e
la dimensione del fondoscala .
CAPITOLO 4
Un'applicazione : Misura di spettri di sorgenti monocromatiche e taratura
in energia di un rivelatore con scintillatore NaI(Ti)
4.1
introduzione
Il dispositivo è stato utilizzato per misurare lo spettro di alcune sorgenti che emettono fotoni γ
monocromatici . Precisamente:
-60Co
-137Cs
-226Ra
-241Am
Grazie a queste sorgenti siamo in grado di effettuare la taratura in energia del rivelatore utilizzato
.Questa procedura consiste nel analizzare gli spettri di sorgenti note, prestando particolare
attenzione ai picchi monocromatici detti fotopicchi.
Tali picchi appaiono, a causa della natura probabilistica dei meccanismi di rivelazione dei fotoni
monocromatici, come delle distribuzioni gaussiane centrate attorno ad un valore che corrisponde
all'energia del γ monocromatico emesso da tali sorgenti.
Il procedimento che si segue per misurare l'energia di tali decadimenti consiste nel misurare lo
spettro della sorgente, ricavare i dati che corrispondono al fotopicco, interpolare il fotopicco con
una Gaussiana, calcolare il valor medio e la deviazione standard di tale Gaussiana.
Il valor medio corrisponde al canale in cui è più probabile trovare il fotopicco, mentre la deviazione
standard ci permette di ricavare l'incertezza relativa a tale valore.
Una volta trovato il canale corrispondente al fotopicco della sorgente in esame si associa ad esso il
valore in energia tabulato sui manuali dei radionuclidi.
Successivamente si ripete lo stesso procedimento sostituendo la sorgente con un'altra che abbia il
fotopicco centrato su una energia differente.
60
Una volta ricavati i valori medi e le deviazioni standard per un buon numero di sorgenti si può
disegnare un grafico canali-energia. Da tale grafico si ricava la legge di conversione fra canali dello
spettroscopio ed energia corrispondente.
Nei rivelatori a scintillatore NaI questa legge è di tipo lineare sopra le centinaia di keV . Al di sotto
dei 100keV invece, presenta un andamento sovralineare.
In alcuni casi non è possibile interpolare una Gaussiana con i picchi rivelati in quanto tali picchi si
sovrappongono . Il 226Ra è un tipico esempio in quanto presenta quattro picchi ravvicinati a 352,
295, 241 e 186 keV le cui distribuzioni si sovrappongono. In questi casi l' alternativa più semplice è
trovare il valor medio del picco trovando il canale in cui il numero di conteggi è maggiore.
In questa esperienza verrà calcolata a titolo di esempio l'interpolazione del fotopicco del 137Cs
Una volta nota la legge di conversione canali-energia si possono convertire tutti gli spettri misurati
in termini di canali e conteggi, in spettri aventi sulle ascisse l'energia e sulle ordinate i conteggi .
Per questo lavoro di tesi non verrà utilizzata l'interpolazione dell'impulso descritta precedentemente
ma verranno utilizzati i dati puri. Questo permetterà di dimostrare fedelmente le potenzialità del
dispositivo da me realizzato. Il calcolo dell'ampiezza viene svolto in maniera moto semplice. Per
ogni schermata viene calcolato il massimo e il minimo dell'impulso con il seguente algoritmo:
for r=0 to (Data_lenght/2)-1
If r = 0 Then
min_data = Data_val
End If
If Data_val < min_data Then
min_data = Data_val
End If
' Data lenght è il numero totale di byte della schermata
'Data_val è il numero a 12 bit proveniente dall'ADC
If r = 0 Then
max_data = Data_val
End If
If Data_val > max_data Then
max_data = Data_val
End If
Next r
All'uscita di questa routine avremo min_data e max_data che corrispondono al minimo e al
massimo dell'impulso misurato. Il valore assoluto della differenza di questi valori ci dà l'ampiezza
dell'impulso.
61
4.2Apparato sperimentale
1. Fototubo composto da :
-Scintillatore NaI(Ti)
-fotomoltiplicatore
2. Generatore di alta tensione “Tennelec”
3. Dispositivo di acquisizione da me costruito
4. Cavo BNC-BNC per segnale
5. Cavo BNC-BNC per alta tensione
6. Pozzetto in piombo per schermatura
7. sorgenti
8. PC
Illustrazione 29: Schema dell'apparato sperimentale
4.3Procedimento
Una volta collegati tutti i dispositivi si inserisce nel pozzetto di schermatura la prima sorgente .
Si avvia l'applicazione in Visual Basic e si impostano i seguenti parametri :
-512 canali
-fondoscala a ± 1V
-base dei tempi a 2μs/div
-slope del trigger negativo
La scelta della tensione di soglia dipende dall'energia minima che vogliamo misurare . E' buona
norma in ogni caso impostare la soglia in maniera tale che questa sia più bassa possibile. In questo
modo ci assicuriamo di visualizzare tutto lo spettro della sorgente in esame . Una volta scelta la
62
tensione di soglia si accende il generatore di alta tensione e si imposta il voltaggio a circa 1100V.
Questa tensione è stata scelta osservando il numero di conteggi per unità di tempo . Difatti esiste un
intervallo di tensioni per cui il numero di conteggi per unità di tempo è costante. Tale tensione è
detta tensione di pianerottolo .
La durata dell'acquisizione dipende dall'attività della sorgente e dall'accuratezza richiesta nella
misurazione dello spettro . In generale, sorgenti poco attive hanno bisogno di tempi di acquisizione
più lunghi per ottenere un accuratezza accettabile.
Per questa esperienza i tempi di acquisizioni sono stati scelti in questo modo:
-241Am : 30 minuti
-226Ra : 1 ora
-137Cs : 1 ora
-60Co : 1 ora
Una volta terminato il processo di acquisizione i dati possono essere salvati su un file di testo
premendo il tasto “Salva spettro” .In questo modo i dati possono essere elaborati con un
programma di calcolo come ad esempio Excel
4.4
Elaborazione dei dati
Successivamente all' acquisizione degli spettri si analizzano i dati da cui si ricavano i canali in cui
cadono i picchi delle diverse sorgenti . Successivamente si associa a ognuno dei canali trovati il
valore di energia tabulato sul manuale dei radionuclidi [8].
Canale
Energia (keV)
42
60
50
75
104
186
126
241
144
295
162
352
226
609
235
662
320
1173
342
1332
Da questi dati si ricava l'interpolazione che meglio approssima i dati sperimentali: tale
interpolazione sarà la nostra curva di taratura.
63
La legge che associa i canali all'energia è di tipo parabolico:
Energia[ keV ] = 0, 0092 ⋅ Canale 2 + 0, 7 ⋅ Canale
Curva di taratura canali-energia
2000
1800
1600
Energia (keV)
1400
1200
1000
800
600
400
200
0
0
50
100
150
200
250
300
350
400
450
Canali
Dati sperimentali
Interpolazione quadratica
Interpolazione lineare (E > 300 kev)
Si può notare in ogni caso la linearità della distribuzione per valori di energia maggiori di 300 keV
come previsto dalla teoria.
Utilizzando la legge ricavata si possono rappresentare gli spettri in un grafico energia-conteggi:
64
Spettro del Am241
16000
14000
12000
Conteggi
10000
8000
6000
4000
2000
0
30
50
70
90
110
130
150
Energia (keV)
Spettro del Ra226
2500
Conteggi
2000
1500
1000
500
0
0
500
1000
65
Energia
(keV)
1500
2000
Spettro reale
Picco interpolato
Spettro del Cs137
6000
5000
Conteggi
4000
3000
2000
1000
0
0
100
200
300
400
500
600
700
800
900
1000
1400
1600
1800
2000
Energia (keV)
Valor medio dell'energia: 670,28keV
Deviazione standard: 27,47 keV
Spettro del Co60
4500
4000
3500
Conteggi
3000
2500
2000
1500
1000
500
0
0
200
400
600
800
1000
1200
Energia (keV)
66
CONCLUSIONI
Come si può notore dai grafici precedenti, il dispositivo da me realizzato è perfettamente in grado di
riprodurre gli spettri di sorgenti γ note. E' chiaro che attraverso un attenta taratura in energia, il
dispositivo sia in grado di misurare fedelmente gli spettri γ di sorgenti qualsiasi.
Allo stato attuale il progetto è fortemente limitato dai criteri di progettazione precedentemente
elencati. Fra tutti i criteri quello più limitante è sicuramente la scelta di realizzare il dispositivo
limitando al massimo i componenti a montaggio superficiale. Questa scelta è stata fatta tenendo in
forte considerazione la didattica del progetto e la sua effettiva realizzabilità.
Nonostante ciò questa scelta aumenta i costi di produzione a causa della diminuzione della domanda
per i componenti DIP, aumenta le dimensioni del dispositivo, aumenta la corrente assorbita dal
dispositivo e infine riduce le prestazioni del dispositivo come,ad esempio, la banda passante .
In ogni caso il dispositivo si presta a molti sviluppi futuri . Fra le direzioni che questo progetto può
intraprendere due fra tutte sono le più probabili:
Si potrebbe sviluppare il dispositivo come uno strumento “da banco” migliorando in generale le
prestazioni dello stesso attraverso alcuni accorgimenti fra cui:
•
•
•
•
Aggiunta di un canale, questo comporterebbe notevoli vantaggi fra cui:
-acquisizioni da diversi rivelatori su intervalli di energia diversi
-Campionamento in oversampling, attraverso un opportuno sfasamento dei segnali di clock
delle due adc i due canali possono alternarsi nel campionamento dello stesso segnale,
raddoppiando cosi la frequenza di campionamento .
Aumento della frequenza massima di campionamento attraverso l'utilizzo di clock esterni al
microcontrollore
Riduzione della corrente assorbita mediante una scelta accurata dei componenti
Eliminazione di contatori, latch e circuito di trigger attraverso l'utilizzo di un FPGA
D'altro canto si potrebbe cercare di contrarre il progetto verso un dispositivo stand-alone portatile.
Per attuare questo sviluppo si dovrebbe ridurre al minimo la corrente assorbita attraverso l'utilizzo
di componenti a montaggio superficiale. L'utilizzo di questi componenti comporterebbe inoltre una
notevole riduzione dell'ingombro del dispositivo . Se il sistema venisse corredato ad un generatore
di alta tensione switching, il quale a parità di potenza erogata è molto più compatto di un normale
alimentatore, si potrebbe realizzare uno spettrometro portatile alimentato a batteria.
I dati, elaborati direttamente dal microcontrollore, potrebbero essere salvati su supporti removibili
come SD card o pen-drive oppure scaricati tramite connessione USB .
67
Bibliografia
[1] William R. Leo W.R. Leo - Techniques for nuclear and particle physics experiments
[2] Microchip - PIC32MX3XX/4XX Family Data Sheet
[3] Lucio di Jasio -Programming 32-bit Microcontrollers in C . Exploring the PIC32
[4] Microchip - PIC32 Peripheral Libraries for MPLAB C32 Compiler
[5] Microchip – Bud Caldwell -AN1164- USB CDC Class on an Embedded Device
[6] Analog Devices – AD9235 Datasheet - 12-Bit, 20/40/65 MSPS 3 V A/D Converter
[7] Taylor – Introduzione all'analisi degli errori (Zanichelli Ed)
[8] Damiri- Bibliotheqe de radionuclides pour la spectrometrie gamma et alpha – tome 1
Ringraziamenti
Fra tutte le persone che devo ringraziare, la prima è sicuramente CALLISTO PILI . Senza di lui
questo progetto sarebbe durato anni .
Ringrazio Ore per essere cosi Ore
Ringrazio Paì perchè ey! Ecco il Pai scope .
Soltanto un'ora mi separa dalla consegna della tesi quindi sarò breve : ringrazio Stefano , Marcu
Serra , Mauro , Andrea, Gianfranco , Damiano per aver condiviso con me questo laboratorio .
68