Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 19 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
19
Dung lượng
1,28 MB
Nội dung
TRƯỜNG ĐẠI HỌC NHA TRANG KHOA CƠ KHÍ THỰC HÀNH ỨNG DỤNG VI ĐIỀU KHIỂN Nội dung: Học phần cung cấp cho người học:nguyên lý hoạt động chung vi điều khiển, chức mô đun để học viên biết cách thức điều khiển khối chức năng, giao tiếp chúng với với hệ thống chấp hành Kết quả: Sinh viên sử dụng bo điều khiển Atmega32 để điều khiển đèn LED, khởi động động DC Phổ biến nội quy học: thời gian học, cách đánh giá, chia nhóm (3-4 sv) Yêu cầu học: viết báo cáo(xác định chân cho led, điện trở, cách sử dụng mạch nạp) Chuẩn bị: Linh kiện làm mạch VĐK, DC có Encoder, LED 7D, LCD 16x2, LM 35 BÀI 1: HOÀN THÀNH PHẦN CỨNG CỦA MẠCH VDK Nội dung: Làm mạch VĐK, mạch LCD 1.1 STT 10 11 12 13 14 15 1.2 Linh kiện làm mạch VĐK Chức Điều khiển led, nút nhấn,… Ổn áp nguồn dương 5v DC 1000uF/16v, 1000uF/25v Lọc xung tần số thấp 1K Hạn dòng 104 : conTụ pi 18 : Lọc xung tần số cao Tạo xung cho VDK Chống ngược dòng chân : Đưa tín hiệu vào cho VDK Phát quang Cấp nguồn cho VDK chân, chân Nối dây cắm 40 chân Bảo vệ Atmega Cách ly mạch với đất Nạp chương trình cho Atmega Pin 8: dây Kết nối tín hiệu vào Tên linh kiện Atmega16 7805 Tụ hóa Điện trở Tụ khơng phân cực Thạch anh Diode Nút nhấn nhỏ Led Cổng nguồn Hàng rào Đế cắm IC Ốc vít Mạch nạp Dây cắm Hồn thành mạch vi điều khiển Sử dụng sơ đồ nguyên lí, sơ đồ khối để lắp linh kiện lên mạch Hướng dẫn làm mạch LCD Trình tự làm mạch: - Mua linh kiện - Chà mạch in - Cố định tờ giấy với mạch in - Cắm bàn là, để số 3/5 Max - Ủi mạch in khoảng phút - Gỡ giấy khỏi mạch - Dùng bút tô lại chỗ bị đứt mạch in - Ngâm hóa chất - Sau ăn mịn hết, rửa lại với nước - Pha nhựa thông với xăng thơm - Quét dung dịch pha để bảo vệ mạch phơi khơ để chống oxy hóa - Khoan mạch - Kiểm tra mạch có bị chập không - Lắp hàn linh kiện - Kiểm tra mạch có bị chập khơng - Kiểm tra chiều linh kiện - Kiểm tra nguồn cấp - Cắm điện vào mạch lần (Khoảng giây) - Cắm điện vào mạch lần (Khoảng 10 giây) - Cắm điện vào mạch lần (Khoảng phút) - Kiểm tra nguồn 7805 - Lắp VĐK cắm điện - Nạp chương trình - Chạy thử USB nạp: - sợ dây cắm đầu(1 đực; cái); - nguồn cắm usb Cách nối dây: - Đầu dây đực thứ cắm vào VCC - Đầu dây đực thứ cắm vào RST - Đầu dây đực thứ cắm vào NC - Đầu dây đực thứ cắm vào MOSI - Đầu dây đực thứ cắm vào MISO - Đầu dây đực thứ cắm vào GND - Tất đầu dây cắm vào hàng rào cổng nguồn BÀI 2: KIỂM TRA MẠCH VĐK, CHẠY LED, LED 7D Nội dung: - Nạp chương trình chạy thử led Kết nối LCD, Led đoạn, LM35 2.1 Kiểm tra hoàn chỉnh mạch vi điều khiển - Kiểm tra mạch có bị chập hay khơng ? - Kiểm tra led báo hiệu có sáng hay khơng ? - Kiểm tra điện áp có hay khơng ? - Nối dây từ nút nhấn qua Led xem nút nhấn có hoạt động không? - Đo thông số điện áp đầu vào – có khơng? 2.2 Nạp chương trình chạy thử led Bước 1: Đấu dây cho LED, Atmega16 có PORT (A, B, C, D) Ở chọn PORT D (dùng dây cái) Bước : Cài đặt chương trình viết code nạp chip ( Dùng phần mềm Codevision AVR 3.12 ProgISP ) Các bước để tạo project Cvavr: - Bước 1: File/New/Project Bước 2: Hiện tab/chọn “Yes” Bước 3: Hiện tab/chọn AT90,Atiny,Atmega/chọn “OK” Bước 4: Chọn Atmega (đang dùng Atmega16) Bước 5: Chọn tần số thạch anh (ví dụ 8.0000 MHz) Bước 6: Program/Generate, Save and exit/ lưu file với tên giống Bước 7: Biên dịch để kiểm tra lỗi “Chọn Build the Project”” (No erros, no warning) → OK Bước 8: Viết chương trình file hex vừa tạo Vì muốn lập trình hiệu ứng cho Led nên tín hiệu PORTA tín hiệu (Out), Kích Out từ Bit0 – Bit7 Trong Out cổng A cổng xuất Với số thể mức thấp, số thể mức cao Chọn PORTB PORT lấy tín hiệu đầu vào từ nút nhấn treo trở cho nút nhấn Ví dụ: cách viết chương trình điều khiển LED #include //Khai báo thư viện cho chip #include //Khai báo thư viện trễ void main(void) //Đây chương trình { DDRA = 0xFF; //đóng cơng tắc nối đất PORTD PORTA = 0x00; //mở công tắc treo trở delay_ms(1000); //cho trễ vòng giây PORTA = 0xFF; //đóng cơng tắc treo trở delay_ms(1000); //cho trễ vịng giây } 2.3 Giải thích chương trình LED Trường hợp 1:Thanh ghi DDR mức 0(mức đóng khóa k mức mở khóa k) - Khi PORT mức LED khơng sáng Vì điện LED = 0V - Khi PORT mức LED khơng sáng Vì điện LED khơng thể xác định Trường hợp 2: Thanh ghi DDR mức 1: - Khi PORT mức LED khơng sáng Vì điện LED = 0V Khi PORT mức LED sáng Vì điện bóng đèn = 5V theo cơng thức UAB= |UA- UB| Chú thích: - - - 2.4 Thanh ghi DDRA dùng để xác định tính hiệu vào hay (in hay out) PORTA Như nói trên, dùng để điều khiển led nên cho DDRA=0xFF (hay DDRA=0b11111111) Ở “x” “b” tiền tố định cách viết sau, với “x” ta viết chuỗi số sau dạng thập lục phân, ngược lại với “b” ta viết dạng nhị phân Giá trị out giá trị in Thanh ghi PORTA dùng để xác định trạng thái chân, ghi PORTA==0xFF=0b11111111, với mức áp 0V (tắt) mức 5V (sáng), tùy theo nguyên lí mạch mà mức sáng hay tắt khác Nạp chương trình - Mở phần mềm ProgISP - Chọn chip Atmega16 - Chọn Erase để xóa chương trình cũ - Chọn Load Flash → Mở thư mục lưu chương trình → Vào Debug/Exe → Chọn file chương trình (.hex) - Chạy chương trình (Auto) để nạp code 2.5 Led đoạn Bước 1: Chuẩn bị - Mạch VDK Atmega16 Mạch nạp chíp Một LED đoạn dương chung Trở 330Ohm bóng báo đèn nguồn trở 1kOhm Bước 2: Nối dây Led đoạn gồm có 10 chân hình Trong - chân a,b,c,d,e,f,g,dp tương tự led chân lại chân nguồn ta cần dùng chân Và để xác định chân chân (+) hay (-) cần phải xác định led đoạn chung (+) hay chung (-), từ cấp nguồn tương ứng cho chân Lưu ý - Đối với chân nguồn cần phải thêm vào trở ( chọn 330Ω) để giảm áp qua Led Các chân VĐK phải cắm tương ứng với chân Led đoạn để tiện lập trình Cắm nguồn vào cho LED đoạn( Nhớ có điện trở hạn dịng khơng cháy LED) Cắm chân LED cịn lại vào PORT VDK (Chọn PORTA) theo thứ tự từ a dp tương ứng với PORTA từ Bài tập: - Viết hiển thị số Led đoạn BÀI 3:LẬP TRÌNH LED VÀ SỬ DỤNG LCD Nội dung: - Lập trình hiệu ứng Led - Hiển thị LCD 3.1 Hiệu ứng Led 3.2.LCD Bước 1: Đấu dây cho LCD Chọn PORT để kết nối VDK với LCD Chọn PORTA; Trong PORT ATMEGA16 có chân LCD có cách kết nối: kết nối chân chân Ở chọn cách kết nối chân( Trong chân bỏ chân) Tiếp theo (từ mạch kết nối VDK với LCD) nối dây hình LCD (đúng theo thứ tự từ đến 16) Mạch kết nối VDK với LCD cần phải cấp nguồn 5V Bước 2: Viết chương trình Các bước tạo file hex LED Ở bước chọn xong tần số thạch anh, chọn tiếp Alphanumeric LCD Chọn hình: “chọn Enable/tab hình/chọn PORT (ở dùng PORTA)/Chọn bit (bỏ chân khơng dùng đến ) Cuối làm tiếp bước LED Dùng lcd_ puts (“”) để hiển thị liệu lên LCD, ta cộng thêm 48 để đổi số từ số thập phân sang ký tự số ASCII để truyền lên LCD Text để hiển thị Viết chương trình cho LCD #include //Khai báo thư viện cho chip #include //Tạo thư viện trể #include //tạo thư viện cho LCD Ví dụ { lcd_init(16); lcd_clear(); // xóa hình LCD lcd_gotoxy(0,0); // vị trí dấu nhấp nháy (0,0) lcd_puts("CDT"); // in chữ “CDT” lcd_putchar((z/100)+48); // in số hàng trăm z lcd_putchar((z%100/10)+48); // in số hàng chục z lcd_putchar((z%10)+48); // in số hàng đơn vị z } Nạp code cho LCD chương trình Progisp 1.72 Bài tập: - Viết hiệu ứng chạy led - Viết chương trình hiển thị số chữ lên LCD 10 BÀI 4: ĐO NHIỆT ĐỘ VÀ HIỂN THỊ LÊN LCD Nội dung: - Đo nhiệt độ từ LM 35 - Hiển thị lên LCD Chuẩn bị - LM 35 - Mạch vi điều khiển Thực - Nối PORT cho LCD ( PORT A) Nối dây cho LED Cấp nguồn cho LM 35 (5V) PORTA.* với chân LM35 4.1 Cảm biến LM35 Chân 1:là chân cấp điện áp tham chiếu từ mức(4v đến 30v).Ở LM35 cấp nguồn 5v từ vi điều khiển Chân 2:là chân điện áp Vout Kết nối với chân PORTA vi điều khiển Chân 3:là chân nối đất 4.2 ADC ADC = Vin (28 - 1)/Vref với ADC 8bit ADC = Vin (210 - 1)/Vref với ADC 10bit Cách lấy nhiệt độ từ LM35 qua giao tiếp ADC - ADC 10 Bit = 2^10=1024 Điện áp tham chiếu Vref = 5V = 5000mV LM35 (10 mV / độ C) Vậy 2C 2.048 (ADC) nhiệt độ tăng thêm 1 Xác định nhiệt độ đo qua số đo chân ADC: Ta có: 5000 mV ứng với 1023 (thang đo ADC 10 bít) Vậy : 10 mV ứng với 10 x 1024/5000 = 2,046 (ADC) 11 Con số 2,046 tính lượng thay đổi chân ADC ứng với thay đổi 10mV đầu LM35 hay ứng với thay đổi độ C LM35 => Nhiệt độ đo được: Nhiệt độ = ADC_Read(0) / 2,046 (độ C) + Viết chương trình : Tạo project để viết chương trình hiển thị nhiệt độ LCD Ví dụ: void Nhiet_do(void) { T=(read_adc(0)/2.046 + 2) } Bài tập: Đo nhiệt độ hiển thị LCD 12 BÀI 5: ĐIỀU KHIỂN NÚT NHẤN, TIMER Nội dung: - Điều khiển nút nhấn Timer Chuẩn bị: - Nối dây nút nhấn(Chọn PORT tùy ý) - Nối dây LED(Chọn PORT tùy ý PORT lại) - Ở nối nút nhấn PORTD LED PORTA - Kết nối mạch nạp với máy tính - Chọn T sang P( Pullup, tự giữ) để đóng cơng tắc treo trở Ví dụ: #include #include void main(void) { PORTD.0=1; PORTD.1=1; DDRA=0XFF; while(1) { if(PIND.0==0) { while(1) { PORTA=0X00; delay_ms(1); PORTA=0XFF; delay_ms(19); if(PIND.1==0) break; } } else if(PIND.1==0) { while(1) { PORTA=0X00; delay_ms(19); PORTA=0XFF; delay_ms(1); 13 if(PIND.0==0) break; } } else PORTA=0XFF; } } TIMER Ngắt: Interrupt Khi có tín hiêu ngắt đến xử lý, xử lý dừng hoạt động làm để xử lý ngắt Với chương trình tín hiệu ngắt ưu tiên Ngắt hay sử dụng tính thực tức Có nhiều tín hiệu ngắt AVR Ngắt ngồi, ngắt timer, ngắt SPI, ngắt quy định ưu tiên trước sau datasheet Một tín hiệu ngắt người ta gọi vector ngắt: interrupt vector STT Tên ngắt Địa chương trình Miêu tả chức RESET 0X000 Ngắt phần cứng Reset INT0 0x001 Ngắt chân INT0 INT1 0x002 Ngắt chân INT1 TIMER2 COMP 0x003 Ngắt so sánh timer TIMER2 OVF 0x004 Ngắt tràn timer TIMER1 CAPT 0x005 Ngắt chụp kiện timer TIMER1 COMPA 0x006 Ngắt so sánh A timer TIMER1 COMPB 0x007 Ngắt so sánh B timer Ngắt ngoài: INT0, INT1 14 Ngắt q trình tác động từ bên ngồi vào bên VĐK làm cho VĐK thực ngoại lệ Có kiểu : Ngắt mức thấp Low Level : xảy ngắt chân INT0 INT1 mức thấp Ngắt thay đổi logic Any Change : thay đổi logic chân INT0 INT1 Ngắt sườn lên Rising Edge ( logic lên logic 1) Ngắt sườn xuống Falling Edge ( logic lên logic 0) Sườn xuống Sườn lên Tần số f = x Hz ( 1s kiện làm lần) Vi dụ : f = 2Hz Ta có T (chu kỳ)= 1(s)/f = 1000ms/2Hz= 500ms Do thời gian trễ (delay) T/2 ( LED sang / tắt T) 500/2=250ms Và ta dùng time đễ xác định thời gian Timer có giá trị bit = 256 Cách tính Timer để 60ms ngắt: mạch sử dụng thạch anh 8000Mhz nên 1000ms Timer đếm 8.000.000/256 lần Vậy để tính 60ms ta lấy ((8.000.000/256)*60)/1000 Ví dụ 1: int Dem=0;//Khai báo biến Dem gán gia trị // Timer overflow interrupt service routine interrupt [TIM0_OVF] void timer0_ovf_isr(void)//Chương trình Timer { Dem++;//Biến đếm bắt đầu tăng giá trị 15 if(Dem>=1875)//Khi biến đếm 1875 thực chương trình { Dem=0;//Đặt biến đếm lại PORTA.0=~PORTA.0;//Đảo ngược tín hiệu PORTA.0 } } Ví dụ 2: interrupt [TIM0_OVF] void timer0_ovf_isr(void) { /* f=125000Hz; Chọn tần số f t= / f = (us) Tính chu kì t Để số xung nhịp chẵn, ta khởi tạo cho TCNT0=6 TCNT0: -> 255, duoc 250 xung nhip Từ số xung nhịp ta tính thời gian tràn chân TCNT0 -> Ttran= 250*8 = 2000 (us) Chọn thời gian mà ta muốn, chọn 60ms Neu bien dem tang 60000/2000=30 lan thi duoc 60 (ms) */ dem++; TCNT0 = 6; } void main(void) { #asm("sei") while (1) { if (dem>=30) //So sánh biến dem với giá trị tính tốn { PORTA.0 = ~PORTA.0; //Đúng đk đảo trạng thái Led dem=0; //Trả giá trị dem } } 16 } Vi dụ 3: Chọn time0 = 8bit = 256 Chọn số đập xung= 31250/256=122 (lần/1s=1000ms) 122 lần = 1000ms ? lần = 60ms => đếm số lần đập xung 60ms = (122*60)/1000 = lần Bài tập: - Lập trình để đèn nhấp nháy 60ms Lập trình cho nút nhấn hiển thị hiệu ứng led Lập trình fLED1 = 1Hz, fLED1 = 2Hz, fLED3 = 3Hz BÀI 6: ĐO TỐC ĐỘ ĐỘNG CƠ DC HIỂNTHỊ LÊN LCD Nội dung: 6.1 Động DC Encoder Đo tốc độ hiển thị LCD Cấu tạo động DC encoder 334 Cách nối dây cho encoder - Động encoder gồm dây động (motor), dây cấp nguồn cho encoder (vcc gnd) dây tín hiệu (A,B) - Nối dây cấp nguồn cho động encoder - Nối chân A chân B với chân INT0 vi điều khiển Chương trình cho encoder - 6.2 Chọn timers/counters Chọn External interruptschọn INT0 Chọn Alphanumeric LCD chương trình LCD Nối dây tương ứng từ PORTA qua LCD, chân A Encoder qua chân INT0, cấp nguồn 5V cho Encoder LCD, cấp nguồn 3-12V cho động DC Cách tính tốc độ động V (vận tốc) = S (vòng)/ t (thời gian) 17 V: vòng/thời gian T : thời gian đếm xung ( 100ms) S : số xung/ số vạch chia vòng unsigned int xung = 0; interrupt [EXT_INT0] void ext_int0_isr(void) { xung++; } Vị dụ: - Cách tính đo tốc độ động cơ: + Trước hết ta dùng Timer để đếm số xung thực thời gian Timer Với Timer 100ms ta có cách tính sau Vì thạch anh 8000Mhz nên số lần đếm thời gian 100ms bằng: ((8.000.000/256)*100)/1000 + Sau khoảng thời gian 100ms ta có tốc độ động Số xung/100ms Để tính số vịng quay ta cần chuyển số xung số vòng 100ms phút Ta lấy Số Xung/334 đĩa quay Encoder quay vòng 334 xung Để đổi 100ms sang phút ta nhân thêm vào 10*60 (Nhân 10 để chuyển sang giây, nhân thêm 60 để chuyển sang phút) Vậy ta có cơng thức để tính Timer >3250 cơng thức để tính tóc độ động (Số Xung/334)*600 // External Interrupt service routine unsigned int Xung=0, Dem=0,i=0; //Khai báo biến đếm, đếm xung i interrupt [EXT_INT0] void ext_int0_isr(void) { Xung++; //Tăng giá trị xung có thay đổi } // Timer overflow interrupt service routine interrupt [TIM0_OVF] void timer0_ovf_isr(void) { Dem++; if(Dem>3125) //100ms ngắt { Dem=0; //Trả giá trị đếm i=Xung; //Gắn giá trị i xung Xung=0; //Trả giá trị xung 18 } } Bài tập: Hiển thị tốc độ động lên LCD 19 ... LM35 cấp nguồn 5v từ vi điều khiển Chân 2:là chân điện áp Vout Kết nối với chân PORTA vi điều khiển Chân 3:là chân nối đất 4.2 ADC ADC = Vin (28 - 1)/Vref với ADC 8bit ADC = Vin (210 - 1)/Vref... nhấn treo trở cho nút nhấn Ví dụ: cách vi? ??t chương trình điều khiển LED #include //Khai báo thư vi? ??n cho chip #include //Khai báo thư vi? ??n trễ void main(void) //Đây chương trình... trên, dùng để điều khiển led nên cho DDRA=0xFF (hay DDRA=0b11111111) Ở “x” “b” tiền tố định cách vi? ??t sau, với “x” ta vi? ??t chuỗi số sau dạng thập lục phân, ngược lại với “b” ta vi? ??t dạng nhị