Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 64 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
64
Dung lượng
1,1 MB
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 download by : skknchat@gmail.com 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 7.Phạm Khắc Hải 2.Nguyễn Việt Tuấn 8.Hoàng Văn Hải 3.Nguyễn Quang Hưng 9.Nguyễn Văn Khanh 4.Nguyễn Xuân Tùng(1408989) 10.Nguyên Bá Hùng 5.Nguyễn Xuân Tùng(1408988) 11.Nguyễn Văn Hiểu 6.Nguyễn Minh Thành Long 12.Đỗ Văn Đơng Lớp: Tự động hóa - điều khiển K55 Khoa: Điện - Điện Tử 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 Hà Nội, 26/03/2017 download by : skknchat@gmail.com Mục lục Phần 1: khái quát VXL PIC16f877a .4 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 download by : skknchat@gmail.com Phần I: Khái quát VXL PIC16F877A SƠ ĐỒ NỐI CHÂN CỦA PIC16F877A Chức chân PORTA download by : skknchat@gmail.com 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 Chân RA4/TOCKI/C1OUT - 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 Chân RA5/AN4/ SS/ C2OUT - 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 download by : skknchat@gmail.com 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 ngồi 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ố Chân RB7 - 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 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: download by : skknchat@gmail.com - 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 Chân RD6 - 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: download by : skknchat@gmail.com - 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 • 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 độ 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 tố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 ADCS2 (ADCON1) 0 ADCS1:ADCS0 (ADCON0) 00 01 Tần số đọc ADC FOSC/2 FOSC/8 download by : skknchat@gmail.com 10 FOSC/32 11 FRC 00 FOSC/4 01 FOSC/16 10 FOSC/32 11 FRC 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 0: Quá trình đọc ADC thực xong 1: trình đọc ADC tiến hành thực xong bit bị xóa Bit ADON: 0: module ADC bị tắt 1: module ADC kích hoạt ▪ ADCON1: Bit ADFM: bit dùng để cài đặt việc lưu giá trị ADC đọc ghi 0: bit thấp ghi ADRESL khơng dùng 10bit ADC lưu vào bit cịn lại ghi 1: bit cao ghi ADRESH không dùng 10bit ADC lưu vào bit lại ghi download by : skknchat@gmail.com 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 định cách đo hiệu điện ngõ LM35 Đơn vị nhiệt độ oC Nhiệt độ thay đổi tuyến tính 10mV/ oC Độ 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 download by : skknchat@gmail.com 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 download by : skknchat@gmail.com * 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 download by : skknchat@gmail.com 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 download by : skknchat@gmail.com 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; //Enables PORTB internal pull up resistors // TRISB = 0xFF; //PORTB as input // TRISD = 0x00; //PORTD as output // PORTD = 0x00; //All LEDs OFF // I2C_Slave_Init(0x30); //Initialize as a I2C Slave with address 0x30 // while(1); 53 download by : skknchat@gmail.com //} //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 download by : skknchat@gmail.com // 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 download by : skknchat@gmail.com PORTD = 0x00; //All LEDs OFF I2C_Slave_Init(0x30); //Initialize as a I2C Slave with address 0x30 while(1); } 56 download by : skknchat@gmail.com 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 download by : skknchat@gmail.com Sơ đồ nguyên lý: - 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: 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 ℃ /* * File: main.c * Author: xuantung * * Created on March 19, 2017, 10:58 PM 58 download by : skknchat@gmail.com */ #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 download by : skknchat@gmail.com //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 download by : skknchat@gmail.com 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 download by : skknchat@gmail.com 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 download by : skknchat@gmail.com 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 download by : skknchat@gmail.com 64 download by : skknchat@gmail.com ... độ 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. .. VXL PIC16f877a .4 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 độ. .. 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 độ