1. Trang chủ
  2. » Giáo Dục - Đào Tạo

(TIỂU LUẬN) báo cáo môn hệ THỐNG điều KHIỂN NHÚNG đo nhiệt độ bằng LM35 hiển thị trên mà hình LCD sử dụng vdk pic16f877a

64 18 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 64
Dung lượng 889,24 KB

Nội dung

TRƯỜNG ĐẠI HỌC GIAO THÔNG VẬN TẢI KHOA ĐIỆN ĐIỆN TỬ BỘ MÔN ĐIỀU KHIỂN HỌC *********** BÁO CÁO MÔN: HỆ THỐNG ĐIỀU KHIỂN NHÚNG TRƯỜNG ĐẠI HỌC GIAO THÔNG VẬN TẢI BÁO CÁO TỔNG KẾT HỆ THỐNG ĐIỀU KHIỂN NHÚNG NHÓM Thuộc lĩnh vực khoa học công nghệ: Điện - Điện tử Sinh viên thực hiện: 1.Lưu Minh Lâm 2.Nguyễn Việt Tuấn 3.Nguyễn Quang Hưng 4.Nguyễn Xuân Tùng(1408989) 5.Nguyễn Xuân Tùng(1408988) 6.Nguyễn Minh Thành Long 7.Phạm Khắc Hải 8.Hoàng Văn Hải 9.Nguyễn Văn Khanh 10.Nguyên Bá Hùng 11.Nguyễn Văn Hiểu 12.Đỗ Văn Đông Lớp: Tự động hóa - điều khiển K55 Năm thứ: 3/Số năm đào tạo: 4.5 Ngành học: Kỹ thuật điều khiển tự động hóa Khoa: Điện - Điện Tử Hà Nội, 26/03/2017 Mục lục Phần 1: khái quát VXL PIC16f877a Phần 2:CODE-Mơ lập trình…………………………………… ❖ Bài 1: Đo nhiệt độ LM35 hiển thị mà hình LCD sử dụng vdk pic16f877a……………………………………………………………….8 ❖ Bài 2: Đo nhiệt độ LM35 nhiệt độ lớn 40 đóng quạt chạy làm mát……………………………………………………………………….16 ❖ BÀI 3: ĐO TỐC ĐỘ ĐỘNG CƠ BẰNG ENCODER SỬ DỤNG NGẮT NGOÀI VÀ TIMER1 CỦA VĐK PIC16F877A………………………………….22 ❖ Bài 4:Đo khoảng Cách sử dụng cảm biến siêu âm SRF05 hiển thị LCD16x02…………………………………………………………… 28 ❖ Bài 5:Gửi chuỗi kí tự qua UART……………………………………… 35 ❖ Bài 6: Truyền thông I2C……………………………………………… 51 ❖ Bài 7: Đảo chiều, dừng động sử dụng L298 kết hợp đo tốc độ truyền tốc độ qua UART……………………………………………………………….57 Phần I: Khái quát VXL PIC16F877A SƠ ĐỒ NỐI CHÂN CỦA PIC16F877A Chức chân PORTA Chân RA0/AN0 - RA0: xuất/ nhập số - bit thứ port A - AN0: ngõ vào tương tự kênh thứ Chân RA1/AN1 - RA1: xuất/nhập số - bit thứ port A - AN1: ngõ vào tương tự kênh thứ Chân RA2/AN2/VREF-/CVREF - RA2: xuất/nhập số - bit thứ port A - AN2: ngõ vào tương tự kênh thứ - VREF-: ngõ vào điện áp chuẩn (thấp) ADC - CVREF: điện áp tham chiếu VREF ngõ vào so sánh Chân RA3/AN3/VREF+ - RA3: xuất/nhập số - bit thứ port A - AN3: ngõ vào tương tự kênh thứ - VREF+: ngõ vào điện áp chuẩn (cao) A/D - RA4: xuất/nhập số – bit thứ port A - TOCKI: ngõ vào xung clock từ bên cho Timer0 - C1OUT: ngõ so sánh - RA5: xuất/nhập số – bit thứ port A - AN4: ngõ vào tương tự kênh thứ - SS : ngõ vào chọn lựa SPI tớ (Slave SPI device) - C2OUT: ngõ so sánh - Chức chân PORTB Chân RB0/INT RB0: xuất/nhập số – bit thứ port B - INT: ngõ vào nhận tín hiệu ngắt Chân RB1 - RB1: xuất/nhập số – bit thứ port B Chân RB2 - RB2: xuất/nhập số – bit thứ port B Chân RB3 - RB3: xuất/nhập số – bit thứ port B Chân RB4 - RB4: xuất/nhập số – bit thứ port B Chân RB5 - RB5: xuất/nhập số – bit thứ port B 7.Chân RB6 - RB6: xuất/nhập số - RB7: xuất/nhập số - Chức chân PORTC Chân RC0/T1OSO/T1CKI (15): có chức năng: - RC0: xuất/nhập số – bit thứ port C - T1OSO: ngõ dao động Timer1 - T1CKI: ngõ vào xung clock từ bên ngồi Timer1 Chân RC1/T1OSI/CCP2 (16): có chức năng: - RC1: xuất/nhập số – bit thứ port C - T1OSI: ngõ vào dao động Timer1 - CCP2: ngõ vào Capture2, ngõ compare2, ngõ PWM2 Chân RC2 /P1A/CCP1 (17): có chức năng: - RC2: xuất/nhập số – bit thứ port C - P1A: ngõ PWM - CCP1: ngõ vào Capture1, ngõ compare1, ngõ PWM1 Chân RC3/SCK/SCL (18): có chức năng: - RC3: xuất/nhập số – bit thứ port C - SCK: ngõ vào xung clock nối tiếp đồng bộ/ngõ chế độ SPI - SCL: ngõ vào xung clock nối tiếp đồng bộ/ngõ chế độ I2C Chân RC4/SDI/SDA (23): có chức năng: RC4: xuất/nhập số – bit thứ port C - SDI: ngõ vào liệu truyền liệu kiểu SPI - SDA: xuất/nhập liệu I2C Chân RC5/SDO (24): có chức năng: - RC5: xuất/nhập số – bit thứ port C - SDO: ngõ xuất liệu truyền liệu kiểu SPI Chân RC6/TX/CK (25): có chức năng: - RC6: xuất/nhập số – bit thứ port C - TX: ngõ phát liệu chế độ truyền bất đồng USART - CK: ngõ cấp xung clock chế độ truyền đồng USART Chân RC7/RX/DT - RC7: xuất/nhập số – bit thứ port C - RX: ngõ vào nhận liệu chế độ truyền bất đồng EUSART - DT: ngõ phát nhận liệu chế độ truyền đồng EUSART - - Chức chân PORTD Chân RD0 - RD0: xuất/nhập số – bit thứ port D - Chân RD1 2.RD1: xuất/nhập số – bit thứ port D Chân RD2 - RD2: xuất/nhập số – bit thứ port D 4.Chân RD3 - RD3: xuất/nhập số – bit thứ port D Chân RD4 - RD4: xuất/nhập số – bit thứ port D Chân RD5 - RD5: xuất/nhập số – bit thứ port D - ngõ PWM RD6: xuất/nhập số – bit thứ port D Chân RD7 - RD7: xuất/nhập số – bit thứ port D - - Chức chân PORTE Chân RE0/AN5 (8): có chức năng: RE0: xuất/nhập số - AN5: ngõ vào tương tự 2.Chân RE1/AN6 (9): có chức năng: - RE1: xuất/nhập số - AN6: ngõ vào tương tự kênh thứ Chân RE2/AN7 (10): có chức năng: - RE2: xuất/nhập số - AN7: ngõ vào tương tự kênh thứ - Phần II: CODE – Mơ Phỏng Các Bài Lập Trình Nhúng Bài :ĐO NHIỆT ĐỘ BẰNG CẢM BIẾN LM35 HIỂN THỊ LÊN LCD SỬ DỤNG VĐK 16F877A • Ngun lý: Tín hiệu đại lượng vật lý cần đo nhiệt độ biến đổi thành tín hiệu điện thơng qua cảm biến nhiệt độ LM35 Tín hiệu đưa vào vi điều khiển Ở vi điều khiển PIC16F877A có tích hợp sẵn chuyển đổi ADC Ở sử dụng để đo nhiệt độ nên cần sử dụng kênh đo ADC vi điều khiển Module ADC vi điều khiển PIC16F877A gồm có ghi ADRESH, ADRESL, ADCON0, ADCON1 Giá trị sau chuyển đổi lấy giá trị 10 bit tính toán chuyển thành nhiệt độ tương ứng hiển thị lên LCD16x2 Nếu nhiệt độ đo lớn 40 độ có thơng báo hiển thị lên LCD loa kêu lên Bây tìm hiểu ghi ADC vi điều khiển ▪ ADCON0: Bit 7-6 ADCS1:ADCS0: bit kết hợp với bit ADCS2 ghi ADCON1 dùng để cài đặt tần số chuyển đổi ADC Bit - CH2:CH0: bit lựa chọn kênh analog module ADC 000 = Channel (AN0) 001 = Channel (AN1) 010 = Channel (AN2) 011 = Channel (AN3) 100 = Channel (AN4) 101 = Channel (AN5) 110 = Channel (AN6) 111 = Channel (AN7) Bit Go/Done: bit trạng thái chuyển đổi ADC 1: Quá trình đọc ADC thực xong 2: trình đọc ADC tiến hành thực xong bit bị xóa Bit ADON: 1: module ADC bị tắt 2: module ADC kích hoạt ▪ ADCON1: Bit ADFM: bit dùng để cài đặt việc lưu giá trị ADC đọc ghi 1: bit thấp ghi ADRESL không dùng 10bit ADC lưu vào bit lại ghi 2: bit cao ghi ADRESH không dùng 10bit ADC lưu vào bit lại ghi Bit 3-0 PCFG3:PCFG0: Bit để cài đặt kênh ADC ▪ ▪ ADRESH ADRESL: Chứa 10 bit ADC sau chuyển đổi xong LM35: Nhiệt độ xác địnho cách đo hiệu điện ngõ LM35 o Đơn vị nhiệt độ C Nhiệt độ thay đổi tuyến tính 10mV/ C Độ xác thực tế: 1/4°C nhiệt độ phịng 3/4°C ngồi trời.Nhiệt độ đo khoảng -55°C tới 150°C LM35 có hiệu cao, công suất tiêu thụ 60uA Như vậy, cách đưa vào chân bên trái cảm biến LM35 hiệu điện 5V, chân phải nối đất, đo hiệu điện chân chân RA0/AN0 bạn có nhiệt độ (0-150ºC) cơng thức: Nhiệt độ = (5000.0f) /1023*giá trị ADC đọc được/10 Hình ảnh thực tế 10 ACKEN = 1; return temp; } void main() { nRBPU = 0; //Enable PORTB internal pull up resistor TRISB = 0xFF; //PORTB as input TRISD = 0x00; //PORTD as output PORTD = 0x00; //All LEDs OFF I2C_Master_Init(100000); //Initialize I2C Master with 100KHz clock while(1) { I2C_Master_Start(); //Start condition I2C_Master_Write(0x30); //7 bit address + Write I2C_Master_Write(PORTB); I2C_Master_Stop(); //Write data //Stop condition delay_ms(200); I2C_Master_Start(); //Start condition I2C_Master_Write(0x31); //7 bit address + Read PORTD = I2C_Master_Read(0); //Read + Acknowledge I2C_Master_Stop(); //Stop condition delay_ms(200); } } Code Slave: /* 50 * File: slave.c * Author: minhlam * * Created on March 13, 2017, 12:07 AM */ #include #include #define _XTAL_FREQ 20000000 / #pragma config statements should precede project file includes / Use project enums instead of #define for ON and OFF / CONFIG #pragma config FOSC = HS // Oscillator Selection bits (XT oscillator) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config BOREN = OFF // Brown-out Reset Enable bit (BOR disabled) #pragma config LVP = OFF Enable bit // Low-Voltage In-Circuit Serial Programming #pragma config CPD = OFF // Data EEPROM Memory Code Protection bit #pragma config WRT = OFF // Flash Program Memory Write Enable bits #pragma config CP = OFF // Flash Program Memory Code Protection bit unsigned int z; 51 void I2C_Slave_Init (unsigned int add) { SSPSTAT=0x80; SSPADD= add; SSPCON=0x36; SSPCON2bits.SEN=1; TRISCbits.TRISC3=1; TRISCbits.TRISC4=1; INTCONbits.GIE=1; INTCONbits.PEIE=1; PIR1bits.SSPIF=0; // xoa co tran PIE1bits.SSPIE=1; // cho phép ng?t I2C } void interrupt I2C_Slave_Read() { if(PIR1bits.SSPIF=1) { SSPCONbits.CKP=0; if ((SSPCONbits.SSPOV) || (SSPCONbits.WCOL)) //If overflow or collision { z = SSPBUF; // Read the previous value to clear the buffer SSPCONbits.SSPOV = 0; // Clear the overflow flag SSPCONbits.WCOL = 0; // Clear the collision bit SSPCONbits.CKP = 1; } 52 if(!SSPSTATbits.D_nA && !SSPSTATbits.R_nW) //If last byte was Address + Write { z = SSPBUF; while(!BF); PORTD = SSPBUF; SSPCONbits.CKP = 1; } else if(!SSPSTATbits.D_nA && SSPSTATbits.R_nW) //If last byte was Address + Read { z = SSPBUF; BF=0; SSPBUF = PORTB ; SSPCONbits.CKP = 1; while(SSPSTATbits.BF); } SSPIF = 0; } } //void main(void) { // nRBPU = 0; // TRISB = 0xFF; // TRISD = 0x00; // PORTD = 0x00; / I2C_Slave_Init(0x30); //Initialize as a I2C Slave with address 0x30 / while(1); 53 //} //unsigned int z; //void interrupt I2C_Slave_Read() //{ / if(SSPIF == 1) / { / SSPCONbits.CKP = 0; / if ((SSPCONbits.SSPOV) || (SSPCONbits.WCOL)) / { / / z = SSPBUF; // Read the previous value to clear the buffer / SSPCONbits.SSPOV = 0; // Clear the overflow flag / SSPCONbits.WCOL = 0; // Clear the collision bit / SSPCONbits.CKP = 1; / } // / if(!SSPSTATbits.D_nA && !SSPSTATbits.R_nW) / { / z = SSPBUF; / while(!BF); / PORTD = SSPBUF; / SSPCONbits.CKP = 1; / } / else if(!SSPSTATbits.D_nA && SSPSTATbits.R_nW) / { / z = SSPBUF; / BF=0; 54 / SSPBUF = PORTB ; / SSPCONbits.CKP = 1; / while(SSPSTATbits.BF); } / // SSPIF = 0; / / } //} //void I2C_Slave_Init(short address) //{ / SSPSTAT = 0x80; / SSPADD = address; / SSPCON = 0x36; / SSPCON2 = 0x01; / TRISC3 = 1; //Setting as input as given in datasheet / TRISC4 = 1; //Setting as input as given in datasheet / GIE = 1; / PEIE = 1; / SSPIF = 0; / SSPIE = 1; //} void main() { nRBPU = 0; //Enables PORTB internal pull up resistors TRISB = 0xFF; //PORTB as input TRISD = 0x00; //PORTD as output 55 PORTD = 0x00; //All LEDs OFF I2C_Slave_Init(0x30); //Initialize as a I2C Slave with address 0x30 while(1); } 56 Bài 7: Đảo chiều, dừng động sử dụng L298 kết hợp đo tốc độ truyền tốc độ qua UART IC L298 IC tích hợp nguyên khối gồm mạch cầu H bên Với điện áp làm tăng công suất nhỏ động DC loại vừa… Mình tóm tắt qua chức chân L298 - chân INPUT: IN1, IN2, IN3, IN4 nối với chân 5, 7, 10, 12 L298 Đây chân nhận tín hiệu điều khiển - chân OUTUT: OUT1, OUT2, OUT3, OUT4 (tương ứng với chân INPUT) nối với chân 2, 3,13,14 L298 Các chân nối với động - Hai chân ENA ENB dùng để điều khiển mạch cầu H L298 Nếu mức logic “1” (nối với nguồn 5V) cho phép mạch cầu H hoạt động, mức logic “0” mạch cầu H khơng hoạt động Với tốn trên, bạn cần lưu ý đến cách điều khiển chiều quay với L298: - Khi ENA = 0: Động không quay với đầu vào - Khi ENA = 1: INT1 = 1; INT2 = 0: Động quay thuận INT1 = 0; INT2 = 1: Động quay nghịch INT1 = INT2: Động dùng tức Với ENB tương tự với INT3, INT4 Trong sử dụng module L298 V1 để điều khiển chiều quay động DC 57 Sơ đồ nguyên lý: L298N tích hợp hai mạch cầu H -Điện áp điều khiển: +5 V ~ +35 V - Dòng tối đa cho cầu H là: 2A - Điện áp tín hiệu điều khiển: +5 V ~ +7 V - Dịng tín hiệu điều khiển: ~ 36mA - Cơng suất hao phí: 20W (khi nhiệt độ T = 75 ℃) - Nhiệt độ bảo quản: -25 ℃ ~ +130 ℃ - Driver: L298N tích hợp hai mạch cầu H -Điện áp điều khiển: +5 V ~ +35 V - Dòng tối đa cho cầu H là: 2A - Điện áp tín hiệu điều khiển: +5 V ~ +7 V - Dịng tín hiệu điều khiển: ~ 36mA - Cơng suất hao phí: 20W (khi nhiệt độ T = 75 ℃) - Nhiệt độ bảo quản: -25 ℃ ~ +130 ℃ - Driver: /* * File: main.c * Author: xuantung * * Created on March 19, 2017, 10:58 PM 58 */ #define _XTAL_FREQ 20000000 #define RS RD1 #define EN RD3 #define D4 RD4 #define D5 RD5 #define D6 RD6 #define D7 RD7 #include #include #include "lcd.h" #include // BEGIN CONFIG #pragma config FOSC = HS // Oscillator Selection bits (HS oscillator) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT enabled) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config BOREN = OFF // Brown-out Reset Enable bit (BOR enabled) #pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming) #pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off) #pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control) #pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off) 59 //END CONFIG float dem=0; float Soxungdem=0; float tongsoxung=0; float count; void _KhoiTaoTIMER1(void) { //chu ki dem cua timer1 //T = * (1/Fosc) * (Pres) // T= * (1/20*10^6) * = 1.6us //tinh gia tri dat vao timer1 tao thoi gian trich mau la 10ms //10ms = 10000us = (65536-value)*1.6us // value = 59286 T1CONbits.TMR1CS = 0; T1CONbits.T1CKPS1 = 1; T1CONbits.T1CKPS0 = 1;//ti le chia 1:8 TMR1=59286; T1CONbits.TMR1ON = 1; PIE1bits.TMR1IE=1; //cho phep ngat timer1 } void _KhoiTaoNgatNgoai(void) { TRISBbits.TRISB0=1; INTCONbits.PEIE=1;//ngat ngoai vi INTCONbits.INTE=1; //ngat RB0 OPTION_REGbits.INTEDG=1; //ngat canh xuong 60 INTCONbits.INTF=0; } void main(void) { //khai bao bien cuc bo o day float TocDo; TRISD=0x00; PORTDbits.RD2=0; unsigned char s[20]; _KhoiTaoTIMER1(); _KhoiTaoNgatNgoai(); INTCONbits.GIE=1;// ngat toan cuc Lcd_Init(); while(1) { if(INTCONbits.INTF) { Soxungdem=Soxungdem+1; INTCONbits.INTF=0; } if(PIR1bits.TMR1IF) { 61 INTCONbits.INTE=0;// ko cho ngat RB0 T1CONbits.TMR1ON=0; tongsoxung=Soxungdem; Soxungdem=0; / INTCONbits.INTE=0;// cho ngat RB0 T1CONbits.TMR1CS = 0; T1CONbits.T1CKPS1 = 1; T1CONbits.T1CKPS0 = 1;//ti le chia 1:8 TMR1=59286; T1CONbits.TMR1ON = 1; PIE1bits.TMR1IE=1; //cho phep ngat timer1 dem++; PIR1bits.TMR1IF=0; } if(dem>=10) { dem=0; TocDo=(((1000)/10)*tongsoxung*(60))/(200);//(1000f/25f) doi tu ms => s // Lcd_Set_Cursor(1,1); Lcd_Write_String("SO XUNG:"); sprintf(s,"%f ",tongsoxung); Lcd_Set_Cursor(1,10); 62 Lcd_Write_String(s); Lcd_Set_Cursor(2,1); Lcd_Write_String("TOC DO:"); sprintf(s,"%f ",TocDo ); Lcd_Set_Cursor(2,10); Lcd_Write_String(s); } } } thông số động 63 64 ... độ LM35 Tín hiệu đưa vào vi điều khiển Ở vi điều khiển PIC16F877A có tích hợp sẵn chuyển đổi ADC Ở sử dụng để đo nhiệt độ nên cần sử dụng kênh đo ADC vi điều khiển Module ADC vi điều khiển PIC16F877A. .. 2:CODE-Mô lập trình…………………………………… ❖ Bài 1: Đo nhiệt độ LM35 hiển thị mà hình LCD sử dụng vdk pic16f877a? ??…………………………………………………………….8 ❖ Bài 2: Đo nhiệt độ LM35 nhiệt độ lớn 40 đóng quạt chạy làm mát……………………………………………………………………….16... Trình Nhúng Bài :ĐO NHIỆT ĐỘ BẰNG CẢM BIẾN LM35 HIỂN THỊ LÊN LCD SỬ DỤNG VĐK 16F877A • Nguyên lý: Tín hiệu đại lượng vật lý cần đo nhiệt độ biến đổi thành tín hiệu điện thơng qua cảm biến nhiệt độ

Ngày đăng: 02/12/2022, 08:42

HÌNH ẢNH LIÊN QUAN

Hình ảnh thực tế - (TIỂU LUẬN) báo cáo môn hệ THỐNG điều KHIỂN NHÚNG đo nhiệt độ bằng LM35 hiển thị trên mà hình LCD sử dụng vdk pic16f877a
nh ảnh thực tế (Trang 10)

TRÍCH ĐOẠN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w