1. Trang chủ
  2. » Luận Văn - Báo Cáo

Đồ án đo tốc độ vật cản

31 24 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 31
Dung lượng 723,71 KB

Nội dung

MỤC LỤC LỜI MỞ ĐẦU CHƯƠNG CƠ SỞ LÝ THUYẾT .3 1.1 Tổng quan vi điều khiển pic16F877A 1.1.1 Sơ đồ chân 1.1 Các thông số pic16F877A .3 1.1.3 Cổng xuất nhập (I/O port) .5 1.4 Timer 1.2 LCD 16x2 12 1.2.1 Hình dạng kích thước .12 1.2.2 Chức chân 13 1.2.3 Các ghi 14 CHƯƠNG THIẾT KẾ BỘ ĐO VẬN TỐC TRUNG BÌNH 23 2.1 Yêu cầu 23 2.2 Thiết kế phần cứng 23 2.2.1 Sơ đồ khối sơ đồ nguyên lý .23 2.2.2 Khối cảm biến 23 2.2.3 Khối điều khiển trung tâm 23 2.3 Thiết kế phần mềm .23 2.3.1 Lưu đồ thuất toán 23 2.3.2 Mã nguồn chương trình 23 2.3.1 Kết mô 23 CHƯƠNG CHẾ TẠO VÀ THỬ NGHIỆM .23 3.1 Vẽ mạch in 23 3.2 Thử nghiệm 23 KẾT LUẬN TÀI LIỆU THAM KHẢO .1 PHỤ LỤC 1 LỜI MỞ ĐẦU Ngày với phát triển ngành khoa hoc kỹ thuật, mà kỹ thuật Điện tử đóng vai trò quan trọng lĩnh vực khoa học kỹ thuật, quản lý, cơng nghiệp tự động hóa, thơng tin liên lạc… phải nắm bắt vận dụng cách có hiệu nhằm góp phần vào phát triển khoa học kỹ thuật giới nói chung khoa học kỹ thuật điện tử nói riêng Xuất phát từ nhu cầu thực tế doanh nghiệp việc đo vận tốc cần thiết thiết bị xe máy, ô tô, tàu hỏa, tàu thủy, máy bay… Từ thực tế góp phần giúp người vận hành có thêm chút thơng tin quan trọng phương tiện Do em chọn đề tài: Thiết kế, chế tạo thị thời gian chạy cử li ngắn sở vi điều khiển PIC16F877A Mặc dù em cố gắng để hoàn thành đồ án này, thời gian làm đồ án hạn chế nên không tránh khỏi thiếu sót chưa đạt kết mong đợi Kính mong thầy bạn giúp em hoàn thiện đồ án Xin chân thành cảm ơn TH.S Tạ Hùng Cường tận tình hướng dẫn, giúp đỡ em suốt thời gian làm đồ án Em xin chân thành cảm ơn! Sinh viên thực Nguyễn Công Bằng-Nguyễn Thị Tân CHƯƠNG : CƠ SỞ LÝ THUYẾT 1.1 Tổng quan vi điều khiển 16F877A 1.1.1.Sơ đồ chân Hình 1.1 Ảnh thực tế PIC16F877A Hình 1.2 Sơ đồ chân PIC16F877A 1.1.2 Các thông số PIC 16F877A PIC tên viết tắt “ Programmable Intelligent computer” hãng General Instrument đặt tên cho vi điều khiển họ Hãng Micrchip tiếp tục phát triển sản phầm hàng tạo gần 100 loại sản phẩm khác nhauPIC16F887A dòng PIC phổ biến, đầy đủ tính phục vụ cho hầu hết tất ứng dụng thực tế Đây dòng PIC dễ cho người làm quen với PIC học tập tạo tản họ vi điều khiển PIC Cấu trúc tổng quát PIC16F877A sau : - 8K Flash Rom - 368 bytes Ram - 256 bytes EFPROM - port vào với tín hiệu điều khiển độc lập - định thời Timer0 Timer2 bit - định thời Timer1 16 bit hoạt động chế độ tiết kiệm lượng với nguồn xung clock ngồi - Capture/ Compare/ PWM - biến đổi Analog -> Digital 10 bit, ngõ vào - so sánh tương tự - định thời giám sát (Watch Dog Timer) - cổng song song bit với tín hiệu điều khiển - cổng nối tiếp - 15 nguồn ngắt Hình 1.3 Sơ đồ khối vi điều khiển 16F877A 1.1.3 Cổng xuất nhập (I/O port) - Cổng xuất nhập (I/O port) phương tiện mà vi điều khiển dùng để tương tác với giới bên Sự tương tác đa dạng thơng qua q trình tương tác đó, chức vi điều khiển thể cách rõ ràng - Một cổng xuất nhập vi điều khiển bao gồm nhiều chân (I/O pin), tùy theo cách bố trí chức vi điều khiển mà số lượng cổng xuất nhập số lượng chân cổng khác - Bên cạnh đó, vi điều khiển tích hợp sẵn bên đặc tính giao tiếp ngoại vi nên bên cạnh chức cổng xuất nhập thông thường, số chân xuất nhập có thêm chức khác để thể tác động đặc tính ngoại vi nêu giới bên Chức chân xuất nhập cổng hồn tồn xác lập điều khiển thông qua ghi SFR liên quan đến chân xuất nhập - Vi điều khiển PIC16F877A có cổng xuất nhập, bao gồm PORTA, PORTB, PORTC, PORTD PORTE - Cấu trúc chức cổng xuất nhập đề cập cụ thể phần sau * PORTA : - PORTA(RPA) bao gồm I/O pin Đây chân “hai chiều” (bidirectional pin), nghĩa xuất nhập - Chức I/O điều khiển ghi TRISA (địa 85h) Muốn xác lập chức chân PORTA input, ta “set” bit điều khiển tương ứng với chân ghi TRISA ngược lại, muốn xác lập chức chân PORTA output, ta “clear” bit điều khiển tương ứng với chân ghi TRISA - Thao tác hoàn toàn tương tự PORT ghi điều khiển tương ứng TRIS (đối với PORTA TRISA, - PORTB TRISB, PORTC TRISC, PORTD TRISD vàđối với PORTE TRISE) - Các ghi SFR liên quan đến PORTA bao gồm: PORTA (địa 05h) : chứa giá trị pin PORTA TRISA (địa 85h): điều khiển xuất nhập CMCON (địa 9Ch): ghi điều khiển so sánh CVRCON (địa 9Dh) : ghi điều khiển so sánh điện áp ADCON1 (địa 9Fh) : ghi điều khiển ADC * PORTB - PORTB (RPB) gồm pin I/O Thanh ghi điều khiển xuất nhập tương ứng TRISB Bên cạnh số chân PORTB sử dụng q trình nạp chương trình cho vi điều khiển với chế độ nạp khác - PORTB liên quan đến ngắt ngoại vi Timer0 PORTB tích hợp chức điện trở kéo lên điều khiển chương trình Các ghi SFR liên quan đến PORTB bao gồm: PORTB (địa 06h,106h) : chứa giá trị pin PORTB TRISB (địa 86h,186h) : điều khiển xuất nhập OPTION_REG (địa 81h,181h) : điều khiển ngắt ngoại vi Timer0 *PORTC - PORTC (RPC) gồm pin I/O Thanh ghi điều khiển xuất nhập tương ứng TRISC Bên cạnh PORTC chứa chân chức so sánh, Timer1, PWM chuẩn giao tiếp nối tiếp I2C, SPI, SSP, USART - Các ghi điều khiển liên quan đến PORTC: PORTC (địa 07h): chứa giá trị pin PORTC TRISC (địa 87h): điều khiển xuất nhập * PORTD - PORTD (RPD) gồm chân I/O, ghi điều khiển xuất nhập tương ứng TRISD PORTD cổng xuất liệu chuẩn giao tiếp PSP (Parallel Slave Port) - Các ghi liên quan đến PORTD bao gồm: Thanh ghi PORTD: chứa giá trị pin PORTD + Thanh ghi TRISD : điều khiển xuất nhập + Thanh ghi TRISE : điều khiển xuất nhập PORTE chuẩn giao tiếp PSP * PORTE - PORTE (RPE) gồm chân I/O Thanh ghi điều khiển xuất nhập tương ứng TRISE Các chân PORTE có ngõ vào analog Bên cạnh PORTE chân điều khiển chuẩn giao tiếp PSP + Các ghi liên quan đến PORTE bao gồm: PORTE : chứa giá trị chân PORTE TRISE: điều khiển xuất nhập xác lập thông số cho chuẩn giao tiếp PSP + ADCON1 : ghi điều khiển khối ADC 1.1.4 Timer * TIMER - Đây ba đếm định thời vi điều khiển PIC16F877A - Timer0 đếm bit kết nối với chia tần số (prescaler) bit Cấu trúc Timer0 cho phép ta lựa chọn xung clock tác động cạnh tích cực xung clock - Ngắt Timer0 xuất Timer0 bị tràn Bit TMR0IE (INTCON) bit điều khiển Timer0 TMR0IE=1 cho phép ngắt Timer0 tác động, TMR0IF= không cho phép ngắt Timer0 tác động Sơ đồ khối Timer0 sau Hình 1.4 Sơ đồ khối timer0 - Muốn Timer0 hoạt động chế độ Timer ta clear bit TOSC (OPTION_REG), giá trị ghi TMR0 tăng theo chu kì xung đồng hồ (tần số vào Timer0 ¼ tần số oscillator) Khi giá trị ghi TMR0 từ FFh trở 00h, ngắt Timer0 xuất - Thanh ghi TMR0 cho phép ghi xóa giúp ta ấn định thời điểm ngắt Timer0 xuất cách linh động - Muốn Timer0 hoạt động chế độ counter ta set bit TOSC (OPTION_REG) Khi xung tác động lên đếm lấy từ chân RA4/TOCK1 Bit TOSE (OPTION_REG) cho phép lựa chọn cạnh tác động vào bột đếm Cạnh tác động cạnh lên TOSE=0 cạnh tác động cạnh xuống TOSE=1 - Khi ghi TMR0 bị tràn, bit TMR0IF (INTCON) set Đây cờ ngắt Timer0 Cờ ngắt phải xóa chương trình trước đếm bắt đầu thực lại q trình đếm Ngắt Timer0 khơng thể “đánh thức” vi điều khiển từ chế độ sleep Bộ chia tần số (prescaler) chia sẻ Timer0 WDT (Watchdog Timer) Điều có nghĩa prescaler sử dụng cho Timer0 WDT khơng có hỗ trợ prescaler ngược lại Prescaler điều khiển ghi OPTION_REG Bit PSA (OPTION_REG) xác định đối tượng tác động prescaler Các bit PS2:PS0 (OPTION_REG) xác định tỉ số chia tần số prescaler Xem lại ghi OPTION_REG để xác định lại cách chi tiết bit điều khiển Các lệnh tác động lên giá trị ghi TMR0 xóa chế độ hoạt động prescaler - Khi đối tượng tác động Timer0, tác động lên giá trị ghi TMR0 xóa prescaler khơng làm thay đổi đối tượng tác động prescaler - Khi đối tượng tác động WDT, lệnh CLRWDT xóa prescaler, đồng thời prescaler ngưng tác vụ hỗ trợ cho WDT Các ghi điều khiển liên quan đến Timer0 bao gồm: TMR0 (địa 01h, 101h): chứa giá trị đếm Timer0 - INTCON (địa 0Bh, 8Bh, 10Bh, 18Bh): cho phép ngắt hoạt động (GIE PEIE) OPTION_REG (địa 81h, 181h): điều khiển prescaler *TIMER - Timer1 định thời 16 bit, giá trị Timer1 lưu hai ghi (TMR1H:TMR1L) Cờ ngắt Timer1 bit TMR1IF (PIR1) Bit điều khiển Timer1 TMR1IE (PIE) - Tương tự Timer0, Timer1 có hai chế độ hoạt động: chế độ định thời (timer) với xung kích xung clock oscillator (tần số timer ¼ tần số oscillator) chế độ đếm (counter) với xung kích xung phản ánh kiện cần đếm lấy từ bên ngồi thơng qua chân RC0/T1OSO/T1CKI (cạnh tác động cạnh lên) - Việc lựa chọn xung tác động (tương ứng với việc lựa chọn chế độ hoạt động timer hay counter) điều khiển bit TMR1CS (T1CON) Sơ đồ khối Timer1: Hình 1.5 Sơ đồ khối Timer1 Ngồi Timer1 có chức reset input bên điều khiển hai khối CCP (Capture/Compare/PWM) Khi bit T1OSCEN T1CON) set, Timer1 lấy xung clock từ hai chân C1/T1OSI/CCP2 RC0/T1OSO/T1CKI làm xung đếm Timer1 bắt đầu đếm sau cạnh xuống xung ngõ vào Khi PORTC bỏ qua tác động hai bit TRISC PORTC gán giá trị Khi clear bit T1OSCEN Timer1 lấy xung đếm từ oscillator từ chân RC0/T1OSO/T1CKI Timer1 có hai chế độ đếm đồng (Synchronous) bất đồng (Asynchronous) Chế độ đếm định bit điều khiển (T1CON) Khi =1 xung đếm lấy từ bên ngồi khơng đồng hóa với xung clock bên trong, Timer1 tiếp tục trình đếm vi điều khiển chế độ sleep ngắt Timer1 tạo bị tràn có khả “đánh thức” vi điều khiển Ở chế độ đếm bất đồng bộ, Timer1 sử dụng để làm nguồn xung clock cho khối CCP (Capture/Compare/Pulse width modulation) Khi = xung đếm vào Timer1 đồng hóa với xung clock bên Ở chế độ Timer1 không hoạt động vi điều khiển chế độ sleep Các ghi liên quan đến Timer1 bao 10 Sơ đồ khối : Khối nguồn Khối cảm biến Khối điều khiển Khối hiển thị LCD vi Hình 2.1 sơ đồ khối mạch Sơ đồ nguyên lý: Hình 2.2 mạch nguyên lý 2.2.2 Khối cảm biến Khối cảm biến có chức xác định thời điểm vật qua cảm biến để kích hoạt time1 bắt đầu đếm thời điểm vật qua cảm biến thứ để dừng time1 đếm đế 17 đưa thời gian t Trong đề tài để việc mô thực mạch thật ta dùng phím bấm start phím stop giống cám biến Hình 2.3 mạch nguyên lý 2.2.3 Khối điều khiển dùng PIC16F877A Khối điều khiển có nhiệm vụ Tính vận tốc trung binh vật vật qua cảm biến cách, dungmột cảm biến đế kích hoạt timer-1 đếm cảm biến lại để dừng timer-1 đưa thời gian vật qua cảm biến Vận tốc tính theo cơng thức: Vtb = S/t Với: s la khoảng cách cảm biến T khoảng thời gian vật quan - Điều khiển đọc, ghi LCD để hiển thị kết tính tốn đề mục đồ án 18 Hình 2.3 Khối xử lý trung tâm 2.2.4 Khối hiển thị LCD Khối có nhiệm vụ hiển thi cách trực quan giá trị tính tốn vận tốc trung bình vật Các đề mục mà sinh viên muốn thể lên : họ tên, nhóm đồ án, GVHD Hình 2.4 khối hiển thị LCD 19 2.3 Thiết kế phần mềm 2.3.1 Lưu đồ thuật tốn Bắt đầu timer đếm thời gian Ngắt ngồi INT1 Ưu tiên ngắt sườn Hiển thị đề mục Chờ ngắt DEM=DEM+1 Hiển thị Ngắt 1111 sai Đúng Cho timer chạy Đếm thời gian Ngắt ngồi sai Đúng Dừng đếm time1 Tính vận tốc trung bình 20 2.3.2 Mã nguồn chương trình [Phụ lục] 2.3.3 kết mô Qua mô ta nhân thấy mã nguồn phù hợp với phần cứng, thực yêu cầu đề toán đặt Ghi lại giá trị điện áp mô điểm nút cần thiết để kiểm tra làm mạch thật Hình 2.6 Kết mơ 21 CHƯƠNG 3: CHẾ TẠO VÀ THỬ NGHIỆM 3.1 chế tạo 3.1.1 Vẽ mạch in Mạch nguyên lý vẽ lại dxp để vẽ mạch in Mạch phải với thực tế ý chân nguồn cung cấp dxp khơng định nghĩa chân nguồn cho linh kiên Hình 3.1 mạch nguyên lý 22 Mạch in Hình 3.2.Mạch in dxp Hình 3.3 Mạch in dạng PDF 23 3.1.2 Làm mạch in 3.1.3 hàn linh kiên lên bo mạch 3.2 Thử nghiệm kiểm tra trước gắn Pic16F877A LCD lên bo mạch, việc kiếm tra mạch trước gắn linh kiện vào nhằm mục đích: kiểm tra mạch in lam thủ cơng có bị lỗi không, hạn chế việc cáp sai nguồn cho linh kiên LCD hay PIC… Kiểm tra chân nguồn pic: - Chân 11 32 : V - Chân 12 31 : V Kiểm tra chân nguồn LCD : - Chân 16 : V - Chân 15 : V - Chân điều chỉnh điện áp biến thiên từ 0V -> 5V 24 KẾT LUẬN Hoàn thành đồ án em hiểu kiến thức cấu trúc phần cứng, nguyên tắc hoạt động vi điều khiển PIC16F877A Cũng cách lập trình cho vi điều khiển phân mêm ccs1.4 Hiểu rõ quy trình thiết kế chế tạo mạch điện tử cách thủ công Giúp em cảm thấy u thích ngành học cố gắng làm lớn thiết thực để áp dụng vào sống Đồ án em hoàn thành đề tài : Thiết kế, chế tạo thị thời gian chạy cử li ngắn sở vi điều khiển PIC16F877A Tuy nhiên đề tài số vấn đề chưa đạt như: mạch chưa thực ổn định, độ xác chưa đạt thời gian thực, thực phím bấm chưa gắn cảm biến thực để xác định thời điểm vât qua cảm biến khơng nhạy… Hướng phát triển đồ án náy tương lai dùng cảm biến để thuận tiện cho việc lắp đăt thay phím bấm dùng song để xác định vận tốc không cần vật qua cảm biến, tính tốn xung clock cho thời gian với thời gian thực … 25 Tài liệu tham khảo [1] Trang web http://www.picvietnam.com/forum//showthread.php?t=357 [2] Microchip Datasheet 16F877A [3] Nguyễn Văn tình, Tài liệu vi điều khiển pic 16F877A , Trường sĩ quan CHKT thông tin , 2008 [4] Trần Xuân Trường, Tài liệu hướng dẫn css tiếng việt, SV K2001 , Đại học bách khoa Hồ Chí Minh 26 Phụ luc Mã nguồn chương trình: Chuong trinh chinh : #include /// chương trinh định nghĩa chân cho pic #include #include #include ///file driver LCD /// quang duong di S duoc cho ban dau unsigned int16 S = ; /// thoi gian di duoc tren quang duong S cho san unsigned int16 t = ; /// Van toc cua vat the tren quang duong S /// V = S/T /// V la so thuc /// ket qua duoc lam tron chu so float V = ; unsigned int8 d1 = 0; unsigned int8 d2 = 0; unsigned int8 d3 = 0; /// chuong trinh ngat Timer1 /// dung de tao thoi gian chinh xac theo hang giay #INT_TIMER1 void irs_timer1(){ unsigned int8 i; set_timer1(3035); if(i++ == 2) { t = t + 1; V = (float)S/t; i = 0; } } void main(){ PORTD = 0x00; TRISB = 0b00000011; TRISD = 0X00; 27 lcd_init(); setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_8); set_timer1(3035); /// cach tinh gia tri timer1 /// 65535 - 3035 = 62500 /// 62500 x = 1250000 /// 125000 x x 10^-6 = 1s /// hien thi loi chao ban dau sprintf(buff_lcd, " GV HUONG DAN "); string_lcd(buff_lcd,1,0); sprintf(buff_lcd, " LE VAN CHUONG "); string_lcd(buff_lcd,2,0); delay_ms(500); sprintf(buff_lcd, " LE DUC THANG "); string_lcd(buff_lcd,1,0); sprintf(buff_lcd, " KINGKHAM "); string_lcd(buff_lcd,2,0); delay_ms(500); sprintf(buff_lcd, " CHUONG TRINH "); string_lcd(buff_lcd,1,0); sprintf(buff_lcd, " DO VAN TOC "); string_lcd(buff_lcd,2,0); delay_ms(500); /// cho phep ngat toan cuc enable_interrupts(GLOBAL); while(1){ /// neu nut star duoc nhan /// thi set cac gia tri thoi gian (T) - van toc (V) ve /// kich hoat ngat timer1 de PIC bat dau dem thoi gian if(!start){ T = 0; V = 0; 28 enable_interrupts(INT_TIMER1); } /// neu nut stop duoc nhan /// tat qua timer1 lay gia tri dem duoc if(!stop) { disable_interrupts(INT_TIMER1); } /// hien thi ket qua LCD sprintf(buff_lcd, "S=%d(m) - T=%d(s)" ,(unsigned int8)S,(unsigned int8)T ); string_lcd(buff_lcd,1,0); sprintf(buff_lcd, " V=%f(m/s) " ,(float)V ); string_lcd(buff_lcd,2,0); } } Chuong trinh định nghĩa chân cho pic: #include #include #device adc=10 #FUSES NOWDT //No Watch Dog Timer #FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD) #FUSES PUT #FUSES NOCPD #FUSES NODEBUG #FUSES NOPROTECT #FUSES NOBROWNOUT //No brownout reset #FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O #use delay(clock=4Mhz) #bit start = PORTB.0 #bit stop = PORTB.1 29 Chương trinh cho LCD //// cac chan dien khien cho LCD #bit rs = PORTD.0 #bit rw = PORTD.1 #bit en = PORTD.2 //// cac chan data d4-d7 cho LCD #bit d4lcd = PORTD.4 #bit d5lcd = PORTD.5 #bit d6lcd = PORTD.6 #bit d7lcd = PORTD.7 #define lcd #define seg #define lcd_cmd #define lcd_da #define clear_lcd write_lcd(0x01,lcd_cmd); // lenh xoa hien thi tren lcd char buff_lcd[64]; void triger_lcd(){ en = 1; delay_ms(3); en = 0; delay_ms(3); } void send_nibble (char data_lcd,int1 mode){ d4lcd = data_lcd&0x01?1:0; // data_port la 8bit nen ket qua sau tinh toan cung la 8bit d5lcd = data_lcd&0x02?1:0; // vi vay dung phep ?0:1 d6lcd = data_lcd&0x04?1:0; d7lcd = data_lcd&0x08?1:0; if(mode) triger_lcd(); /////0000 } // add potd : neu pin control va pin data cung chung port // note pin control co the bi ep gia tri &0x0f hoac &0xf0 /// chuong trinh gui lenh/ data len LCD /// ung voi gia tri cua mode la hoac se ung voi gui lenh hoac data len lcd /// PIC giao tiep coi LCD duoi dang 4bit nen data se duoc truyen lan /// mot lan truyen bit /// do truyen lan se duoc bit void write_lcd(char data_lcd, int1 mode){ rw=0; rs = mode; 30 send_nibble((data_lcd >> 4) & 0x0f,lcd); send_nibble(data_lcd & 0x0f ,lcd); } /// chuogn trinh thiet lay vi tri hien thi data tren line cua LCD /// line : bat dau tu 0x80 /// line : bat dau tu 0xc0 void lcd_gotoxy(unsigned int8 x, unsigned int8 y){ if(x==1) write_lcd(0x80+y,lcd_cmd); if(x==2) write_lcd(0xc0+y,lcd_cmd); } /// chuong trinh hien thi data len LCD /// Data bien c[] se duoc xuat len tren vi tri x , y tuong ung void string_lcd( char c[] , unsigned int8 x,unsigned int8 y){ unsigned int8 i; lcd_gotoxy(x,y); for(i=0;i

Ngày đăng: 22/02/2020, 14:35

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN

w