Proiect BSADNegoita Florin Gr. 435 CSa 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 LM335Temperaturile se vor afisa in grade C.Programul pentru microcontroler va fi scris in asamblare.I. Conditii impuse1. Termometru digital cu 3 digiti care masoara 4 temperaturi2. Gama de masura: -40 C100C3. Eroarea de masura: 0.5C ( dictata de traductorul de temperature )4. Traductor de temperatura: LM3355. Microcontroller:ATMega16II. Schema Bloc 1. Traductor de temperatura LM3352. Amplificator de semnal3. Convertor analog digital4. Microcontroller ATMega165. Buton de incrementare canal6. Bloc de afijare numerica (4 digiti)III. Senzorul de temperaturaEste folosit LM335 care este un sensor de temperatura ce poate fi calibrat cu usurinta. Acest senzor functioneaza intre temperaturile -40oC si 100oC pastrandu-si liniaritatea si impedanta scazuta. Functionand ca o dioda Zener cu doua terminale avand tensiunea de strapungere direct proportionala cu temperatura absoluta, panta fiind de 10mV/K. Impedana sczut i caracteristica de ieire liniar fac interconectarea cu circuitele de control foarte usor de realizat. Instrumentul este disponibil ncapsulat ermetic in tranzistorul TO-46. Circuitul are o impedanta dinamica mai mica de 1? si functioneaza intre 0.45mA si 5mA fara degradari ale perfomantelor. Calibrat la 25C LM335 are o eroare mai mica de 1C la o variatie a temperaturii de 100C (tipic 0.5C). Spre deosebire de alti senzori de temperature LM335 are o iesire liniara in tensiune care variaza in functie de tempeatura cu 10mV/K.Rezistenta R7 este folosita pentru calibrarea la 25oC trebuind sa asigure la iesiere tensiunea de 2.982V pentru aceasta temperatura. Tensiune de iesire la +100C: 3.732VTensiune de iesire la -40C: 2.332VIV. Adaptorul de semnalAmplificatorul LT1013 este primul AO dual de precizie cu 8 pini, mbuntind performanele unor dispozitive mai vechi. Poate fi alimentat de la o singur surs de 5V. Gama intrrii de mod comun poate include si masa. Ieirea poate oscila in limita a civa mV de la masa. Distorsiunea de crossover, foarte evident la alte amplificatoare, este eliminat.Deoarece traductorul de temperatura LM335 are o panta de 10mV/oK rezulta ca, la capetele de scala ale termometrului ( -40oC si 100oC ) tensiunile de iesire vor avea valorile +2.332V (pt -40oC) si 3.732V (pt100oC) => excursia de tensiune va fi de 1.400V.Acest adaptor are rolul de a mari excursia tensiunii de la iesire de la 1.4V la 5V deoarece intrarea analogica a convertorului este cuprinsa intre valorile 0...5V. Amplificarea acestui adaptor trebuie sa fie A=?Uf/?Ui=5/1.4=3.5714 pe fiecare grad celsius. Amplificarea este: A=(R3+Rv2)/R2R6?R3+Rv2. Pentru R2=10k? avem: R3+Rv2=35.714k rezulta ca R3=33K, iar Rv2=5K Se alege R6=36k. V. Convertorul analog digitalSe foloseste convertorul analog digital oferit de microcontroller-ul ATMEGA16. Acest ADC prezinta urmatoarele caracteristici:-eroare totala de 2 LSB,-rezolutia este de 10biti, -timpul de conversie este de 13-260s. ADC-ul este conectat la un multiplexor analog pe 8 canale, intrarile analogice fiind conectate pe portul A al controller-ului.ADC-ul contine un circuit Sample and Hold care asiura ca tensiunea de la intrare este mentinuta la un nivel constant pe durata conversiei.Acesta primeste pe intrarile CH1(ADC0)...CH4(ADC3) o tensiune Vin?(0..5V) si este alimentat la Vref=5V . Cod la 0V: 0000 0000 (00H) Cod la 5V: 1111 1111 (FFH)Am folosit portul A al microcontrollerului, configurand pinii 0-3 (ADC0-ADC3) ca intrari in registrul de stare al ADC-ului ADMUX. Rezultatul oferrit de ADC este pe 10 biti si se gaseste in registrii ADCH si ADCL. Dar, cum precizia dorita este cea pe 8 biti, vom citi doar ADCL, lucru care va fi precizat in registrul de stare.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.54?C/bit:Rezolutia=(1/256)*Ui=(1/256)/5V=0.01953V?19.53V/bitRezolutia=(1/256)*T =(1/256)/140oC?0.54oC/bit Fig.2 Schema de principiu a ADC-uluiVI. MicrocontrollerulMicrocontrollerul 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.ATmega16 are urmatoarele caracteristici: -16K bytes of In-System Programmable Flash Program memory with Read-While-Write capabilities, - 512 bytes EEPROM, - 1K byte SRAM- 32 general purpose I/O lines- 32 general purpose working registers,- On-chip Debugging support and programming,- Three flexible Timer/Counters with compare modes, - Internal and External Interrupts, - a serial programmable USART, - a byte oriented Two-wire Serial Interface,- 10-bit ADC with optional differential input stage - a programmable Watchdog Timer with Internal Oscillator, - an SPI serial port,Astfel Atmel ATmega16 e un microcontroller puternic care ofera o flexibilitate marita. ATmega16 AVR e compatibil cu gama larga de medii de programare, dintre care: compilator C compilers, macro assembler si programe de debugging si simulare.La pini corespunzatori XTAL1 si XTAL2, din portul D, care sunt pini de intrare respectiv iesire este legat oscilatorul. Oscilatorul este prezentat in figura urmatoareAlegerea condensatoarelor si a quartului se face conform tabelului, in functie de modul de functionare alesConfiguratia pinilor porturilor este urmatoarea:Portul A- pinii 0-3 setati ca intrari (de la senzori)-pinul 4 intrare Start/Stop-pinul 5 intrarea Incrementare canalPortul B neutilizatPortul C pinii 0-7 iesiri catre blocul de fisare(prin care se trimite cifra de afisat)Portul D pinii 0-4 iesiri catre blocul de afisare (prin care se selecteaza digitul de afisat)VII.AfisajulPentru 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:ABCDabcdefgNr000011111100000101100001001011011012001111110013010001100114010110110115011010111116011111100007100011111118100111110119Unde A, B, C, D este numarul pe 4 biti stocat in eprom de microcontroller iar a...g sunt segmentele ledurilor conform figurii urmatoare:VII.FunctionareaVariatia de temperatura de la nivelul fiecarui canal este transformata in variatie de tensiune la iesirea traductorului cu o rata de 10mV/oC. In acest fel dat fiind faptul ca semnalul la iesirea traductorului este in format mV/oK vom obtine o variatie a tensiunii de iesire care variaza intr 2.332V la -40C si 3.732V la 100C ( variatia fiind de 1400mV). Cum ADC-ul are scala maxima de conversie de la 0 la 5V pentru toate cuvintele binare oferite de numarul lui de biti (256 trepte de esantionare a semanlului la intrare, fiind un convertor cu aproximatii successive) rezulta necesitatea scalarii semnalului de la iesirea fiecarui canalin gama 0.000V la -40oC pana la 5.000V la 100oC. Adaptorul 2 din schema bloc va realize acest lucru si cuprinde doua circuite de calibrare: unul de nul ( corespunzator la -40oC ) si unul de capat de scare ( SPAN ) pentru 100oC.In schema practica, data fiind dificultatea calibrarii la -40C se poate utiliza si o calibrare de referinta la 25C, atunci cand se face verificarea ansamblului traductor-adaptor in conditiile reale ( cu termometru martor ).Amplificarea adaptorului de semnal este:A=Uf/Ui=5/1.4=3.5714, unde Uf este tensiunea la intrarea convertorului analog digital iar Ui este tensiunea la iesirea senzorului de temperatura. Valorile de intrare si iesire din adaptorul de semnal se gasesc in tabelul anexat la pagina 13.Convertorul analog digital este cu aproximari succesive pe 8 biti care are 256 de trepte de esantionare obtinandu-se o rezolutie a convertorului de 19.53mV/treapta respectiv de 0.54C/treapta.In tabelul urmator sunt prezentate valorile tensiunilor de intrare si de iesire din adaptorul de semnal, precum si numarul treptei de esantionare din ADC.T(oC)UiUfTeNr TeNr binar-402,3320,0000 0,0000 0 0000 0000-352,3820,1786 9,1428 9 0000 1001-302,4320,3571 18,2856 18 0001 0010-252,4820,5357 27,4284 27 0001 1011-202,5320,7143 36,5711 37 0010 0101-152,5820,8929 45,7139 46 0010 1110-102,6321,0714 54,8567 55 0011 0111-52,6821,2500 63,9995 64 0100 000002,7321,4286 73,1423 73 0100 100152,7821,6071 82,2851 82 0101 0010102,8321,7857 91,4278 91 0101 1011152,8821,9643 100,5706 101 0110 0101202,9322,1428 109,7134 110 0110 1110252,9822,3214 118,8562 119 0111 0111262,9922,3571 120,6847 121 0111 1001303,0322,5000 127,9990 128 1000 0000353,0822,6786 137,1418 137 1000 1001403,1322,8571 146,2845 146 1001 0010453,1823,0357 155,4273 155 1001 1011503,2323,2143 164,5701 165 1010 0101553,2823,3928 173,7129 174 1010 1110603,3323,5714 182,8557 183 1011 0111653,3823,7500 191,9985 192 1100 0000703,4323,9285 201,1412 201 1100 1001753,4824,1071 210,2840 210 1101 0010803,5324,2857 219,4268 219 1101 1011853,5824,4643 228,5696 229 1110 0101903,6324,6428 237,7124 238 1110 1110953,6824,8214 246,8552 247 1111 01111003,7325,0000 255,9980 255 1111 1111Semnificatia marimilor din tabel:-T (C) temperatura masurata de LM335.-Ui(V) tensiunea la iesirea LM335.-Uf(V) tensiunea la intrare analogica a ADC0844.-Te numarul treptei de esantionare din ADC0844.-Te(apr) numarul aproximat al treptei de esantionare din ADC0844.Codul sursa pentru programarea microcontrollerului ://ICC-AVR application builder : 5/29/2005 7:34:50 PM// Target : M16// Crystal: 4.0000Mhz#include
#include #include 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: 6uSvoid 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 //call this routine to initialize all peripheralsvoid init_devices(void) //stop errant interrupts until set up CLI(); //disable all interrupts port_init(); adc_init(); MCUCR = 0x03; //seteaza intreruperea activa pe front crescator GICR = 0x40; TIMSK = 0x00; //timer interrupt sources SEI(); //re-enable interrupts //all peripherals are now initialized void calcul_BCD( signed char tmp , unsigned int adr_base ) signed char tmpBCD;unsigned char i=1; 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); #pragma interrupt_handler adc_isr:15void adc_isr(void) //intreruperea referitoare la terminarea conversieisigned char tmp = ADCH; //folosind left adjustement luam numai partea H din cei 10 biti unsigned char canal =0 ;canal
= ADMUX; // calculeza canalul de pe care a facut conversia in canal &= 0x0F; //funtie de valoarea ultimilor 4 biti din ADMUX switch ( canal ) case 0 : calcul_BCD( tmp, 0 );break; case 1 : calcul_BCD( tmp, 4 );break; case 2 : calcul_BCD( tmp, 8 );break; //calculeaza cifrele si le scrie la adrese predefinite case 3 : calcul_BCD( tmp, 12 );break; ADMUX++;#pragma interrupt_handler button_pressed:2void button_pressed() //intreruprerea coresp butonului de incrementare canal unsigned char dst;EEPROM_READ( 0x0100 , dst ); //citesc valoarea canalului prezent dst++; //trec la urmatoru canaldst %= 4;EEPROM_WRITE(0x0100, dst ); void afisare_cifra( unsigned char cifra ) switch (cifra) //afisare fiecare cifra pe un afisaj cu 7 segmente aprinzand pt fiecare cifra segemntele respective case 0 : PORTC = 0x7E;break; case 1 : PORTC = 0x30;break; case 2 : PORTC = 0x6D;break; case 3 : PORTC = 0x79;break; case 4 : PORTC = 0x33;break; case 5 : PORTC = 0x5B;break; case 6 : PORTC = 0x5F;break; case 7 : PORTC = 0x70;break; case 8 : PORTC = 0x7F;break; case 9 : PORTC = 0x7B;break; void delay() //delay de aprox 50 ms pt a afisa practic cifrele in acelasi timpint i;for( i=0; i<65000 ; i++ ) ; 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++; afisare_cifra( canal ); //afisez canalul selectat PORTD
= 0x20;void main()unsigned char tmp = 0x00;unsigned char canal;init_devices();EEPROM_WRITE(0x0100, tmp); ADMUX = 0x60;while( PORTA & 0x10 ) SEI(); while( (ADMUX & 0x04) == 0 ) //convertesc pentru toate cele 4 canale dar se afiseaza doar cifra selectata ADMUX = 0x60; EEPROM_READ( 0x0100 , canal ); //citeste canalul din memorie 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.comwww.national.com