THÀNH PHỐ HỒ CHÍ MINH BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT Tp Hồ Chí Minh, tháng 07/2017 GVHD NGUYỄN VĂN HIỆP SVTH LÊ TRẦN HOÀNG VŨ PHẠM QUỐC HIẾU ĐỒ ÁN TỐT NGHIỆP NGÀNH CNKT ĐIỀU KH[.]
BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT THÀNH PHỐ HỒ CHÍ MINH ĐỒ ÁN TỐT NGHIỆP NGÀNH CNKT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA THIẾT KẾ KIT PHÁT TRIỂN THE SUN DỰA TRÊN VI ĐIỀU KHIỂN PIC GVHD: NGUYỄN VĂN HIỆP SVTH: LÊ TRẦN HỒNG VŨ PHẠM QUỐC HIẾU SKL010048 Tp Hồ Chí Minh, tháng 07/2017 TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT THÀNH PHỐ HỒ CHÍ MINH KHOA ĐÀO TẠO CHẤT LƯỢNG CAO ĐỒ ÁN TỐT NGHIỆP THIẾT KẾ KIT PHÁT TRIỂN THE SUN DỰA TRÊN VI ĐIỀU KHIỂN PIC SVTH: MSSV: Khóa: Nghành: GVHD: LÊ TRẦN HOÀNG VŨ – PHẠM QUỐC HIẾU 13124121 - 13151141 2013 - 2017 CN KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA NGUYỄN VĂN HIỆP Tp Hồ Chí Minh, tháng năm 2017 TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT THÀNH PHỐ HỒ CHÍ MINH KHOA ĐÀO TẠO CHẤT LƯỢNG CAO ĐỒ ÁN TỐT NGHIỆP THIẾT KẾ KIT PHÁT TRIỂN THE SUN DỰA TRÊN VI ĐIỀU KHIỂN PIC SVTH: MSSV: Khóa: Nghành: GVHD: LÊ TRẦN HỒNG VŨ – PHẠM QUỐC HIẾU 13124121 - 13151141 2013 - 2017 CN KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA NGUYỄN VĂN HIỆP Tp Hồ Chí Minh, tháng năm 2017 Tp Hồ Chí Minh, ngày tháng năm 2017 NHIỆM VỤ ĐỒ ÁN TỐT NGHIỆP Họ tên sinh viên 1: Lê Trần Hoàng Vũ Họ tên sinh viên 2: Phạm Quốc Hiếu Nghành: CN kỹ thuật điều khiển tự động hóa Giảng viên hướng dẫn: Nguyễn Văn Hiệp Ngày nhận đề tài: MSSV: 13124121 MSSV: 13151141 Lớp: 13151CLC ĐT: 0909960000 Ngày nộp đề tài: Tên đề tài: Các số liệu, tài liệu ban đầu: Nội dung thực đề tài: Sản phẩm: TRƯỞNG NGHÀNH GIẢNG VIÊN HƯỚNG DẪN i ` PHIẾU NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN Họ tên Sinh viên 1: MSSV: Họ tên Sinh viên 1: MSSV: Nghành: Tên đề tài: Họ tên Giáo viên hướng dẫn: NHẬN XÉT Về nội dụng đề tài & khối lượng thực hiện: Ưu điểm: Khuyết điểm: Đề nghị cho bảo vệ hay không? Đánh giá loại: 6.Điểm: (Bằngchữ: ) Tp Hồ Chí Minh, ngày tháng năm 20 Giáo viên hướng dẫn (Ký & ghi rõ họ tên) ii ` PHIẾU NHẬN XÉT CỦA GIÁO VIÊN PHẢN BIỆN Họ tên Sinh viên 1: MSSV: Họ tên Sinh viên 1: MSSV: Nghành: Tên đề tài: Họ tên Giáo viên phản biện: NHẬN XÉT Về nội dung đề tài & khối lượng thực hiện: Ưu điểm: Khuyết điểm: Đề nghị cho bảo vệ hay không? Đánh giá loại: Điểm: (Bằng chữ: ) Tp Hồ Chí Minh, ngày tháng năm 20 Giáo viên phản biện (Ký & ghi rõ họ tên) iii ` LỜI CÁM ƠN Trong thời gian làm đồ án tốt nghiệp, chúng em nhận nhiều giúp đỡ, đóng góp ý kiến bảo nhiệt tình thầy, cơ, gia đình bạn bè Chúng em xin gửi lời cảm ơn chân thành đến thầy Nguyễn Văn Hiệp người tận tình hướng dẫn, bảo chúng em suốt trình làm đồ án tốt nghiệp Nhờ có góp ý, hỗ trợ khích lệ tinh thần thầy giúp nhóm vượt qua khó khăn để hồn thành đồ án tiến độ Chúng em xin chân thành cảm ơn thầy cô giáo trường Đại Học Sư Phạm Kĩ Thuật TPHCM nói chung thầy cô môn Tự động điều khiển nói riêng truyền đạt, dạy dỗ cho chúng em kiến thức môn đại cương mơn chuyện nghành, giúp chúng em có sở lý thuyết vững vàng tạo điều khiện giúp đỡ chúng em suốt trình học tập Cuối cùng, chúng em xin gửi lời cảm ơn tới gia đình người bạn đồng hành hỗ trợ thời điểm khó khăn Cảm ơn bạn giúp đỡ hồn thành đồ án Chúng em xin chân thành cảm ơn! Nhóm sinh viên thực đề tài Lê Trần HoàngVũ Phạm Quốc Hiếu iv ` TĨM TẮT Đồ án trình bày bước quy trình thiết kế kit phát triển The Sun dựa vi điều khiển PIC 16F887: Xác định mục đích làm kit phát triển The Sun: Hỗ trợ học tập môn vi xử lý trường Đại Học Sư Phạm Kỹ Thuật TPHCM Thiết kế khối: Digital output – LED đơn trực tiếp Điều khiển IC số - LED đơn gián tiếp Điều khiển quét led đoạn LCD Digital input - Nút nhấn đơn ADC Counter đếm xung ngoại Điều khiển tải công suất Điều khiển băm xung PWM Mạch nạp Thiết kế sơ đồ nguyên lý mạch Thi công board: Làm mạch in, hàn linh kiện Xây dựng thí nghiệm mẫu: Các thí nghiệm module LED đơn trực tiếp Các thí nghiệm module LED đơn gián tiếp Các thí nghiệm module tải cơng suất Các thí nghiệm module nút nhấn đơn Các thí nghiệm module led đoạn Các thí nghiệm module LCD Các thí nghiệm module ADC Các thí nghiệm xung PWM Các thí nghiệm module đếm xung ngoại v MỤC LỤC NHIỆM VỤ ĐỒ ÁN TỐT NGHIỆP i PHIẾU NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN iii PHIẾU NHẬN XÉT CỦA GIÁO VIÊN PHẢN BIỆN iii LỜI CÁM ƠN iv TÓM TẮT v MỤC LỤC vi DANH MỤC CÁC BẢNG BIỂU viiError! Bookmark not defined DANH MỤC CÁC HÌNH ẢNH, BIỂU ĐỒ iii CHƯƠNG - TỔNG QUAN ĐỀ TÀI 1.1 Giới thiệu chung .1 1.2 Lý chọn đề tài 1.3 Mục tiêu nghiên cứu 1.4 Nhiệm vụ nghiên cứu 1.5 Phương pháp nghiên cứu 1.6 Tính cấp thiết đề tài CHƯƠNG - CƠ SỞ LÝ THUYẾT .4 2.1 Một số kit phát triển cho vi điều khiển .4 2.1.1 Tại có kit phát triển? .4 2.1.2 Các kit phát triển phổ biến 2.1.3 Yêu cầu thông thường kit phát triển vi điều khiển 2.2 Sơ lược vi điều khiển PIC 16F887 .8 2.2.1 Giới thiệu PIC .8 2.2.2 Cấu trúc phần cứng 2.2.3 Sơ đồ chân chức chân .10 2.3 Tổ chức nhớ .16 2.3.1 Bộ nhớ chương trình 16 2.3.2 Bộ nhớ liệu 17 2.4 I/O port 19 2.5 ADC 21 2.6 Ngắt 23 CHƯƠNG 3- THIẾT KẾ 26 3.1 Vấn đề thiết kế 26 3.2 Sơ đồ khối kit thí nghiệm (The Sun) 26 3.3 Thiết kế khối .27 3.3.1 Module 1: Digital output – LED đơn trực tiếp 27 3.3.2 Module 2: Điều khiển IC số - LED đơn gián tiếp 29 3.3.3 Module 3: Điều khiển quét led đoạn 30 3.3.4 Module 4: LCD .31 vi 3.3.5 Module 5: Digital input - Nút nhấn đơn .33 3.3.6 Module 6: ADC .34 3.3.7 Module 7: Counter đếm xung ngoại 34 3.3.8 Module 8: Điều khiển tải công suất .35 3.3.9 Module 9: Điều khiển băm xung PWM 36 3.3.10 Module 10: Mạch nạp 37 CHƯƠNG - THI CÔNG 39 4.1 Thi công board 39 4.2 Xây dựng thí nghiệm mẫu cho kit 48 4.2.1 Bài thí nghiệm 1: Làm quen với kit thí nghiệm chương trình hỗ trợ 48 4.2.2 Bài thí nghiệm 2: Digital output 52 4.2.3 Bài thí nghiệm 3: Digital input .53 4.2.4 Bài thí nghiệm 4: Dùng chân digital output để điều khiển relay 54 4.2.5 Bài thí nghiệm 5: Dùng chân digital để điều khiển IC số .56 4.2.6 Bài thí nghiệm 6: Điều khiển LED đoạn 59 4.2.7 Bài thí nghiệm 7: Điều khiển LCD .60 4.2.8 Bài thí nghiệm 8: Chuyển đổi ADC 62 4.2.9 Bài thí nghiệm 9: Xung PWM 64 4.2.10 Bài thí nghiệm 10: Đếm xung ngoại - Counter 65 4.2.11 Bài thí nghiệm 11: Đếm xung nội ngắt - Timer .67 CHƯƠNG - KẾT QUẢ NGHIÊN CỨU 69 5.1 Những kết đạt 69 5.2 Những kết chưa đạt 69 CHƯƠNG - KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 70 6.1 Kết luận 70 6.2 Hướng phát triển .70 TÀI LIỆU THAM KHẢO 71 vii ` output_low(pin_d0);output_high(pin_d1); output_low(pin_d1); output_high(pin_d0);output_high(pin_d1); output_low(pin_d1); output_low(pin_d0);output_high(pin_d1); output_low(pin_d1); output_high(pin_d0);output_high(pin_d1); output_low(pin_d1); output_low(pin_d0);output_high(pin_d1); output_low(pin_d1); output_high(pin_d2); output_low(pin_d2); delay_ms(500); } } Chú ý: Bạn viết riêng thành chương trình xuất liệu IC dịch để gọi sử dụng Chương trình minh họa: #include #fuses nowdt, noput, hs, noprotect #use delay(clock =20M) void xuat1byte( unsigned int8 dl) { unsigned int8 n; for(n=0x80;n!=0;n>>=1) { if(n&dl) output_high(pin_d0); else output_low(pin_d0); output_high(pin_d1);output_low(pin_d1); } } void main() { set_tris_d(0x00); output_d(0x00); output_low(pin_d3); while(true) { xuat1byte(0x55);xuat1byte(0x55); output_high(pin_d2); output_low(pin_d2); delay_ms(500); xuat1byte(0xaa);xuat1byte(0xaa); output_high(pin_d2); output_low(pin_d2); delay_ms(500); } } 58 ` 4.2.6 Bài thí nghiệm 6: Điều khiển LED đoạn Đầu tiên, bạn xem qua sơ đồ nguyên lý có module: Để điều khiển đoạn LED sáng, đầu tiên, ta phải kích transistor tương ứng dẫn để cấp nguồn cho LED, sau đó, ta việc output mức chân tương ứng, đây, ta sử dụng port D để điều khiển đoạn LED Ví dụ ta muốn LED thứ sáng số 5, việc gọi hàm sau đây: output_low(pin_a0); output_d(0x92); Chương trình minh họa: #include #fuses nowdt, noput, hs, noprotect #use delay(clock =20M) void main() { set_tris_d(0x00); set_tris_a(0xf0); output_low(pin_a0); output_d(0x92); } Tiếp theo, ta làm cho nhiều LED sáng, LED hiển thị số khác Đầu tiên, ta xuất liệu LED thứ nhất, kích mức thấp chân RA0 để LED thứ sáng Sau đó, ta đợi khoảng thời gian nhỏ, 1ms, ta lại tắt LED thứ cách cho chân RA0 lên mức cao, tiếp theo, ta xuất liệu LED thứ port D, hạ chân RA1 xuống mức để LED thứ sáng, lại đợi khoảng thời gian nhỏm 1ms, tiếp tục cho LED cịn lại Chương trình sau làm LED đoạn số 1357 Chương trình minh họa: #include #fuses nowdt, noput, hs, noprotect #use delay(clock =20M) const unsigned int8 m7d[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; void main() { set_tris_d(0x00); set_tris_a(0xf0); output_high(pin_a0); output_high(pin_a1); 59 ` output_high(pin_a2); output_high(pin_a3); while(true) { output_d(m7d[1]); output_low(pin_a0); delay_ms(1); output_high(pin_a0); output_d(m7d[3]); output_low(pin_a1); delay_ms(1); output_high(pin_a1); output_d(m7d[5]); output_low(pin_a2); delay_ms(1); output_high(pin_a2); output_d(m7d[7]); output_low(pin_a3); delay_ms(1); output_high(pin_a3); } } 4.2.7 Bài thí nghiệm 7: Điều khiển LCD Đầu tiên, xem qua sơ đồ nguyên lý: Để điều khiển LCD, cần nhớ bước sau: Đưa tín hiệu vào chân R/W để chọn chế độ read hay write, đây, chân R/W LCD nối đất, mặc định truyền lệnh ghi liệu vào LCD Đưa tín hiệu vào chân RS để chọn loại tín hiệu ta truyền vào LCD lệnh hay liệu Nếu muốn LCD thực tác vụ thiết lập khởi tạo, xóa hình, thay đổi vị trí trỏ,… lệnh chân RS phải mức thấp Ngược lại, muốn ghi liệu LCD loại tín hiệu liệu chân RS mức cao Xuất liệu chân từ D0 tới D7 LCD Cuối cùng, kích xung vào chân E LCD để LCD bắt đầu xử lý Đoạn chương trình sau mơ tả viết hàm đưa lệnh cho LCD xuất liệu LCD: 60 ` #define RS Pin_B4 #define E Pin_B5 void lcd_command( unsigned int8 dl) { output_low(RS); output_d(dl); output_high(e); output_low(e); delay_ms(5); } void lcd_data( unsigned int8 dl) { output_high(RS); output_d(dl); output_high(e); output_low(e); delay_ms(5); } Khi điều khiển, xuất liệu LCD mà phải qua số bước khởi tạo sau: Gửi lệnh 0x38: Thiết lập LCD chạy chế độ bit, cho LCD hiển thị hàng, kích thước kí tự 5x7 Gửi lệnh 0x0c: Bật hiển thị, tắt trỏ Gửi lệnh 0x06: Con trỏ tự động dịch phải Gửi lệnh 0x01: Xóa hình Ngồi ra, ta cịn gửi lệnh 0x80 + x để dịch trỏ tới vị trí thứ x hàng 1, 0xc0 + x để dịch trỏ tới vị trí thứ x hàng Vì LCD khởi động chậm vi điều khiển, nên lệnh 0x38 thường gọi lần, để bảo đảm lần gọi thứ lúc LCD sẵn sàng Thời gian delay cho lệnh theo datesheet LCD Chương trình minh hoa: #include #fuses nowdt, noput, hs, noprotect #use delay(clock =20M) #define RS Pin_B4 #define E Pin_B5 void lcd_command( unsigned int8 dl) { output_low(RS); output_d(dl); output_high(e); 61 ` output_low(e); delay_ms(1); } void lcd_data( unsigned int8 dl) { output_high(RS); output_d(dl); output_high(e); output_low(e); delay_ms(1); } void setup_lcd() { lcd_command( 0x38); delay_ms(5); lcd_command( 0x38); delay_ms(5); lcd_command( 0x0c); lcd_command( 0x06); lcd_command( 0x01); delay_ms(2); } void main() { set_tris_d(0x00); set_tris_b(0x0f); setup_lcd(); lcd_command( 0x80); lcd_data("kit the sun"); lcd_command( 0xc0); lcd_data("test lcd"); while(true) { } } 4.2.8 Bài thí nghiệm 8: Chuyển đổi ADC Để cho phép đo xác, sử dụng độ phân giải tối đa PIC 16F887 10 bit: #device adc =10 Lựa chọn tần số chuyển đổi cho ADC, có lựa chọn qua chia 2, 8, 32 dùng xung nội: setup_adc(adc_clock_div_32); 62 ` Khai báo kênh ADC số 4, ứng với chân RA5 kết nối với LM35 ĐIện áp tham chiếu Vss Vdd: setup_adc_ports(san4|vss_vdd); Lựa chọn kênh ADC chuyển đổi: set_adc_channel(4); Sau đọc kết quả: kq= read_adc(); Nếu muốn đo nhiều kênh lúc, phải set lại ADC channel nhiều lần, sau đọc kết kênh Chú ý kết trả giá trị ADC chuyển đổi được, nghĩa số step đo được, muốn chuyển sang điện áp, ta phải nhân với độ lớn step (step size) SS = (Vref+ - Vref-)/1023 Chương trình minh họa: #include #device adc =10 #fuses nowdt, noput, hs, noprotect #use delay(clock =20M) #define RS Pin_B4 #define E Pin_B5 void lcd_command( unsigned int8 dl) { output_low(RS); output_d(dl); output_high(e); output_low(e); delay_ms(1); } void lcd_data( unsigned int8 dl) { output_high(RS); output_d(dl); output_high(e); output_low(e); delay_ms(1); } void setup_lcd() { lcd_command( 0x38); delay_ms(5); lcd_command( 0x38); delay_ms(5); lcd_command( 0x0c); lcd_command( 0x06); lcd_command( 0x01); delay_ms(2); 63 ` } void main() { unsigned int16 kq,tb; unsigned int8 i; set_tris_d(0x00); set_tris_b(0xff); set_tris_a(0xf0); output_high(pin_a0); output_high(pin_a1); output_high(pin_a2); output_high(pin_a3); setup_adc(adc_clock_div_32); setup_adc_ports(san4|vss_vdd); set_adc_channel(4); setup_lcd(); while(true) { delay_ms(1000); for (i=0;i