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).
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.
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.
+Đị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:
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]\ )
c/Trong quá trình cài đặt, nếu hộp thoại dưới đây xuất hiện, chọn “Continue anyway”...
đó cần tinh chỉnh thông số cổng COM này tối ưu nhất. +Vào Start -> Control Panel -> System...
+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.
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.
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 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 ...)
Mô đun trễ (delay) chính xác, thông minh dựa trên tốc độ chip sử dụng. Chuyển đổi mã BCD và Gray.
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.
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:
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
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;
// Wait for the AD conversion to complete while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10; return ADCH;
Khởi Tạo USART
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 số của bộ truyền: 8 bit, 1 bit dừng(stop), không ưu tiên. Chế độ truyền không đồng bộ. 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];
// 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;
DDRB=0xFF;
// 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
// Mode: Normal top=FFFFh // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off
// Input Capture on Falling Edge // Timer 1 Overflow Interrupt: Off // Input Capture 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
TCCR2=0x00; TCNT2=0x00; OCR2=0x00;
// External Interrupt(s) initialization // INT0: On
// INT0 Mode: Falling Edge // 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;
UBRRH=0x00; UBRRL=0x2F;
// Analog Comparator initialization // Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80;
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
{ 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) }
{
PORTB=0xff; //nguoc lai PORTD.2=0; } if(adc1>=s[2]) PORTD.3=1; else 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 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; 98
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]);
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) { tm1->Start(); btndk->Text="OK"; lbtb->Text="DEN"; txtdk->Enabled=true; 100
button3->Enabled=false; }
else {
btndk->Text="Cai Dat Nhiet Do Tu Vi Dieu Khien"; btnok->Enabled=false;
lbtb->Text="Thiet Bi"; txtdk->Text=" ";
txtdk->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); button3->Enabled=true; tm1->Stop(); tm->Start(); } }
private: System::Void btnok_Click(System::Object^ sender, System::EventArgs^ e) { i++; if(i==1) { lbtb->Text="Quat"; txtd->Text=txtdk->Text; } if(i==2) { lbtb->Text="D.CO"; txtq->Text=txtdk->Text; } if(i==3) { lbtb->Text="DEN"; txtdc->Text=txtdk->Text; i=0; } }
private: System::Void lb_Click(System::Object^ sender, System::EventArgs^ e) {
}
private: System::Void tm2_Tick(System::Object^ sender, System::EventArgs^ e) {
lbht->Text="CHUONG TRINH DO NHIET DO VA
DIEU KHIEN THIET BI "; lbht1->Text="HIEN THUC SINH VIEN DAO THANH MAI+
j--; k++; lbht->Location=Point(j,9); lbht1->Location=Point(k,38); if(j==(-650))