Sunteți pe pagina 1din 12

Facultatea Transporturi

Departamentul Telecomenzi si Electronica in Transporturi

PROIECT MICROCONTROLERE
Montaj de tip termometru cu Atmega328P-PU

Autori: Indrumator:
Prof. Dr. Ing. Angel Ciprian Cormos
Nicula Georgian Vlad, grupa 8315

Bucuresti,2016

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, lista de componente si costul de productie

2.3. Circuitul imprimat

3. Proiectare software

3.1. Schema logic i descrierea modului de funcionare

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

ATmega328p LCD
LM50
2X16

CLK
PUSH LED
16MHz PUSH
BUTTON 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 +85C

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 125C 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 2C.

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, lista de componente si costul de productie

Lista componente:

2 push butoane 0.5RON x 2 = 1RON


3 rezistente(2x220 si una de 1k) 1RON x 2 + 2,5RON x 1 = 4,5RON
Microcontroller ATmega 328p 19RON x 1 = 19RON
Quartz 16MHz 3RON x1 = 3RON
2 condensatoare (22pF) 0.25RON x2 = 0.5RON
2 porti inversoare 2RON x2 = 4RON
Sensor de temperature LM50 14RON x1 = 14RON
Un led 0.4RON x1 = 0.4RON
Un potentiometru de 10k 0.6RON x1 = 0.6RON
Un lcd 2x16 35RON x1 = 35RON
TOTAL = 82RON

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
Da Seteaza frecventa
temperatura Se apasat
30,64Hz
buton 1?

Nu

Daca temp.
este sub
temp. min. Se apasa Da Seteaza frecventa
buton 2? 490,20Hz

Nu
Temp. Curenta este
egala cu Temp.
minima

Afiseaza LCD

Calculeaza
PWM
Genereaza tens.
Daca temp. Pin11
este peste Temp. Curenta
temp. max. 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 25C iar cea maxima este 48C.Daca se inregistreaza o temperatura mai mica
decat 25C in calculul factorului de umplere se va folosi tot 25C, in timp ce temperatura afisata pe
display va fi cea inregistrata; daca se inregistreaza o temperatura mai mare de 48C in calculul factorului
de umplere se va folosi tot valoarea de 48C, 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.h>

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<10;i++){

int reading =analogRead(0);

float voltage = reading * 5.0;

voltage/=1024.0;

float temperatureCelsius= (voltage-0.5)*100;

sumaTemperatura=sumaTemperatura+temperatureCelsius;

return sumaTemperatura/10;}

void setPwmFrequency(int pin, int divisor)

{byte mode;

if(pin == 5 || pin == 6 || pin == 9 || pin == 10) {

switch(divisor) {

case 1: mode = 0x01; break;

case 8: mode = 0x02; break;

case 64: mode = 0x03; break;

case 256: mode = 0x04; break;

case 1024: mode = 0x05; break;


P a g e 10 | 12
default: return;

if(pin == 5 || pin == 6) {

TCCR0B = TCCR0B & 0b11111000 | mode;}

else {

TCCR1B = TCCR1B & 0b11111000 | mode;

else if(pin == 3 || pin == 11) {

switch(divisor) {

case 1: mode = 0x01; break;

case 8: mode = 0x02; break;

case 32: mode = 0x03; break;

case 64: mode = 0x04; break;

case 128: mode = 0x05; break;

case 256: mode = 0x06; break;

case 1024: mode = 0x7; break;

default: return;

TCCR2B = TCCR2B & 0b11111000 | mode;

P a g e 11 | 12
4.Bibliografie:

www.alldatasheet.com

www.atmel.com

https://www.arduino.cc/en/Tutorial/HelloWorld

http://playground.arduino.cc/Main/TimerPWMCheatsheet

http://playground.arduino.cc/Code/PwmFrequency

https://www.arduino.cc/en/Tutorial/Button

http://www.electroschematics.com/9540/arduino-fan-speed-controlled-temperature/

P a g e 12 | 12