Báo cáo tốt nghiệp Nguyễn Duy Hoàng Trờng ĐH Nông nghiệp I - 71 - TĐH K46 - Khoa Cơ Điện + 1 b Timer 8 bit v 1 b Timer 16 bit vi ch so sỏnh v chia tn s tỏch bit v ch bt mu. + Ba kờnh iu ch rng xung PWM + Cú n 13 interrupt ngoi v trong + B nh thi Watchdog lp trỡnh c. t ng reset khi treo mỏy + B so sỏnh tng t + Ba ch ng : ch ri (Idle), tit kim in ( Power save) v ch Power Down Thiết kế mạch điều khiển và hiển thị chiều dài ống Mục đích : Mạch đo chiều dài sẽ nhận tìn hiệu xung từ máy phát xung. Trên mạch thiết kế sẵn các nút ấn với các chức năng, ban đầu ngời vận hành sẽ ấn nút để đặt chiều dài cần đo, sau đó dữ liệu này sẽ đợc lu vào bộ nhớ Flash của chíp AVR. Khi ống chạy máy phát xung liên tục phát xung và chíp sẽ đếm những xung này và chuyển thành cm chiều dài với 400 xung tơng ứng với 7cm a. Thiết kế và chế tạo mạch điều khiển, hiển thị chiều dài ống Từ mục đích của mạch đếm và cấu trúc của chíp vi sử lý AT90S2313 ta đa ra sơ đồ thuật toán điều khiển nh sau: Báo cáo tốt nghiệp Nguyễn Duy Hoàng Trờng ĐH Nông nghiệp I - 72 - TĐH K46 - Khoa Cơ Điện Hình 33: Sơ đồ thuật toán xử lý mạch đo chiều dài Begin Khai báo các th viện và các biến cần sử dụng trong chơng trình Hàm quet(void). Hàm này chờ phím đợc ấn và trả lại giá trị của phím ấn Hàm ext_int1_isr(void) Hàm này đợc thực hiện khi một ngắt ngoài xảy ra. Nó phục vụ việc xử lý bàn phím Hàm timer1_comp_isr(void) Hàm này đợc thực hiện khi xảy ra ngắt so sánh bộ định thời 1. Nó kích xung điều khiển đồng thời chờ tín hiệu điều khiển trên chân PortD4. Hàm main(void) Đây là hàm chính của chơng trình. Nó đợc thực hiện khi bắt đầu vào chơng trình. Kết thúc. Báo cáo tốt nghiệp Nguyễn Duy Hoàng Trờng ĐH Nông nghiệp I - 73 - TĐH K46 - Khoa Cơ Điện ` Các th viện đợc sử dụng trong chơng trình viết cho chíp: #include <90s2313.h> // Alphanumeric LCD Module functions #asm .equ __lcd_port=0x18 ;PORTB #endasm #include <lcd.h> #include <stdlib.h> #include <delay.h> #include <string.h> Th viện 90s2313.h chứa các hàm về phần cứng của chip AT90s2313 nh: Các cổng xuất nhập dữ liệu, các thanh ghi có trong chíp, dung lợng các bộ nhớ vv. Th viện lcd.h chứa các hàm về phần cứng của LCD: Số dòng, số ký tự viết đợc trên màn hình LCD vv. Th viện stdlib.h th viện chứa các hàm chuẩn trong C ++ . Th viện này đợc tích hợp thêm một số hàm khác nữa trong phần mềm CodeVisionAVR C Compiler. Th viện delay.h chứa các hàm sử dụng cho xử lý ngắt, và các bộ định thời tạo chễ. Th viện string.h chứa các hàm sử dụng xử lý với ký tự . Sau phần khai báo các th viện sử dụng trong chơng trình tiếp đến khối chơng trình con xử lý quét bàn phím Sơ đồ thuật toán của chơng trình xử lý quét bàn phím Báo cáo tốt nghiệp Nguyễn Duy Hoàng Trờng ĐH Nông nghiệp I - 74 - TĐH K46 - Khoa Cơ Điện Hình 34: Sơ đồ khối chơng trình quét bàn phím mạch đếm Sau khi quét xong bàn phím dữ liệu về chiều dài đặt đợc lu lại trong thanh ghi OCR1. Tiếp theo chíp AT90S2313 xử lý dữ liệu tín hiệu Encoder ext_int1_isr(void) Lu phím đợc ấn. Chuyển vị trí con trỏ LCD đến tọa độ 11, 1 Kiểm tra p hím ấn Nếu là phím tăng thì biến data_e +10 Nếu là phím giảm thì biến data_e - 10 Nếu biến data_e>999 thì data_e=0 Nếu biến data_e<0 thì data_e=999 Di chuyển con trỏ LCD đến tọa độ (11, 0) chuyển data_e thành xâu rồi xuất lên LCD Chờ phím bấm tiếp theo. trễ 100ms Kiểm tra có phải phim OK? Đổi data_e từ cm thành số xung rồi chuyển vào OCR1 để so sánh. Kết thúc Nếu là phím sang trái thì biến data_e /10 Nếu là phím sang phải thì biến data_e *10 Báo cáo tốt nghiệp Nguyễn Duy Hoàng Trờng ĐH Nông nghiệp I - 75 - TĐH K46 - Khoa Cơ Điện đa vào chíp. Cuối cùng trong chơng trình chính chíp xử lý tín hiệu Encoder chuyển đổi các xung thành độ dài Cm và sau khi đủ chiều dài chíp xuất ra một tín hiệu đa vào PLC. Hình 35: Sơ đồ khối chơng trình chính mạch đếm Main (void) Chọn PortD4 làm chân xuất dữ liệu Bộ định thời 1 hoạt động với tần số xung nhịp trên chân T1 và ở chế độ giá trị cao nhất là giá trị của thanh ghi OCR1. Ngắt là ngắt so sánh bộ định thời. Ngắt ngoài 1 cho phép đợc hoạt động. Nó có tích cực trên sờn lên của chân INT1. Khởi tạo LCD Xuất lên LCD dòng chữ do dai dat Cm Chuyển con trỏ xuống dòng 2, xuất lên LCD dòng chữ Do dai do Cm. Đổi data_e từ đơn vị cm sang số xung, rồi nạp vào thanh ghi OCR1. Chuyển data_e sang dạng xâu, rồi xuất lên LCD ở tọa độ (11,0) Chuyển con trỏ LCD sang tọa độ (11,1) rồi xuất giá trị hiện thời đo đợc lên LCD. B¸o c¸o tèt nghiÖp NguyÔn Duy Hoµng Tr−êng §H N«ng nghiÖp I - 76 - T§H K46 - Khoa C¬ §iÖn Ch−¬ng tr×nh ®iÒu khiÓn vµ m¹ch ®o cô thÓ nh− sau: #include <90s2313.h> // Alphanumeric LCD Module functions PhÇn khai b¸o c¸c th− #asm .equ __lcd_port=0x18 ;PORTB #endasm viÖn chuÈn #include <lcd.h> #include <stdlib.h> #include <delay.h> #include <string.h> flash char *data_f[]={"Do dai do Cm","Do dai dat Cm"}; eeprom int data_e=100; char i; char str[4]; char quet(void) { #asm LOOP: sbis $10,3 rjmp LOOP #endasm return PIND&0x07; } // External Interrupt 1 service routine // §o¹n ch−¬ng tr×nh xö lý quÐt bµn phÝm interrupt [EXT_INT1] void ext_int1_isr(void) { // Place your code here char b; b=quet(); B¸o c¸o tèt nghiÖp NguyÔn Duy Hoµng Tr−êng §H N«ng nghiÖp I - 77 - T§H K46 - Khoa C¬ §iÖn TCCR1B=0x00; lcd_gotoxy(11,1); while(b!=6) { switch(b){ case 2: data_e*=10; break; case 1: data_e/=10; break; case 4:data_e++; break; case 3: data_e ; } if(data_e<0) data_e=999 ; if(data_e>999) data_e=0; lcd_gotoxy(11,0); itoa(data_e,str); lcd_puts(str); if(strlen(str)<3) for(i=1;i<=3-strlen(str);i++) lcd_putchar(' '); b=quet(); delay_ms(100); } OCR1=data_e*57.14; TCCR1B=0x0f; } // Timer 1 output compare interrupt service routine interrupt [TIM1_COMP] void timer1_comp_isr(void) { B¸o c¸o tèt nghiÖp NguyÔn Duy Hoµng Tr−êng §H N«ng nghiÖp I - 78 - T§H K46 - Khoa C¬ §iÖn // Place your code here PORTD|=0x10; TCCR1B=0x00; delay_ms(1000); PORTD&=0xEF; #asm LOOP1: sbic $10,6 rjmp LOOP1 #endasm TCCR1B=0x0F; } // Declare your global variables here // §o¹n ch−¬ng tr×nh chÝnh void main(void) { DDRD=0x10; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped // Timer/Counter 1 initialization // Clock source: T1 pin Rising Edge // Mode: CTC top=OCR1A // OC1 output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge // Timer 1 Overflow Interrupt: Off B¸o c¸o tèt nghiÖp NguyÔn Duy Hoµng Tr−êng §H N«ng nghiÖp I - 79 - T§H K46 - Khoa C¬ §iÖn // Input Capture Interrupt: Off // Compare Match Interrupt: On TCCR1B=0x0F; // External Interrupt(s) initialization // INT0: Off // INT1: On // INT1 Mode: Rising Edge GIMSK=0x80; MCUCR=0x0C; GIFR=0x80; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x40; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; // LCD module initialization lcd_init(16); // Global enable interrupts #asm("sei") lcd_putsf(data_f[1]); lcd_gotoxy(0,1); lcd_putsf(data_f[0]); OCR1=data_e*57.14; itoa(data_e,str); lcd_gotoxy(11,0); lcd_puts(str); if(strlen(str)<3); B¸o c¸o tèt nghiÖp NguyÔn Duy Hoµng Tr−êng §H N«ng nghiÖp I - 80 - T§H K46 - Khoa C¬ §iÖn +5V +5V +5V +5V +5V +5V +5V KEY 7 RW KEY 3 XTA2 KEY 2 KEY 8 KEY 7 XTA1 D6 E D7 D4 KEY 1 KEY 4 KEY 4 KEY 3 D6 KEY 8 XTA2 D5 RESET KEY 5 KEY 4 KEY 1 D5 +5V KEY5KEY 2 D7 KEY 6 XTA1 RESET V0 KEY 5 RW KEY 2 KEY 1 V0 KEY 6 RS KEY3 RS KEY 6 RESET D4 E U2 AT90S2313/SO 1 4 5 10 20 12 13 14 15 16 17 18 19 2 3 6 7 8 9 11 RESET XTAL 2 XTAL 1 GND VCC PB0/AIN0 PB1/AIN1 PB2 PB3/OC1 PB4 PB5/MOSI PB6/MISO PB7/SCK PD0/RXD PD1/TXD PD2/INT0 PD3/INT1 PD4/T0 PD5/T1 PD6/ICP Y1 4MHz SW2 SW3 SW5 J3 Nguon 1 2 C6 SW4 C7 U3 LM7805 1 2 3 VI GND VO J2 LCD 1 2 3 4 5 6 7 8 9 10 11 12 13 14 C15 470uF C13 10uF SW6 D2 1N4007 D1 1N4148 SW7 R4 4.7K C12 105 SW8 C14 104 C11 10uF R510K P1 CONNECTOR DB9 5 9 4 8 3 7 2 6 1 R2 RESISTOR VAR R7 RESISTOR SIP 9 1 2 3 4 5 6 7 8 9 R3 100 J1 Input 1 2 3 C1 C2 D3 LED C3 U1 74148 10 11 12 13 1 2 3 4 5 9 7 6 14 15 16 8 D0 D1 D2 D3 D4 D5 D6 D7 EI Q0 Q1 Q2 GS EO VCC GND C4 C5 C8 C9 C10 SW9 SW1 for(i=1;i<=3-strlen(str);i++) lcd_putchar(' '); while (1) { // Place your code here lcd_gotoxy(11,1); itoa(TCNT1*0.0175,str); lcd_puts(str); if(strlen(str)<3); for(i=1;i<=3-strlen(str);i++) lcd_putchar(' '); delay_ms(5); }; } H×nh 36.S¬ ®å m¹ch nguyªn lý cña m¹ch ®o chiÒu dµi . lu vào bộ nhớ Flash của chíp AVR. Khi ống chạy máy phát xung liên tục phát xung và chíp sẽ đếm những xung này và chuyển thành cm chiều dài với 400 xung tơng ứng với 7cm a. Thiết kế và chế tạo. 90s2313.h chứa các hàm về phần cứng của chip AT90s2313 nh: Các cổng xuất nhập dữ liệu, các thanh ghi có trong chíp, dung lợng các bộ nhớ vv. Th viện lcd.h chứa các hàm về phần cứng của LCD: Số. của chơng trình. Nó đợc thực hiện khi bắt đầu vào chơng trình. Kết thúc. Báo cáo tốt nghiệp Nguyễn Duy Hoàng Trờng ĐH Nông nghiệp I - 73 - TĐH K46 - Khoa Cơ Điện ` Các th viện đợc sử dụng