Istituto di Istruzione Superiore “Cristoforo Marzoli”
Con sezioni associate
ISTITUTO TECNICO INDUSTRIALE STATALE “CRISTOFORO MARZOLI”
LICEO SCIENTIFICO DI STATO “GALILEO GALILEI”
Via Levadello, 25036 Palazzolo s/O (BS) – C.F. 91011920179 - tel. 0307400391 fax 03074070000
TESINA PER L’ ESAME DI STATO
CANDIDATO: PIANTONI FEDERICO
CLASSE: 5^D
INDIRIZZO: ELETTRONICA E TELECOMUNICAZIONI
ANNO SCOLASTICO: 2004/05
1
SOMMARIO
Introduzione
Pag.3
Principio di funzionamento
Pag.4
Componenti optoelettronici
Pag.6
Flip-flop
Pag.11
Microcontrollore HC08
Pag.12
Programmazione
Pag.14
Amplificatore operazionale
Pag.20
Convertitore A/D
Pag.21
Driver display
Pag.21
Display 7 segmenti led
Pag.23
Schema circuitale autovelox
Pag.24
Semaforo
Pag.25
Alimentazione
Pag.26
Schema circuitale semaforo e alimentazione
Pag.27
Problemi riscontrati e osservazioni
Pag.28
2
INTRODUZIONE
L’obbiettivo del progetto è realizzare un modellino di autovelox che
misuri la velocità di un oggetto e la visualizzi su un display. La
velocità sarà determinata con la relazione: velocità=spazio/tempo,
dove lo spazio è la distanza in mm tra i due sensori che rilevano il
passaggio dell’oggetto mentre il tempo sono i secondi necessari
all’oggetto per andare da un sensore all’altro.
SCHEMA A BLOCCHI
RILEVAM.
IR
RILEVAM.
IR
CIRCUITO
DI
CONDIZIONAM.
CIRCUITO
DI
CONDIZIONAM.
SOFTWARE
MICRO
CONTROLLORE
MEMORIZZAZIONE
DAC
CIRCUITO
DI
CONDIZIONAM.
ADC
DRIVER
DISPLAY
7
7
7
SEGM SEGM SEGM
3
PRINCIPIO DI FUNZIONAMENTO
Vi sono due sensori, ognuna formata da un diodo emettitore di luce
infrarossa a 930nm e da un fototransistor sensibile alla luce
infrarossa (con sensibilità massima a 930nm, compatibile quindi con
il diodo emettitore) messi uno di fronte all’altro. Il fototransistor si
comporta da circuito aperto se non colpito dalla luce infrarossa
mentre si comporta da cortocircuito in caso di massimo
irraggiamento.
Collegato ad ogni sensore c’è un amplificatore operazionale
utilizzato come trigger non invertente a soglie non simmetriche in
modo da avere in uscita livelli di tensione stabili a seconda della
ricezione infrarossa del fototransistor che potrebbe funzionare non
regolarmente a causa di un cattivo allineamento con l’emettitore o in
caso di irraggiamento di luce solare che contiene raggi infrarossi che
interferiscono con quelli dell’emettitore.
L’operazionale è seguito da un transistor in serie ad una resistenza
collegata a 5v, che dà in uscita 5v in caso di visibilità tra emettitore e
transistor, mentre 0v in caso di interruzione del raggio infrarosso,
cioè in caso di passaggio dell’auto; in uscita risultano esattamente i
due livelli compatibili TTL, 5v come livello alto e 0v come livello
basso.
I due circuiti rilevatori sono collegati ad un flip-flop JK (TTL 7476) con
J e K a massa, il primo sensore al preset e il secondo al clear, in
modo da avere in uscita dal flip-flop un impulso di lunghezza pari al
tempo necessario all’auto per andare dal primo sensore al secondo.
Questo impulso entra nel PTA1 del microcontrollore HC08 a 16pin. Il
uC è programmato per dare in uscita (sugli 8bit del PTB) un numero
tra 0 e 255 che rappresenta la velocità.
Sul PTA3 il uC è collegato un pulsante normalmente aperto collegato
a massa che, con la resistenza di pull-up all’interno dell’integrato
attivata attraverso il software, serve da reset del uC.
Gli 8bit del uC sono collegati agli 8bit in ingresso di un convertitore
digitale-analogico (AD558) che converte il numero binario entrante
(0-255) nei suoi ingressi, nella corrispondente tensione tra 0 e 2,55v.
In successione vi sono poi due amplificatori operazionali in
configurazione invertente, il primo con guadagno -0,39 e l’altro di
guadagno -1.
4
In questo modo, il range di tensione in ingresso (0-2,55v) sarà
attenuato; l’uscita varierà quindi tra 0v e 1v. Vista l’impossibilità di
avere precisamente un guadagno di 0,39 a causa dei limitati valori
commerciali delle resistenze, il guadagno totale dei due operazionali
in cascata sarà 0,37 e il range varierà tra 0v e 0,944v.
Lo stadio finale, di visualizzazione della velocità, è composto da un
particolare convertitore A/D (CA3162), un display driver (CA3161) e
tre display sette segmenti ad anodo comune (H-) alimentati
attraverso transistor BC328, questi ultimi pilotati dal convertitore
A/D. L’ADC ha il compito principale di convertire in quattro bit una
tensione compresa tra 0v e 1v e di inviarli al driver display che pilota
i display sette segmenti.
I display sono pilotati in sequenza: dal convertitore escono
rapidamente in bit i tre numeri da visualizzare e
contemporaneamente pilota i tre display attraverso i tre transistor. Il
numero visualizzato corrisponde ai mV entranti nel conv. A/D.
Anche se il range di tensione entrante ha un valore massimo di
944mV, sarà possibile visualizzare correttamente i valori agendo sui
trimmer, modificando il valore di fondo scala e quindi, il guadagno.
USCITE DI OGNI BLOCCO
uscita uC (in bit)
0
1
...
127
128
...
254
255
uscita DAC (v)
0
0,01
...
1,27
1,28
...
2,54
2,55
uscita AO (v)
0
0,004
...
0,470
0,474
...
0,940
0,944
display
0
4
...
496
500
...
996
999
5
EMETTITORE E FOTOTRANSISTOR
A INFRAROSSI
Il led emettitore di luce infrarossa utilizzato nel circuito è l’OP165
della OPTEK. È un led di 3mm che emette luce infrarossa a
930nm, a breve distanza e con uno stretto angolo di trasmissione.
Per un funzionamento ottimale necessita di una tensione di
polarizzazione diretta di 1,6v e sopporta una corrente massima di
10mA. I tempi di accensione e spegnimento del led sono
dell’ordine dei nanosecondi e sono quindi trascurabili ai fini del
progetto.
Il fototransistor scelto è invece l’OP505 sempre della OPTEK,
progettato appositamente per lavorare in accoppiata con
l’emettitore OP165, anch’esso quindi sensibile ai raggi infrarossi a
930nm; questo teoricamente si comporta da circuito aperto se la
base non è colpita da infrarossi mentre da cortocircuito (va in zona
di saturazione) se la base è irradiata, e in quest’ultimo caso la
tensione tra collettore ed emettitore è di 400mV.
6
PRINCIPIO DI FUNZIONAMENTO DI
UN LED INFRAROSSO
Un LED (light emitting diode) è un particolare tipo di diodo che
emette una piccola quantità di luce se attraversato da una corrente
elettrica. Esso è formato internamente da un chip di materiale
semiconduttore ed esternamente da due terminali.
La luce è una forma di energia che viene rilasciata da un atomo.
Questa è composta da piccolissime particelle chiamate fotoni che
rappresentano la singola unità di luce.
In un atomo ci sono differenti elettroni che si muovo in un orbita
intorno al nucleo. A seconda dell'orbita, un elettrone ha una certa
quantità di energia. Più l'orbita è larga, più esso è carico. Quando un
elettrone passa da un orbita larga ad una inferiore, esso perde un po’
della sua energia e lo fa sotto forma di un fotone. Più è alta l'energia
rilasciata dall'elettrone, più il fotone è potente. Le cariche negative
della regione N passano nella regione P per occupare le lacune con
carica positiva. Visto che le lacune hanno un quantitativo di energia
inferiore alle cariche negative, esse devono consumare della carica
per poterli occupare e generano quindi fotoni (producendo la luce).
Questo processo accade in tutti i diodi ma è visibile solo in quelli in
cui la lunghezza d’onda dei fotoni prodotti è visibile dall'occhio
umano. Usando materiali in cui gli elettroni hanno delle quantità
inferiori di elettricità, la lunghezza d’onda dei fotoni sarà più alta della
soglia visibile e non può essere percepita dal nostro occhio,
formando un led a infrarossi.
7
PRINCIPIO DI FUNZIONAMENTO DI
UN FOTOTRANSISTOR
Come noto, un transistor è formato da una giunzione NPN o PNP.
Un fototransistor è un particolare BJT (bipolare) che si presenta
all’esterno con soli 2 terminali, infatti la base non è più pilotata in
corrente ma con la luce (fotoni). La giunzione attiva di un
fototransistor è la giunzione base-collettore polarizzata
inversamente.
In una giunzione P-N polarizzata inversamente, se irradiata di
luce, si verifica un aumento della corrente inversa dovuta ai
portatori minoritari. Questo perché quando una radiazione
colpisce un semiconduttore drogato produce coppie elettronelacuna con conseguente aumento dei portatori minoritari.
VCC
R
N
LUCE
P
ZONA DI
SVUOTAMENTO
Vo  Vcc  R  Ic
N
collettore
emettitore
8
PROVA DEL CIRCUITO DI RILEVAMENTO
DI PASSAGGIO A INFRAROSSI
SCHEMA CIRCUITALE
Vir
Vop
DIMENSIONAMENTO
-FURMULA LED IR
Iled 
Vin - Vled 5V  1V

 40mA
R7
100
NOTE
Visto che la corrente massima
sopportata dal led IR è di 50mA,
scelgo una corrente di 40mA.
La tensione del led acceso è di 1V.
-FORMULE FOTOTRANSISTOR
Ic 
Vin
5V

 5mA
R6 1K
Ib 
Vop
5V

 0.5mA
R10 10 K
Scelgo una corrente Ic di 5mA.
Per una forte saturazione del
transistor, la corrente di base Ib
dev’essere circa un decimo di Ic
quindi sarà 0.5mA.
-FORMULE TRIGGER NON INVERTENTE
 R9 
 2.7 K 
Vtm  Vr  1    3.9V  1 
  4.16V
 R5 
 47 K 
R9
2.7 K
Vh  Vsat 
 5V 
 0.29V
R5
47 K
Vref 
Vin  R12
5V 10 K

 3.9V
R12  R11 10 K  2.7 K
Scelgo una Vtm (valore di soglia) di
4.16V e una Vh (isteresi) di 0.29V
per non rischiare disturbi e
malfunzionamenti.
9
GRAFICO LIVELLI TRIGGER NON INVERTENTE
Vop(V)
5.5
5
4.5
4
basso-alto
3.5
alto-basso
3
soglia (Vtm)
2.5
2
1.5
1
0.5
0
-0.5
0
0.5
1
1.5
2
2.5
3
3.5
4
4.5
5
5.5
Vir(V)
TABELLA VALORI
Vir
Vref
Vtm
Vop
Vo
On
2.59V
3.90V
4.16V
0.20V
4.92V
Off
4.93V
3.90V
4.16V
3.68V
0.05V
OSSERVAZIONI
Collegando in uscita un led (in serie ad una resistenza) è stato
possibile notare il passaggio di un oggetto attraverso il sensore a
seconda del led acceso o spento.
Il led è acceso quando non c’è passaggio e si spegne nel momento
in cui un oggetto interrompe il raggio luminoso infrarosso.
Vista la poca potenza dei dispositivi ottici, tra emettitore e
fototransistor si è scelta una distanza di circa 3cm per garantire un
ottimo funzionamento anche con uno scarso allineamento.
10
FLIP FLOP
Come componente memorizzatore si è scelto il flip-flop JK 7476
della serie TTL. Questo componente ha il compito di dare uscita alta
per tutta la durata del passaggio dell’oggetto tra i due sensori.
La configurazione del flip-flop, per svolgere questo compito, sarà
quella con J e K a massa e i due circuiti rilevatori di passaggio
collegati il primo al preset e il secondo al clear (entrambi attivi
bassi).
SCHEMA CIRCUITALE
TABELLA VALORI
SECONDO
SENSORE
INGRESSI
USCITA
PRE
CLR
Q
1
0
1
0
1
0
N.B. Livelli TTL nel caso in cui gli
ingressi J e K siano a massa.
PRIMO
SENSORE
PIEDINATURA
OSSERVAZIONI
Per verificare praticamente il corretto
funzionamento del circuito memorizzatore,
in uscita si è collegato un led. Questo led si
accende quando l’oggetto attraversa il
primo sensore e si spegne quando
attraversa il secondo. Il led acceso
corrisponde al livello alto TTL cioè 5V.
11
MICROCONTROLLORE HC08
Il microcontrollore è utilizzato per generare in uscita un valore che
opportunamente amplificato corrisponderà alla velocità dell’oggetto.
Il microcontrollore scelto è il Motorola HC08 a 16pin (QY), il software
per programmarlo è il Codewarrior della Metrowerks, la scheda di
programmazione utilizzata è la PK-HC08QT per l’HC08 a 8pin (QT).
Quest’ultima è stata opportunamente modificata per poter
programmare anche l’HC08 a 16pin (QY).
L’uscita binaria che darà la velocità corrisponderà agli 8bit del PORT
B. L’ingresso del micro è invece il PTA1 ed è collegato all’uscita del
flip-flop. L’uscita del flip-flop può essere collegata direttamente nel
micro, essendo quest’ultima compatibile con i livelli TTL. Il
programma è stato scritto in linguaggio ASSEMBLER (linguaggio più
vicino al linguaggio macchina), per la scarsa conoscenza del
linguaggio C (linguaggio più vicino al linguaggio umano) da parte del
candidato e per motivi di scarsa memoria del componente (un
programma scritto in C richiede molta più memoria di un programma
di pari utilità scritto in ASM).
La piedinatura del micro è la seguente:
PIEDINATURA
12
SCHEMA INTERNO DELL’HC08
I principali componenti del microcontrollore sono:
-ALU (aritmetic logic unit): è il circuito che svolge calcoli aritmetici e
logici, il “cervello” del microcontrollore
-RAM (memoria volatile di lettura e scrittura): memoria di lettura e
scrittura necessaria per l’elaborazione dei dati da parte della ALU
-FLASH (memoria non volatile in tecnologia FLASH) e ROM
(memoria non volatile): contiene tutto il programma e tutti i dati
-A (accumulatore) e X (index register): registri d’appoggio per
depositare temporaneamente i dati da elaborare
-PC (program counter): contiene l’indirizzo della cella di memoria in
cui è presente il codice operativo dell’istruzione da eseguire
-UC (control unit) o CPU Control: è il circuito che invia le sequenze
di comandi agli altri dispositivi per eseguire le istruzioni richieste
-DDR (data direction register): contengono una sequenza di bit dalla
quale decidono se un pin è ingresso o uscita (8 bit corrispondono a
8 pin)
-PT (port): registri contenenti una sequenza di bit ognuno dei quali
corrisponde al livello letto sul pin (se è un ingresso) o al livello
generato sul pin (se è un’uscita)
-CCR (control code register): collegato alla ALU è un registro 8 bit
con 6 bit attivi, ognuno dei quali indica un certo evento di calcolo
(N=risultato negativo, Z=risultato zero, C=riporto, I=interrupt,
H=mezzo riporto, ecc…)
13
XDEF main, irq_isr
Include 'HC08QT.inc'
DEFAULT_ROM
init:
bset 0, CONFIG1
;Disables COP
PROGRAMMA
SECTION
b1:
;313
mov #$00, DDRA
;PTA
mov #$FF, DDRB
;PTB
mov #$00, PTB
;PTB
dbnz $80,b1
dbnz $81,b1
mov #$FF, $80
mov #$20, $81
mov #$4f, $83
brset 1,PTA,b2
mov $83,PTB
jmp fine
tutte entrate
tutte uscite
forzato a zero
mov #%00001000,PTAPUE
Up sul PTA disattivato
;Pull-
;tranne sul pin di reset (PTA3)
mov #%00000000,PTBPUE
;PullUp sul PTB disattivato
mov #$49, CONFIG2
;Enables external oscillator and IRQ pin
mov #$02, OSCSTAT
;Enables external clock generator
rts
main:
cli
;Enables global interrupts
bsr
init
main_loop:
mov #$FF, $80
;metti $FF nella cella $80
mov #$80, $81
;metti $80 nella cella $81
brset 1,PTA,conta ;salta a conta se sul
PTA1 c'è 1
bra main_loop
;salta
(salto corto) in ogni caso a main_loop
conta:
;1000
dbnz $80,conta
;decrementa di 1 il contenuto della cella
;$80 e salta se è = a 0
dbnz $81,conta
;come sopra...in totale passa circa 100ms
mov #$FF, $80
;metti $FF in $80
mov #$80, $81
;metti $80 in $81
mov #$FF, $83
;metti $FF in $83
brset 1,PTA,ca
;salta
a ca se sul PTA1 c'è 1
mov $83,PTB
;metti sul PTB il contenuto della cella $83
jmp fine
;salta
(salto lungo) a fine
ca:
;500
dbnz $80,ca
dbnz $81,ca
mov #$FF, $80
mov #$80, $81
mov #$7f, $83
brset 1,PTA,b
mov $83,PTB
jmp fine
b:
;333
dbnz $80,b
dbnz $81,b
mov #$FF, $80
mov #$20, $81
mov #$54, $83
brset 1,PTA,b1
mov $83,PTB
jmp fine
b2:
;294
dbnz $80,b2
dbnz $81,b2
mov #$FF, $80
mov #$20, $81
mov #$4a, $83
brset 1,PTA,b3
mov $83,PTB
jmp fine
b3:
;278
dbnz $80,b3
dbnz $81,b3
mov #$FF, $80
mov #$20, $81
mov #$46, $83
brset 1,PTA,b4
mov $83,PTB
jmp fine
b4:
;263
dbnz $80,b4
dbnz $81,b4
mov #$FF, $80
mov #$20, $81
mov #$42, $83
brset 1,PTA,c
mov $83,PTB
jmp fine
c:
;250
dbnz $80,c
dbnz $81,c
mov #$FF, $80
mov #$20, $81
mov #$3f, $83
brset 1,PTA,c1
mov $83,PTB
jmp fine
c1:
;238
dbnz $80,c1
dbnz $81,c1
mov #$FF, $80
mov #$20, $81
mov #$3b, $83
brset 1,PTA,c2
mov $83,PTB
jmp fine
c2:
;227
dbnz $80,c2
dbnz $81,c2
mov #$FF, $80
mov #$20, $81
mov #$39, $83
brset 1,PTA,c3
mov $83,PTB
jmp fine
14
mov #$40, $81
mov #$29, $83
brset 1,PTA,d1a
mov $83,PTB
jmp fine
c3:
;217
dbnz $80,c3
dbnz $81,c3
mov #$FF, $80
mov #$20, $81
mov #$36, $83
brset 1,PTA,c4
mov $83,PTB
jmp fine
d1a:
;154
dbnz $80,d1a
dbnz $81,d1a
mov #$FF, $80
mov #$40, $81
mov #$26, $83
brset 1,PTA,d2
mov $83,PTB
jmp fine
c4:
;208
dbnz $80,c4
dbnz $81,c4
mov #$FF, $80
mov #$20, $81
mov #$34, $83
brset 1,PTA,d
mov $83,PTB
jmp fine
d2:
;143
dbnz $80,d2
dbnz $81,d2
mov #$FF, $80
mov #$40, $81
mov #$23, $83
brset 1,PTA,d2a
mov $83,PTB
jmp fine
d:
;200
dbnz $80,d
dbnz $81,d
mov #$FF, $80
mov #$20, $81
mov #$32, $83
brset 1,PTA,dd1
mov $83,PTB
jmp fine
d2a:
;133
dbnz $80,d2a
dbnz $81,d2a
mov #$FF, $80
mov #$40, $81
mov #$21, $83
brset 1,PTA,d3
mov $83,PTB
jmp fine
dd1:
;192
dbnz $80,dd1
dbnz $81,dd1
mov #$FF, $80
mov #$20, $81
mov #$30, $83
brset 1,PTA,dd2
mov $83,PTB
jmp fine
d3:
;125
dbnz $80,d3
dbnz $81,d3
mov #$FF, $80
mov #$40, $81
mov #$1f, $83
brset 1,PTA,d3a
mov $83,PTB
jmp fine
dd2:
;185
dbnz $80,dd2
dbnz $81,dd2
mov #$FF, $80
mov #$20, $81
mov #$2e, $83
brset 1,PTA,dd3
mov $83,PTB
jmp fine
d3a:
;118
dbnz $80,d3a
dbnz $81,d3a
mov #$FF, $80
mov #$40, $81
mov #$1d, $83
brset 1,PTA,d4
mov $83,PTB
jmp fine
dd3:
;179
dbnz $80,dd3
dbnz $81,dd3
mov #$FF, $80
mov #$20, $81
mov #$2c, $83
brset 1,PTA,dd4
mov $83,PTB
jmp fine
d4:
;111
dbnz $80,d4
dbnz $81,d4
mov #$FF, $80
mov #$80, $81
mov #$1b, $83
brset 1,PTA,e
mov $83,PTB
jmp fine
dd4:
;172
dbnz $80,dd4
dbnz $81,dd4
mov #$FF, $80
mov #$20, $81
mov #$2b, $83
brset 1,PTA,d1
mov $83,PTB
jmp fine
d1:
;167
dbnz $80,d1
dbnz $81,d1
mov #$FF, $80
e:
;100
dbnz $80,e
dbnz $81,e
mov #$FF, $80
mov #$80, $81
mov #$18, $83
brset 1,PTA,ea
mov $83,PTB
jmp fine
15
ea:
;91
dbnz $80,ea
dbnz $81,ea
mov #$FF, $80
mov #$80, $81
mov #$16, $83
brset 1,PTA,e1
mov $83,PTB
jmp fine
f1:
;45
dbnz $80,f1
dbnz $81,f1
dbnz $82,f1
mov #$FF, $80
mov #$80, $81
mov #$02, $82
mov #$0a, $83
brset 1,PTA,f2
mov $83,PTB
jmp fine
e1:
;83
dbnz $80,e1
dbnz $81,e1
mov #$FF, $80
mov #$80, $81
mov #$02, $82
mov #$14, $83
brset 1,PTA,e1a
mov $83,PTB
jmp fine
f2:
;42
dbnz $80,f2
dbnz $81,f2
dbnz $82,f2
mov #$FF, $80
mov #$80, $81
mov #$02, $82
mov #$09, $83
brset 1,PTA,f3
mov $83,PTB
jmp fine
e1a:
;77
dbnz $80,e1a
dbnz $81,e1a
mov #$FF, $80
mov #$80, $81
mov #$12, $83
brset 1,PTA,e2
mov $83,PTB
jmp fine
f3:
;38
dbnz $80,f3
dbnz $81,f3
dbnz $82,f3
mov #$FF, $80
mov #$80, $81
mov #$02, $82
mov #$08, $83
brset 1,PTA,f4
mov $83,PTB
jmp fine
e2:
;71
dbnz $80,e2
dbnz $81,e2
mov #$FF, $80
mov #$80, $81
mov #$02, $82
mov #$11, $83
brset 1,PTA,e3
mov $83,PTB
jmp fine
f4:
;36
dbnz $80,f4
dbnz $81,f4
dbnz $82,f4
mov #$FF, $80
mov #$80, $81
mov #$05, $82
mov #$08, $83
brset 1,PTA,g
mov $83,PTB
jmp fine
e3:
;63
dbnz $80,e3
dbnz $81,e3
mov #$FF, $80
mov #$80, $81
mov #$02, $82
mov #$f, $83
brset 1,PTA,e4
mov $83,PTB
jmp fine
g:
;33
dbnz $80,g
dbnz $81,g
dbnz $82,g
mov #$FF, $80
mov #$80, $81
mov #$05, $82
mov #$07, $83
brset 1,PTA,g1
mov $83,PTB
jmp fine
e4:
;56
dbnz $80,e4
dbnz $81,e4
mov #$FF, $80
mov #$80, $81
mov #$02, $82
mov #$0d, $83
brset 1,PTA,f
mov $83,PTB
jmp fine
f:
;50
dbnz $80,f
dbnz $81,f
dbnz $82,f
mov #$FF, $80
mov #$80, $81
mov #$02, $82
mov #$0b, $83
brset 1,PTA,f1
mov $83,PTB
jmp fine
g1:
;29
dbnz $80,g1
dbnz $81,g1
dbnz $82,g1
mov #$FF, $80
mov #$80, $81
mov #$05, $82
mov #$06, $83
brset 1,PTA,ha
mov $83,PTB
jmp fine
16
fine:
ha:
;25
mov $83,PTB;metti numero contenuto in$83
dbnz $80,ha
dbnz $81,ha
dbnz $82,ha
mov #$FF, $80
mov #$80, $81
mov #$0a, $82
mov #$05, $83
brset 1,PTA,i
mov $83,PTB
jmp fine
su PTB
jmp main_loop
irq_isr:
bil
irq_isr
; Waits for the IRQ signal to go high
jmp
$FE1A
; Jumps to monitor code
END
i:
;20
dbnz $80,i
dbnz $81,i
dbnz $82,i
mov #$FF, $80
mov #$80, $81
mov #$0a, $82
mov #$04, $83
brset 1,PTA,l
mov $83,PTB
jmp fine
l:
;17
dbnz $80,l
dbnz $81,l
dbnz $82,l
mov #$FF, $80
mov #$80, $81
mov #$0a, $82
mov #$03, $83
brset 1,PTA,m
mov $83,PTB
jmp fine
m:
;14
dbnz $80,m
dbnz $81,m
dbnz $82,m
mov #$FF, $80
mov #$80, $81
mov #$0a, $82
mov #$03, $83
brset 1,PTA,p
mov $83,PTB
jmp fine
p:
;13
dbnz $80,p
dbnz $81,p
dbnz $82,p
mov #$FF, $80
mov #$80, $81
mov #$0a, $82
mov #$02, $83
brset 1,PTA,q
mov $83,PTB
jmp fine
q:
;11
dbnz $80,q
dbnz $81,q
dbnz $82,q
mov #$FF, $80
mov #$80, $81
mov #$0a, $82
mov #$02, $83
r:
;10
dbnz $80,r
dbnz $81,r
dbnz $82,r
mov #$02, $83
NOTE:
Per calcolare il ritardo esatto tra gli intervalli
di tempo necessari nel programma ci si
basa sulla frequenza di clock del
microcontrollore che è di circa 2.4MHz.
Ogni istruzione per essere svolta necessita
di più cicli. Un ciclo corrisponde al tempo di
clock, calcolato come l’inverso della
frequenza.
Se la frequenza è di 2.4MHz il tempo sarà:
tck=1/Fck=500ns.
L’istruzione DBNZ occupa 5 cicli, quindi ogni
decremento della cella occuperà: tdbnz=5
tck=2,5us.
Di conseguenza se, ad esempio, si
necessità di un ritardo di 100ms, il numero
di decrementi sarà circa:
N= 100ms/tdbnz=40000.
Visto che il numero massimo che una cella
di 8bit può contenere è 256, si utilizzano 2
celle. Il numero di decrementi corrisponderà
così al prodotto tra i due numeri nella cella:
40000=256*156. Nella prima cella si
memorizzerà FF (256 in decimale) e nella
seconda 9C (156 in decimale).
Considerando l’esistenza di altre istruzioni
che, anche se svolte in qualche us,
aumentano il tempo totale di svolgimento
del programma, dopo diverse prove pratiche
il ritardo è stato lievemente diminuito
memorizzando nella seconda cella il
numero 80 (128 in decimale).
Per verificare il corretto funzionamento del
microcontrollore si è provato a cronometrare
il ciclo totale del micro ed effettivamente la
durata totale del ciclo è stata di 10s.
17
TABELLA VALORI
velocità=distanza/tempo
distanza(mm)
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
tempo(s)
0.1
0.2
0.3
0.32
0.34
0.36
0.38
0.4
0.42
0.44
0.46
0.48
0.5
0.52
0.54
0.56
0.58
0.6
0.65
0.7
0.75
0.8
0.85
0.9
1
1.1
1.2
1.3
1.4
1.6
1.8
2
2.2
2.4
2.6
2.8
3
3.5
4
5
6
7
8
9
10
velocità(mm/s)
1000
500
333
313
294
278
263
250
238
227
217
208
200
192
185
179
172
167
154
143
133
125
118
111
100
91
83
77
71
63
56
50
45
42
38
36
33
29
25
20
17
14
13
11
10
uscita uC(dec)
255
127
84
79
74
70
66
63
60
57
55
52
50
48
46
45
43
42
38
36
33
31
29
27
25
22
20
19
17
15
13
12
11
10
9
8
8
6
5
4
3
3
2
2
2
uscita uC(bin)
11111111
1111111
1010100
1001111
1001010
1000110
1000010
111111
111011
111001
110110
110100
110010
110000
101110
101100
101011
101001
100110
100011
100001
11111
11101
11011
11000
10110
10100
10010
10001
1111
1101
1011
1010
1001
1000
1000
111
110
101
100
11
10
10
1
1
uscita uC(esa)
FF
7F
54
4F
4A
46
42
3F
3B
39
36
34
32
30
2E
2C
2B
29
26
23
21
1F
1D
1B
18
16
14
12
11
F
D
B
A
9
8
8
7
6
5
4
3
2
2
1
1
GRAFICO ANDAMENTO VELOCITA’
1000
900
velocità(mm/s)
800
velocità(mm/s)
700
600
500
400
300
200
100
0
0
0.5
1
1.5
2
2.5
3
3.5
4
4.5 5 5.5
tempo(s)
6
6.5
7
7.5
8
8.5
9
9.5
10
18
ANALISI DEL PROGRAMMA
START
(RESET)
PTB=0
NO
PTA1=1?
SI
CONTA 100ms
SI
PTA1=0?
PTB=1000
NO
CONTA 100ms
SI
PTA1=0?
PTB=500
NO
CONTA 100ms
SI
PTA1=0?
PTB=333
NO
PASSATI 10s
SI
PTA1=0?
NO
PTB=0
PTB=10
All’accensione del circuito il
microcontrollore svolge
automaticamente le istruzioni
necessarie per poter funzionare
correttamente (fase di
inizializzazione) e configura i
registri (tra cui i
DataDirectionRegister e i
registri per il PULL-UP) a
seconda della configurazione
decisa dall’utente.
Dopo questa brevissima fase il
micro passa al programma vero
e proprio scritto dall’utente.
Il programma svolge queste
funzioni in sequenza:
-scrive sull’uscita (PTB) tutti 0
-controlla il livello del PTA1 e,
se alto, passa al ciclo di
conteggio mentre in caso
contrario ripete il controllo
-inizia il conteggio
-dopo ogni intervallo di tempo,
prestabiliti nel programma,
controlla che il PTA1 sia a
livello alto per continuare il
conteggio mentre, se così non
fosse, il micro dà in uscita un
valore binario che
corrisponderà, una volta
amplificato, alla velocità
dell’oggetto
-fatto ciò torna al controllo del
PTA1 iniziale
-se il PTA1, dopo essere andato
a livello alto, non torna basso
entro 10s (la durata del
conteggio) il micro dà in uscita
0 e torna al controllo iniziale
19
AMPLIF. OPERAZIONALE E DAC
Come convertitore digitale/analogico è stato scelto l’AD558 perché il
progetto vedeva la necessità di un DAC con 5V di alimentazione e 8 bit
paralleli in ingresso. L’uscita di questo varierà tra 0 e 2,55V.
Gli amplificatori operazionali sono stati invece usati nel circuito per due
diverse funzioni:
- nei sensori in configurazione di trigger non invertenti per pilotare il
transistor
- all’uscita del convertitore DAC per attenuare a 1V il segnale di 2,55V
Nel primo caso occorre un amplificatore operazionale che funzioni
bene anche in single supply e in grado di dare in uscita una tensione
vicina a zero o vicina a 5V. Inoltre è consigliabile, vista la necessità di
usarne 2, sceglierlo in circuito integrato che ne contenga due o più ma
allo stesso tempo che sia economico e facilmente reperibile. La scelta
è caduta sull’LM 324, circuito integrato contenente 4 operazionali in
grado di funzionare in single supply.
PIEDINATURA AD558
PIEDINATURA LM324
PIEDINATURA uA741
Per attenuare il segnale da 2.55V a 1V si è scelto di utilizzare
due amplificatori operazionali in configurazione invertente (con la
configurazione non invertente ne sarebbe bastato uno ma non è
possibile praticamente avere un guadagno minore di 1). Il primo
invertente attenua il segnale e lo rende negativo; il secondo ha il
compito di riportare positivo il segnale. Quindi occorre utilizzare
amplificatori dual supply (visto l’uscita negativa del primo stadio)
e pienamente operativi e lineari tra il range da –2.55V a +2.55V.
La soluzione più economica è utilizzare due comunissimi uA741.
20
CONVERTITORE A/D CA3162 E
DRIVER 7 SEGMENTI CA3161
Il circuito visualizzatore della velocità è formato principalmente da due
componenti principali: il CA3161 e il CA3162.
Il CA3161 è un decoder BCD/7 segmenti per display ad anodo
comune ed è generalmente accoppiato al convertitore A/D con uscita
BCD per tre bit multiplexati, permettendo il pilotaggio di tre display a 7
segmenti contemporaneamente.
Il convertitore legge l’ingresso (che dev’essere compreso tra 0V e 1V)
invia in sequenza al decoder prima la cifra delle unità, poi quella delle
decine e infine quella delle centinaia, ripetendo poi questo ciclo.
Il decoder applica la cifra decodificata ai 3 display, ma di essi si
accende solo quello abilitato dal multiplexer interno al convertitore.
Quindi, ad esempio, quando il convertitore invia la cifra delle unità il
decoder la decodifica in codice 7 segmenti e la applica ai 3 display.
Nel frattempo il convertitore pone basso il pin 5 provocando la
saturazione del transistor che abilita la cifra delle unità. Durante
questa fase i pin 4 e 3 sono alti e quindi i transistor che abilitano le
altre due cifre sono interdetti e quindi gli altri due display sono spenti.
Dopo un breve intervallo di tempo il convertitore invia la cifra delle
decine e si ripete il processo per il quale il display delle decine si
accende e si spengono gli altri 2, poi la stessa cosa con la cifra delle
centinaia dopo di che il ciclo si ripete. In questo modo ogni cifra si
accende e si spegne in sequenza visualizzando la propria cifra. La
rapidità di accensione e spegnimento dei 3 display è tale da
permettere all’occhio umano di vedere tutte e tre le cifre sempre
accese.
PIEDINATURA CA3162
PIEDINATURA CA3161
21
SCHEMA CIRCUITALE
NOTE E OSSERVAZIONI
Il convertitore è del tipo a integrazione ed è quindi necessaria la
presenza del condensatore poliestere da 220nF per tale scopo.
L’integratore interno viene alimentato da un generatore di corrente
che va tarato agendo sul pot collegato al pin 13: la taratura va fatta
dando in ingresso 1V preciso; i display dovranno visualizzare 999.
L’ingresso è di tipo differenziale e la differenza di tensione massima
tra gli ingressi (pin 11 e pin 10) è di 1V; collegato il pin 10 a massa,
la tensione differenziale corrisponderà a quella del pin 11.
Tra il pin 8 e il pin 9 va collegato un potenziometro per tarare lo
zero (valore iniziale): la taratura va fatta mettendo a massa il pin 11
e variando il pot fino a quando sui display verrà visualizzato lo zero.
22
DISPLAY 7 SEGMENTI
Un display 7 segmenti è un semplice dispositivo formato da 7 piccoli led
disposti a 8, ognuno dei quali illumina un segmento di questo 8,
riuscendo a rappresentare tutte le cifre esadecimali da 0 a F.
Un ottavo led rappresenta il punto (o virgola) separatore delle cifre e si
utilizza quindi nel caso di più display per visualizzare altrettante cifre, se
il numero da rappresentare è con la virgola.
Esistono 2 diversi tipi di display: a catodo comune(G+) e ad anodo
comune(H-).
Nei primi i catodi di tutti i led sono uniti internamente in un unico pin che
va collegato a massa, quindi per l’accensione dei segmenti si da
tensione ai singoli anodi; viceversa quelli ad anodo comune hanno
l’anodo in comune collegato alla tensione di alimentazione e l’accensione
avviene nel mandare a massa i catodi.
Nel progetto sono stati scelti i secondi per essere compatibili con le
uscite del CA3161 attive basse.
PIEDINATURA
STRUTTURA INTERNA
DISPLAY ANODO COMUNE
g
f
ac
a
b
a
ac
f
b
g
e
a
b
c
d
e
f
g
c
pt
d
pt
e
d
ac
c
pt
23
SEMAFORO
Per completare il progetto si è deciso di creare un piccolo semaforo a led da
aggiungere alla strada dove sono istallati i sensori.
Vi sono molte soluzioni per creare un semaforo:
-con le porte logiche, utilizzando un contatore con un clock molto basso
-con il microcontrollore HC08 a 8pin
Si è scelta la seconda soluzione per diversi motivi: la semplicità circuitale, il
numero davvero ridotto di componenti e la facilità realizzativa.
Infatti utilizzando il micro basta collegare 3 led dei tre colori del semaforo
(rosso, giallo, verde) a tre pin a scelta tra quelli possibili da utilizzare come
uscite e, dal programma, scegliere quale led accendere e per quanto tempo.
La logica del programma è basata sulla falsariga del programma
dell’autovelox: il micro fa accendere un led e nel frattempo conta per un certo
tempo, poi quando arriva ad un certo numero di secondi spegne il led e ne
accende un altro, e così via.
Il programma è il seguente:
XDEF main, irq_isr, inizio, rosso, verde, inizio2, inizio3, aranc
Include 'HC08QT.inc'
DEFAULT_ROM
SECTION
init:
bset 0, CONFIG1
mov #%00010011, DDRA
;pta0(giallo),pta1(rosso),pta4(verde) uscite
mov #%00001000, PTAPUE
;pull-up su pta3(reset)
mov #%00000000, PTA
;pta tutto a zero
mov #$49, CONFIG2
mov #$02, OSCSTAT
mov #$FF, $80
mov #$FF, $81
rts
main:
START
cli
bsr
init
(RESET)
mov #%00000001,PTA ;giallo
inizio:
mov #$FF,$f0
GIALLO
mov #$FF,$f1
mov #$30,$f2
rosso:
dbnz $f0,rosso
NO
dbnz $f1,rosso
4sec?
dbnz $f2,rosso
mov #%00000010,PTA ;rosso
SI
inizio2:
mov #$FF,$f0
ROSSO
mov #$FF,$f1
mov #$80,$f2
verde:
dbnz $f0,verde
NO
dbnz $f1,verde
14sec?
dbnz $f2,verde
mov #%00010000,PTA ;verde
SI
inizio3:
mov #$FF,$f0
VERDE
mov #$FF,$f1
mov #$60,$f2
aranc:
dbnz $f0,aranc
NO
dbnz $f1,aranc
10sec?
dbnz $f2,aranc
mov #%00000001,PTA ;giallo
SI
bra inizio
irq_isr:
GIALLO
bil
irq_isr
jmp
$FE1A
END
SCHEMA A BLOCCHI
24
ALIMENTAZIONE
Vista la necessità di utilizzare operazionali con alimentazione duale +15V/15V il progetto si completa con un alimentatore duale stabilizzato da +15V/15V. Visto che la maggior parte dei componenti circuitali sono però alimentati
a 5V, in ogni circuito è presente un regolatore di tensione 7805 la cui uscita è
collegata a tutte le alimentazioni dei componenti funzionanti a 5V; all’ingresso
arrivano i 15V dell’alimentatore stabilizzato.
L’alimentatore stabilizzato è in grado di generare una corrente massima
continua di 1.2A da ognuna delle due uscite, con picchi massimi di 2.4A.
Per il semaforo è invece stata scelta una batteria transistor 9V ricaricabile,
vista la poca potenza necessaria al suo funzionamento. Con una batteria di
150mAh la durata del semaforo è di circa 8ore, assorbendo circa 20mA totali.
Anche sul semaforo, per alimentare il micro a 5V, c’è un regolatore 7805.
L’alimentatore è suddivisibile in alcuni blocchi principali:
SCHEMA A BLOCCHI
E FORME D’ONDA
220V
a.c.
Trasformatore
220Va.c./+-18Va.c.
Condensatore
Regolatore
15V
d.c.
Condensatore
Regolatore
-15V
d.c.
Ponte di Graetz
220
18
50Hz
-18
16
16
15
-16
-16
-15
25
PROBLEMI RISCONTRATI E
OSSERVAZIONI
Durante la costruzione non si sono riscontrati particolari problemi.
Si è scelto di costruire su millefori la parte inerente il microcontrollore,
flip-flop e operazionali per poter eventualmente fare modifiche al
circuito. Su basetta stampata è stata invece realizzata la parte di
visualizzazione della velocità, dove non era necessario apportare
modifiche visto che la configurazione dei componenti è obbligatoria.
Osservazioni importanti vanno fatte sull’accensione:
-vista la presenza di microcontrollori, occorre schiacciare i pulsanti di
reset dell’autovelox e del semaforo per un corretto funzionamento;
-visto che il flip-flop all’accensione da un’uscita alta e non bassa come
il progetto necessita, il primo passaggio dell’auto tra i due sensori non
verrà considerato e servirà solamente a portare il flip-flop con uscita
bassa.
Quest’ultima osservazione è stata analizzata e una possibile soluzione
poteva essere un condensatore in parallelo all’ingresso clear del flipflop che teoricamente ritarderebbe il livello alto in ingresso per la durata
della carica; la soluzione è stata però scartata visto che durante il
normale funzionamento dell’autovelox il condensatore rimaneva carico
(a livello basso arrivava comunque qualche millivolt e non si scaricava
mai) e quindi l’ingresso clear non andava mai a livello basso.
Un’altra soluzione per il problema del flip-flop poteva essere quella di
far considerare al micro solo fronti di salita e fronti di discesa in
ingresso per far partire o fermare il conteggio ma anche in questo caso
una misura sarebbe andata persa.
Piccoli problemi sono sorti a causa di saldature che si staccavano dalla
basetta causando malfunzionamenti, problema però risolto con
un’accurato controllo.
26
IN ALLEGATO IL MASTER DEL
CIRCUITO VISUALIZZATORE
27