PROIECT-MICROCONTROLERE
February 1, 2017 | Author: Voicu Cosmin | Category: N/A
Short Description
Download PROIECT-MICROCONTROLERE...
Description
Facultatea Transporturi Departamentul Telecomenzi si Electronica in Transporturi
PROIECT MICROCONTROLERE Montaj de tip termometru cu Atmega328p
Autori:
Indrumator:
Mircea Vitanescu, grupa 8314
As. dr. Ing. Mihai Niculescu
Cosmin Voicu, grupa 8314
Bucuresti,2015
P a g e 1 | 12
CUPRINS : 1. Descrierea proiectului 2. Proiectare hardware 2.1. Schema bloc, prezentarea generală a modulelor 2.2. Schema electrică şi lista de componente 2.3. Circuitul imprimat 3. Proiectare software 3.1. Schema logică şi descrierea modului de funcţionare 3.2. Listarea programului propriu-zis 4. Bibliografie
P a g e 2 | 12
1.Descrierea proiectului Aplicatie care citeste temperatura folosind LM50. Se va genera semnal PWM controlat de valoare temperaturii.Utilizatorul poate selecta doua frecvente pentru semnalul PWM.Pe LCD se va afisa temperatura si factorul de umplere. Folosim placa de dezvoltare ARDUINO UNO, cu microcontroler Atmega328p, senzor BRICK temperatura care are in componenta un circuit integrat LM50, doua butoane, un led de culoare alba si un diplay 2x16. Ca aplicatii practice se poate masura temperatura din interiorul carcasei unui PC, acest montaj poate comanda un cooler pentru racirea eficienta a PC-ului.
2.Proiectare hardware 2.1.Schema bloc si prezentarea generala a modulelor
LCD
ATmega328p
LM50
2X16
CLK 16MHz
PUSH BUTTON
PUSH
LED
BUTTON
ATMega 328P este un microcontroller RISC pe 8 biti realizat de firma Atmel(acesta are 28 pini I/0).Principalele caracteristici ale acestuia sunt:
32 KB memorie FLASH reinscriptibila pentru stocarea codului 2 KB de memorie RAM 1 KB de memorie EEPROM doua numaratoare/temporizatoare de 8 biti un numerator/temporizator de 16 biti contine 6 canale PWM
P a g e 3 | 12
contine un conovertor analog-digital contine un comparator analogic contine un modul USART pentru comunicatie seriala detine de un oscillator intern 23 de pini programabili I/O Tensiuni de lucru intre 1.8-5.5 V Gama de temperatura -40 pana la +85°C
ATMega 328p contine 32 de register de uz general si 64 de register special pentru modulele I/O. ATMega 328p dispune de 21 surse de intrerupere.Atunci cand una dintre ele devine active se suspenda cursul normal de executie si se face salt automat la o adresa prestabilita din memoria program. Registru de date SREG contine urmatorii biti:
bitul 7 – activare/dezactivare globala de intreruperi bitul 6 - bit de copiere bitul 5 – indicator de transport la jumatate bitul 4 – indicator de semn bitul 3 – indicator de depasire in cazul operatiilor in complement fata de doi bitul 2 – indicator de rezultat negativ bitul 1 – indicator de zero bitul 0-indicator de transport
P a g e 4 | 12
LM50 este un circuit integrat de precizie cu functie de senzor de temperatura, ce poate inregistra valori intre -40 pana la 125°C folosind o singura sursa de alimentare pozitiva. Tensiunea de iesire a acestuia este liniar proportionala cu temperatura inregistrata. Lucreaza la tensiuni intre 4.5 si 10V. Are o acuratete de ±2°C.
LCD display 2x16 4 bit mode:
Acesta are 16 pini de conectare. Este impartit in 2 randuri, realizate din 16 campuri de caractere.Fiecare camp are o matrice de pixeli tip (7x5).
2.2.Schema electrica si lista de componente Lista componente:
2 push butoane 3 rezistente(2x220 si una de 1k) Microcontroller ATmega 328p Quartz 16MHz 2 condensatoare (22pF) 2 porti inversoare Sensor de temperature LM50 Un led Un potentiometru de 10k Un lcd 2x16
P a g e 5 | 12
2.3 Circuitul imprimat:
P a g e 6 | 12
3.0 Proiectare software 3.1 Schema logica si descrierea modului de functionare
START
Setare porturi
Setare timer 2 Afiseaza LCD
Citeste temperatura
Da
Se apasat buton 1?
Seteaza frecventa 30,64Hz
Nu
Daca temp. este sub temp. min.
Da
Se apasa buton 2?
Seteaza frecventa 490,20Hz
Nu Temp. Curenta este egala cu Temp. minima Afiseaza LCD Calculeaza PWM Daca temp. este peste temp. max.
Genereaza tens. Pin11
Temp. Curenta este egala cu Temp. maxima
P a g e 7 | 12
Mod de functionare: Se citeste o tensiune de pe pinul 0, si cu ajutorul unui algoritm calculeaza temperatura in grade celsius. Cu ajutorul temperaturii calculam factorul de umplere pe care il afisam pe display. Temperatura minima este 25°C iar cea maxima este 48°C.Daca se inregistreaza o temperatura mai mica decat 25°C in calculul factorului de umplere se va folosi tot 25°C, in timp ce temperatura afisata pe display va fi cea inregistrata; daca se inregistreaza o temperatura mai mare de 48°C in calculul factorului de umplere se va folosi tot valoarea de 48°C, in timp ce pe display se va afisa temperatura inregistrata. Pinul 11 este un pin pe care se poate genera un semnal PWM. In prima faza generam o tensiune proportionala cu factorul de umplere avand posibilitatea de a schimba frecventa cu ajutorul celor doua push butoane. Cele doua push butoane sunt citite ca un pin de intrare. Se citeste butonul, daca valoarea este 0, seteaza frecventa 30.64Hz. Pentru citirea celuilalt buton se face identic. Folosim un divizor de frecventa care seteaza cele 3 timere.
3.2 Listarea programului propriu-zis #include LiquidCrystal lcd(12,10,5,4,3,2);
float Fan1Min = 0; float Fan1Max = 255; float TempMin = 25.0; float TempMax = 48.0; int pinA = 11; const int button1Pin = 8; const int button2Pin = 6; int button1State=0; int button2State=0; float K1 = (Fan1Max - Fan1Min) / (TempMax - TempMin); void setup() { pinMode(button1Pin, INPUT); digitalWrite(button1Pin, HIGH);
P a g e 8 | 12
pinMode(button2Pin, INPUT); digitalWrite(button2Pin, HIGH); pinMode(9, OUTPUT); lcd.begin(16,2); setPwmFrequency(11, 1); }
void loop() { lcd.setCursor(2,1); lcd.print("Temp: "); lcd.print ( citesteTempInCelsius()); lcd.setCursor(14,1); lcd.print( "C");
button1State = digitalRead(button1Pin); if (button1State ==LOW) { setPwmFrequency(11,1024); } button2State = digitalRead(button2Pin); if (button2State ==LOW) { setPwmFrequency(11,64); }
float T =citesteTempInCelsius(); if (T < TempMin) T = TempMin; if (T > TempMax) T= TempMax; float Pwm = ((T - TempMin) * K1) + Fan1Min;
P a g e 9 | 12
lcd.setCursor(1,0); lcd.print ( " Duty: " ); lcd.print ( Pwm ); lcd.setCursor(14,0); lcd.print(
"%" ); analogWrite(pinA,Pwm ); delay(1500);
}
float citesteTempInCelsius(){ float temperaturaMediata=0; float sumaTemperatura; for(int i=0;i
View more...
Comments