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