.LM35(Cảm biến nhiệt độ)

Một phần của tài liệu nghiên cứu sử dụng chip avr atmega8 đo nhiệt độ và điều khiển (Trang 67 - 99)

Một số tính chất cơ bản của LM35

Biến thiên 10mV / 1oC. tầm đo từ 0oC – 128oC

quan hệ giữa nhiệt độ và điện áp ngõ ra như sau:

Vout = 0,01ToK = 2,73 + 0,01ToC.

Ở 0oC thì điện áp ngõ ra Vout = 2,73 (V). Ở 5oC thì điện áp ngõ ra Vout = 2,78 (V). Ở 100oC thì điện áp ngõ ra Vout = 3,73 (V).

Chương III:

Thiết Kế Phần Cứng

1. Mạch Nguồn Cung Cấp Cho Hệ Thống:

Điều quang trọng khi thiết kế mạch nguồn là Đầu ra phải ổn định , nên có thể chọn nhiều mạch khác nhau .

2.MẠCH NẠP USB AVR910 1/Giới thiệu:

AVR 910 USB Programmer Cable là loại mạch nạp sử dụng cho các chip AVR của hãng ATMEL. Với phần cứng đã được tối ưu hóa, sử dụng hoàn toàn các linh kiện SMD nên kích

thước cực kì nhỏ gọn, toàn bộ được đóng gói nằm gọn trong vỏ hộp cổng COM tạo nên sự thuận tiện và bền chắc trong quá trình sử dụng.

Sản phẩm đảm bảo được tính năng của một mạch nạp AVR 910 chính hãng với giá thành mềm hơn rất nhiều so với những sản phẩm cùng loại có mặt trên thị trường.

2.

Sản phẩm được đóng gói hoàn chỉnh, bao gồm các phụ kiện sau:

+Mạch nạp USB AVR910. +Cable nạp ISP chuẩn ICE 5x2.

+CD chứa driver và softwares : Win AVR, CodeVisionAVR, Bascom AVR, AVR aStudio412SP4b498, Proteus7.1.sp2.build3692, Tài liệu học AVR của Gerhard Schmidt,

datasheet của các AVR.

2/Đặc điểm:

+Nguồn cung cấp: 5V từ cổng USB. +Giao tiếp Virtual COM qua USB.

+Tốc độ truyền tối đa: 115200bps, 8 bit, no parity, 1 stop, no flow control. +Định dạng file: Intel 8-bit HEX.

3/Tính năng:

+Nạp được hầu hết các dòng AVR và một số chip 89S của Atmel.

+Hỗ trợ đầy đủ các tác vụ nạp chip thông thường như: Ghi/xóa/đọc nội dung trong chip, kiểm tra lỗi sau khi nạp.

+Hỗ trợ khóa chip và lập trình fuse bit .

+Header nạp ISP chuẩn ICE 5x2 như dòng KIT thí nghiệm STK của ATMEL giúp kết nối thuận tiện.

+Tốc độ nạp cao, sử dụng được với hầu hết các trình biên dịch: Code Vision, AVR Studio... +Cực kì đơn giản trong kết nối, cài đặt và sử dụng.

+Danh sách chip được hỗ trợ

AT89S53 AT89S8252 AT90S2313 AT90S8515 ATtiny26 ATtiny45 ATtiny2313 ATmega48

ATmega8 ATmega8515 ATmega8535 ATmega16 ATmega32 ATmega64 ATmega128 AT90CAN128

+Mạch nạp USB AVR 910 sử dụng tốt nhất trên nền hệ điều hành Windows XP Professional và Vista.

4/Hướng dẫn cài đặt driver:

Để quá trình cài đặt driver cho mạch nạp AVR 910 diễn ra suôn sẻ cần lưu ý: không nên kết nối mạch nạp với KIT chứa chip cần nạp trước khi hoàn tất quá trình cài đặt driver.

Trình tự cài đặt như sau:

a/ Đưa dĩa CD kèm theo sản phẩm vào ổ CD. b/ Cắm mạch nạp AVR 910 vào cổng USB trên PC.

Trên màn hình hiện ra thông báo tìm thấy phần cứng mới dưới góc phải và hộp thoại yêu cầu người dùng chỉ ra driver tương ứng cho phần cứng mới này.

Chỉ định cụ thể đường dẫn đến thư mục chứa driver nằm trên đĩa CD theo các bước như hình dưới đây:

( Đường dẫn mặc định là [Tên ổ CD]\[Driver]\ )

d/Hộp thoại sau đây thông báo quá trinh cài đặt thành công.

e/Sau khi cài đặt xong driver, thiết bị sẽ được PC xác nhận dưới hình thức cổng COM ảo, do đó cần tinh chỉnh thông số cổng COM này tối ưu nhất.

+Một số trường hợp mạch nạp vẫn chưa hoạt động, nhấp chọn Advanced.. trên hình trên...

+Chọn COM Port Number khác, lưu ý nếu trong danh sách các cổng COM, cổng nào đang bị chiếm dụng (in use) thì không được chọn cổng COM này.

-> Như vậy là hoàn tất bước cài đặt driver cho mạch nạp USB AVR 910.

4/Phần mềm nạp:

Các phần mềm nạp tương thích bao gồm AVR Studio và Code Vision. Chương trình AVRProg tuy giao diện đơn giản nhưng có ưu điểm là nạp rất nhanh, còn CodeVision thì ngược lại.

Sau đây sẽ hướng dẫn Các bước nạp chip sử dụng chương trình AVR Prog trong AVR Studio:

+Cắm mạch nạp vào cổng USB. +Khởi động chương trình AVR Prog.

+Cắm cable nạp giữa mạch nạp với KIT chứa chip cần nạp tương ứng.

+Chọn loại chip tương ứng trên tab Device, nhấp chọn Advanced để test xem mạch nạp nhận ra chip chưa...Nếu không xuất hiện bất kì thông báo lỗi nào mà hiện ngay lên cửa sổ

Advanced, trong khung đánh dấu như bên dưới hiển thị rõ ràng thông số của chip (không có dấu “?”) có nghĩa là mạch nạp hoạt động tốt và đã nhận ra chip.

->Như vậy là có thể bắt đầu sử dụng mạch để nạp chip.

Các mode, tùy chọn trong cửa sổ Advanced cần tìm hiểu kĩ trong datasheet của nhà sản xuất để có sự thiết đặt đúng.

Sơ Đồ Kết Nối Với Cổng COM máy tính

Sơ Đồ Kết Nối Truyền Dữ Liệu Với Vi Điều Khiển

3.Giới Thiệu Trình biên dịch CodeVision AVR viết bằng C

CodeVisionAVR là một trong những công cụ biên dịch C tốt nhất cho họ vi điều khiển AVR của Atmel, CodeVisionAVR được phát triển bởi HP InfoTech, tích hợp đầy đủ trình biên dịch, môi trường soạn thảo tích hợp Development Environment (IDE) trên nền hệ điều hành Windows.

Các thư viện hỗ trợ:

Mô đun LCD lên tới 4x40 characters Philips I²C Bus

Cảm biến nhiệt độ LM75 của National Semiconductor Bộ đo/điều chỉnh nhiệt độ Dallas DS1621.

Đồng hồ thời gian thực họ Philips PCF8563 and PCF8583 Đồng hồ thời gian thực họ Dallas DS1302 and DS1307 Giao thức 1 dây (Dallas 1 Wire protocol )

Dallas DS1820/DS1822 1 Wire Temperature Sensors Dallas DS2430/DS2433 1 Wire EEPROMs

Giao thức truyền SPI

Quản lý nguồn năng lượng (Powerdown, Sleep Mode ...)

Chuyển đổi mã BCD và Gray.

Khởi Tạo Chip:

Khởi tại với chip ATmega8 và Clock 7.372 MHz

3. Đối với ATMEGA 8L: 6 chân của PORTC sử dụng làm 6 kênh đầu vào ADC. Để sử dụng tính năng ADC của Atmega 8L chúng ta cần phải thiết kế phần cứng của Vi điều khiển như sau :

4. * Chân AVCC chân này bình thường khi thiết kế mạch chúng ta đưa lên Vcc(5V) nhưng khi trong mạch có sử dụng các kênh ADC của phần cứng thì chúng ta phải nối chân này lên Vcc qua 1 cuộn cảm nhằm mục đích cấp nguồn ổn định cho các kênh (đầu vào) của bộ biến đổi. 5. * Chân AREF chân này cần cấp 1 giá trị điện áp ổn định được sử dụng làm điện áp tham chiếu,

chính vì vậy điện áp cấp vào chân này cần ổn định vì khi nó thay đổi làm giá trị ADC ở các kênh thu được bị trôi (thay đổi ) không ổn định với 1 giá trị đầu vào chúng ta có công thức tính như sau:

6. ADCx=(V_INT*1024)/ AREF

7. chỉ dựa vào công thức chúng ta củng có thể thấy giá trị ADCx tỉ lệ thuận với điện áp vào V_INT. Giá trị ADC thu được từ các kênh được lưu vào 2 thanh ghi ADCH và ADCL khi sử dụng chúng ta phải đọc giá trị từ các thanh ghi này, khi sử dụng ở ché độ 8 bít thì chỉ lưu vào thanh ghi ADCL.

9. Đầu ra của LM35 và chân 2 biến trở 1K trên Kit được nối vơi 2 jump chờ. Với AMEGA8L có 6 kênh ADC là chức năng thứ 2 của PORTC. Do đó để ADC ta dung dây nối 2 chân đó

với 2 bit của PORTC là bit 0 và bit 1..

10.Theo datasheet LM35 thì cứ 10mV tương ứng với 10C, ở 00C điện áp ra là 0V, tương ứng với giá trị ADC là 0. Với Vref=5V, giá trị của ADC từ 0 đến 256, lấy tròn 250 mức. Mỗi giá trị ADC ứng với 5V/250= 20 mV. Vậy 1 giá trị ADC ứng với 20C. Muốn tăng độ phân giải ADC ta giảm Vref.

11.4. Các bước khởi tạo code như sau: 12.Trong tab ADC check vào ADC enable:

Cấu hình ADC.

Ta check vào Use 8 bít, để ADC trả về giá trị 8 bít, và ta ADC dùng ngắt check vào Interrupt, về điện áp tham khảo AREF thì lấy điện áp của chân AREF của AVR được nối với 5V. Tần số ADC tùy các bạn thích nhanh hoặc chậm chọn giá trị phù hợp. Trong box Automatically Scan Inputs các bạn check vào Enabled. Vì chúng ta cần ADC 2 kênh, 1 kênh dùng biến trở để test ADC, một kênh từ LM35 đấu với 2 bit 0 và 1 của PORTC do đó chọn First 0, Last 1. Sau khi khởi tạo ADC ta có đoạn caode như sau :

#define ADC_VREF_TYPE 0xE0 // Read the 8 most significant bits // of the AD conversion result

unsigned char read_adc(unsigned char adc_input) {

ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);

// Delay needed for the stabilization of the ADC input voltage delay_us(10);

// Start the AD conversion ADCSRA|=0x40;

while ((ADCSRA & 0x10)==0); ADCSRA|=0x10;

return ADCH; Khởi Tạo USART

4.KHởi Tạo PORT Trước Tiên là PORT B

PORT C

Cổng nối tiếp trên KIT.

Các bước khởi tạo cho cổng nối tiếp dùng CodeWinzard như sau:

Khởi tạo RS232

Trong tab USART check vào các ô Receiver để cho phép nhận dữ liệu; Rx Interrupt để nhận dữ liệu sử dụng ngắt; Transmitter để cho phép truyền dữ liệu; Tx Interrupt để truyền dữ liệu sử dụng ngắt.

Các thông số còn lại: Receiver Buffer và Transmitter Buffer là bộ nhớ đệm nhận và đệm truyền. Trong ứng dụng đơn giản chúng ta để mặc định là 8, trong các ứng dụng truyền số lượng thông tin lớn ta có thể tăng bộ đệm để tránh mất thông tin. Tốc độ baud mặc định là 9600 (bit/s). Các thông

Theo yêu cầu là nhận dữ liệu và truyền lên dữ liệu đó ta viết code như sau. Trước tiên ta khai báo một biến trung gian để truyền nhận dữ liệu và khởi tạo cho PORTB là đầu ra như sau:

Phần IV

Chương Trình

1.Chương Trình Viết Cho Atmega8

void main(void)

{

// Declare your local variables here

unsigned char ndo[4]; // truyen len PC

unsigned char btro[4];//nhiet do hien thi

unsigned int adc0;

unsigned int adc1;

unsigned char s[4];

int i=0;

// Input/Output Ports initialization

// Port B initialization

// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out

// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0

PORTB=0x00;

// Port C initialization

// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In

// State6=T State5=T State4=T State3=T State2=T State1=T State0=T

PORTC=0x00;

DDRC=0x00;

// Port D initialization

// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In

// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T

PORTD=0x00;

DDRD=0xff;

// Timer/Counter 0 initialization

// Clock source: System Clock

// Clock value: Timer 0 Stopped

TCCR0=0x00;

TCNT0=0x00;

// Timer/Counter 1 initialization

// Clock source: System Clock

// Clock value: Timer 1 Stopped

// Mode: Normal top=FFFFh

// OC1A output: Discon.

// OC1B output: Discon.

// Noise Canceler: Off

// Input Capture on Falling Edge

// Timer 1 Overflow Interrupt: Off

// Compare A Match Interrupt: Off

// Compare B Match Interrupt: Off

TCCR1A=0x00; TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Timer/Counter 2 initialization

// Clock source: System Clock

// Clock value: Timer 2 Stopped

// Mode: Normal top=FFh

// OC2 output: Disconnected

ASSR=0x00;

TCCR2=0x00;

TCNT2=0x00;

OCR2=0x00;

// External Interrupt(s) initialization

// INT0: On

// INT1: On

// INT1 Mode: Falling Edge

GICR|=0xC0;

MCUCR=0x0A;

GIFR=0xC0;

// Timer(s)/Counter(s) Interrupt(s) initialization

TIMSK=0x00;

// USART initialization

// Communication Parameters: 8 Data, 1 Stop, No Parity

// USART Receiver: On

// USART Transmitter: On

// USART Mode: Asynchronous

// USART Baud Rate: 9600

UCSRA=0x00;

UCSRB=0x98;

UCSRC=0x86;

UBRRH=0x00;

UBRRL=0x2F;

// Analog Comparator initialization

// Analog Comparator: Off

// Analog Comparator Input Capture by Timer/Counter 1: Off

SFIOR=0x00;

// ADC initialization

// ADC Clock frequency: 460.750 kHz

// ADC Voltage Reference: Int., cap. on AREF

// Only the 8 most significant bits of

// the AD conversion result are used

ADMUX=ADC_VREF_TYPE & 0xff;

ADCSRA=0x84;

// Global enable interrupts

#asm("sei")

while (1)

{

// Place your code here

//**************************************** if(rx_counter) { i++; s[i]=getchar(); if(i==3) i=0;

}

else

{

adc0=read_adc(0); //read bien tro

adc1=read_adc(1); //read lm35

ftoa((float)adc0,0,btro); //chuyen tu 1 so ->chuoi

ftoa((float)adc1,0,ndo); //ep kieu so nguyen thanh real ,o:la so thap phan .

puts(btro); //truyen

putchar('r');

puts(ndo);

putchar(';'); //cat ra bt va ndo

if(adc1>=s[1])

{

PORTB=0x00; //sang muc 0

PORTD.2=1; //sang muc 1 (hardware)

}

else

{

PORTB=0xff; //nguoc lai

PORTD.2=0;

}

if(adc1>=s[2])

PORTD.3=1;

PORTD.3=0; if(adc1>=s[3]) PORTD.4=1; else PORTD.4=0; } delay_ms(10); //*********************** }; }

Thanh ghi điều khiển và trạng thái A (UCSRA).

- Bit 7 – RXC: USART Receive Complete. Bit này được set khi có dữ liệu không đọc được vào bộ đệm nhận, hay bộ đệm nhận đã đầy và nó bị xoá khi bộ đệm nhận là rỗng. Cờ RXC có thể sử dụng để phát ra một ngắt báo Receive Complete.

- Bit 6 – TXC: USART Transmit Complete: Bit này được set nếu quá trình truyền hoàn thành, đó là tại lúc kết thúc một khung gửi đi. Cờ TXC có thể dùng phát ra một ngắt Transmit Complete. - Bit 5 – UDRE: USART Data Register Empty. Bit này được set nếu thanh ghi dữ liệu phát (bộ đệm truyền) là rỗng và sẵn sàng nhận dữ liệu mới. Cờ này cũng có thể dùng đẻ phát ra một ngắt. Thanh ghi điều khiển và trạng thái B (UCSRB)

- Cho phép ngắt .

Thanh ghi điều khiển và trạng thái C (UCSRC).

- Bit 7 – URSEL: Register Select. Bit này chọn việc truy nhập vào UCSRC hoặc UBRRH. Nếu URSEL = 1 thì sẽ chọn làm việc với UCSRC, URSEL phải được viết là 1 khi thực hiện viết UCSRC.

- Bit 6 – UMSEL: USART Mode Select. Bít này dùng để chọn giữa chế độ hoạt động đồng bộ (UMSEL = 1) hay không đồng bộ (UMSEL= 0).

- Thanh ghi tốc độ Baud (UBRRL và UBLLH).

- Bit 15 – URSEL: Register Select. URSEL = 0 ( làm việc với UBRRH. - Bit 14:12 – Reserved Bits. Các bit này dành cho các ứng dụng tương lai.

- Bit 11:0 – UBRR11:0: USART Baud Rate Register. Đây là thanh ghi 12 bit chứa tốc độ baud của USART, UBRRH chứa 4 bit cao nhất và UBBRRL chứa 8 bit thấp còn lại.

2.Chương Trình giao Diện Viết TRên Visual C

void truyen(void) {

tm->Stop();

array <unsigned char,1>^ so;

so = gcnew array <unsigned char,1> (3); so[0] = Convert::ToByte(txtd->Text); sp->Write(so,0,1); so[1] = Convert::ToByte(txtq->Text); sp->Write(so,1,1); so[2] = Convert::ToByte(txtdc->Text); sp->Write(so,2,1); }

private: System::Void button3_Click(System::Object^ sender, System::EventArgs^ e) { x=!x; if(x) { tm->Stop(); button3->Text="OK"; txtd->Enabled=true; txtq->Enabled=true; txtdc->Enabled=true; btndk->Enabled=false; } else {

button3->Text="cai dat nhiet do tu may tinh"; txtd->Enabled=false;

txtq->Enabled=false; txtdc->Enabled=false;

array <unsigned char,1>^ so;

so = gcnew array <unsigned char,1>(3); so[0] = Convert::ToByte(txtd->Text); so[1] = Convert::ToByte(txtq->Text); so[2] = Convert::ToByte(txtdc->Text); sp->Write(so,0,3); btndk->Enabled=true; tm->Start(); } }

private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) { sp->Open(); tm->Start(); tm2->Start(); txtd->Enabled=false; txtq->Enabled=false; txtdc->Enabled=false; txtdk->Enabled=false; btnok->Enabled=false; }

private: System::Void tm_Tick(System::Object^ sender, System::EventArgs^ e) {

tm->Stop(); String^a1; String^a2;

unsigned int den;

unsigned int quat;

unsigned int dongco;

unsigned int m;

unsigned int ndo; m=sp->BytesToRead;

if(m==0)

lbnd->Text="khong co du lieu";

else { a1=sp->ReadExisting(); array<String^>^b1; b1=a1->Split(';'); a2=Convert::ToString(b1[1]); array<String^>^b2; b2=a2->Split('r'); lbnd->Text=b2[1]; ndo=Convert::ToInt32(b2[1]); den=Convert::ToInt32(txtd->Text); quat=Convert::ToInt32(txtq->Text); dongco=Convert::ToInt32(txtdc->Text); if(ndo>=den) lbdd->BackColor=Color::Red; else lbdd->BackColor=Color::Blue; if(ndo>=quat) lbq->BackColor=Color::Red; else lbq->BackColor=Color::Blue; if(ndo>=dongco) lbdc->BackColor=Color::Red; else lbdc->BackColor=Color::Blue; }

tm->Start();

}

private: System::Void tm1_Tick(System::Object^ sender, System::EventArgs^ e) { tm1->Stop(); String^a1; String^a2; unsigned int m; m=sp->BytesToRead; if(m==0)

lbnd->Text="Khong Co Du Lieu";

else { a1=sp->ReadExisting(); array<String^>^b1; b1=a1->Split(';'); a2=Convert::ToString(b1[1]); array<String^>^b2; b2=a2->Split('r'); txtdk->Text=b2[0]; } tm1->Start(); }

private: System::Void btndk_Click(System::Object^ sender, System::EventArgs^ e) { tm->Stop(); y=!y; if(y)

Một phần của tài liệu nghiên cứu sử dụng chip avr atmega8 đo nhiệt độ và điều khiển (Trang 67 - 99)

Tải bản đầy đủ (PDF)

(99 trang)