Documente Academic
Documente Profesional
Documente Cultură
Proiect BSAD
Proiect BSAD
Negoita Florin
Gr. 435 C
Sa se proiecteze un aparat care sa masoare 4 temperaturi diferite si
sa le afiseze pe un afisaj cu leduri de 3 digiti.
Se va afisa o singura temperatura la un moment dat ; alegerea
temperaturii se va face folosind un buton fara retinere, existand un
afisaj suplimentar de un digit care va afisa numarul temperaturii
afisate. De asemenea se va putea selecta afisarea diferentei mexime
intre cele 4 tempereturi.
Se vor folosi :
1. afisaje cu leduri cu anod sau catod comun.
2. microcontroler AT Mega 16
3. traductori de temperatura LM335
Temperaturile se vor afisa in grade C.
Programul pentru microcontroler va fi scris in asamblare.
I. Conditii impuse
+5V
R5
1k
LM335
R7
10k
+5V L T1 0 1 3
3 V+ +5V
+
1 5 +
OUT +
2 7 Ai (i=1..3)
- OUT
V- 6
-
R6 - R3 Rv 2
+5V R 4 Rv 3
36k 33k 1k
2k 4
0k 5 R5 R2
2k 10k
ADC-ul are o intrerupere proprie care eset chemata atunci cand se termina o conversie.
Acest moment este anuntat si prin starea bitilor ADIF=1 si ADSC=0 (ADSC=1 atunci
cand porneste o conversie).
Ca alimentare se poate alege intre AVCC, AREF si o valoare interna (2.56V).
Am folosit 8 biti ceea ce inseamna 256 de valori reprezentabile. Noi avem 140 de
valori adica rezolutia acestui convertor este de aproximativ 0.54C/bit:
Rezolutia=(1/256)*Ui=(1/256)/5V=0.01953V≈19.53V/bit
Rezolutia=(1/256)*T =(1/256)/140ºC≈0.54ºC/bit
Fig.2 Schema de principiu a ADC-ului
VI. Microcontrollerul
Microcontrollerul utilizat este ATMega16, care este fabricat de ATMEL, iar a carui AVR
core combina un set bogat de instructiuni cu scopul general de a lucra cu registrii. Toti
cei 32 de registri sunt direct conectati la Unitatea Aritmetico-Logica, permitand ca o
singura instructiune executata intr-un tact, sa acceseze 2 registri independenti.
VII.Afisajul
Pentru acest proiect am folosit un afisaj cu leduri de tip BCD (4 digiti- unul pentru canal
si 3 pentru afisarea temperaturii).
Numarul canalului este afisat atunci cand este apasat butonul de incrementare,iar
microcontroller-ul citeste din registru si trimite cifra pe portul C, selectia facandu-se
prind intermediul portului D, pinul 4.
Display-ul folosit este de tip BCD anod comun cu multiplexare. Temperatura se afiseaza
cu 3 cifre si cu semn. Afisajul se face cu leduri, ledurile functionand conform tabelului
urmator:
A B C D a b c d e f g Nr
0 0 0 0 1 1 1 1 1 1 0 0
0 0 0 1 0 1 1 0 0 0 0 1
0 0 1 0 1 1 0 1 1 0 1 2
0 0 1 1 1 1 1 1 0 0 1 3
0 1 0 0 0 1 1 0 0 1 1 4
0 1 0 1 1 0 1 1 0 1 1 5
0 1 1 0 1 0 1 1 1 1 1 6
0 1 1 1 1 1 1 0 0 0 0 7
1 0 0 0 1 1 1 1 1 1 1 8
1 0 0 1 1 1 1 1 0 1 1 9
Unde A, B, C, D este numarul pe 4 biti stocat in eprom de microcontroller iar a...g sunt
segmentele ledurilor conform figurii urmatoare:
f b
g
e c
d
VII.Functionarea
T(ºC) Ui Uf Te Nr Te Nr binar
-40 2,332 0,0000 0,0000 0 0000 0000
-35 2,382 0,1786 9,1428 9 0000 1001
-30 2,432 0,3571 18,2856 18 0001 0010
-25 2,482 0,5357 27,4284 27 0001 1011
-20 2,532 0,7143 36,5711 37 0010 0101
-15 2,582 0,8929 45,7139 46 0010 1110
-10 2,632 1,0714 54,8567 55 0011 0111
-5 2,682 1,2500 63,9995 64 0100 0000
0 2,732 1,4286 73,1423 73 0100 1001
5 2,782 1,6071 82,2851 82 0101 0010
10 2,832 1,7857 91,4278 91 0101 1011
15 2,882 1,9643 100,5706 101 0110 0101
20 2,932 2,1428 109,7134 110 0110 1110
25 2,982 2,3214 118,8562 119 0111 0111
26 2,992 2,3571 120,6847 121 0111 1001
30 3,032 2,5000 127,9990 128 1000 0000
35 3,082 2,6786 137,1418 137 1000 1001
40 3,132 2,8571 146,2845 146 1001 0010
45 3,182 3,0357 155,4273 155 1001 1011
50 3,232 3,2143 164,5701 165 1010 0101
55 3,282 3,3928 173,7129 174 1010 1110
60 3,332 3,5714 182,8557 183 1011 0111
65 3,382 3,7500 191,9985 192 1100 0000
70 3,432 3,9285 201,1412 201 1100 1001
75 3,482 4,1071 210,2840 210 1101 0010
80 3,532 4,2857 219,4268 219 1101 1011
85 3,582 4,4643 228,5696 229 1110 0101
90 3,632 4,6428 237,7124 238 1110 1110
95 3,682 4,8214 246,8552 247 1111 0111
100 3,732 5,0000 255,9980 255 1111 1111
void port_init(void)
{
PORTA = 0x00;
DDRA = 0xC0; //configuratia porturilor ca intrari sau iesiri
PORTB = 0x00;
DDRB = 0x7F;
PORTC = 0x00;
DDRC = 0xFF;
PORTD = 0x00;
DDRD = 0x1F;
}
//ADC initialize
// Conversion time: 6uS
void adc_init(void)
{
ADCSR = 0x00;
ADMUX = 0x60; //select adc input 0
ACSR = 0x80;
ADCSR = 0xE9; //start ADC , set free run , set enable intrerupt, si frecventa
convertorului
}
if ( tmp < 0 )
EEPROM_WRITE( adr_base, i ); //scrie semn (daca e <0 scrie 1 altfel 0) la adresa
adr_base
else EEPROM_WRITE( adr_base, i-1 );
do{
tmpBCD = tmp % 10;
EEPROM_WRITE(adr_base+i, tmpBCD ); //calculeaza cifrele si le scrie in EEPROM
la adrese consecutive
i++;
tmp /= 10;
}while( tmp != 0);
void afisare( int adr_base , unsigned char canal ) // afisez temperatura , si canalul selectat
{
unsigned char dst,i;
EEPROM_READ( adr_base , dst );
if( dst == 1 )
PORTD |= 0x10; //afisam semnu , pind3 =1
i=0;
while( i<3 )
{
adr_base++;
EEPROM_READ( adr_base , dst ); //citesc prima cifra
switch ( i )
{
case 0 : PORTD |= 0x01;break; // aleg care cifra trebuie afisata la un moment dat
case 1 : PORTD |= 0x02;break;
case 2 : PORTD |= 0x08;break;
}
afisare_cifra( dst ); // afisare cifra
delay();
i++;
}
void main()
{
unsigned char tmp = 0x00;
unsigned char canal;
init_devices();
EEPROM_WRITE(0x0100, tmp);
ADMUX = 0x60;
switch (canal)
{
case 0 : afisare( 0 , 0 ); break; //selecteaza canalul si afiseaza valoarea
temperaturii pentru canalul resp
case 1 : afisare( 4 , 1 ); break;
case 2 : afisare( 8 , 2 ); break;
case 3 : afisare( 12 , 3 ); break;
}
}
}
IX.Bibliografie:
www.atmel.com
www.national.com