Tải bản đầy đủ (.docx) (21 trang)

ĐIỀU KHIỂN TỐC ĐỘ ĐỘNG CƠ ENCODER

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (487.85 KB, 21 trang )

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
VIỆN ĐIỆN TỬ VIỄN THÔNG
====o0o====
ĐỒ ÁN II
Đề Tài : ĐIỀU KHIỂN TỐC ĐỘ ĐỘNG CƠ
ENCODER

Giáo Viên hướng dẫn :
Sinh viên thực hiện MSSV Lớp

Hà Nội 12/2013
1 | P a g e
MỤC LỤC
2 | P a g e
LỜI NÓI ĐẦU
Động cơ encoder được ứng dụng vào nhiều lĩnh vực trong cuộc sống
(trong công nghệ chế tạo robot…).mach điều khiển động cơ có ý nghĩa rất quan
trọng trong việc điều khiển động cơ theo mục đích của người sử dụng.đặc điểm
của mạch điều khiển là động cơ có thể quay thuận hoặc quay nghịch ,tốc độ của
động cơ có thể tăng hoặc giảm tùy theo ý thích .mạch sử dụng chíp vi điều khiển
của hãng TI .
Đồ án II chúng em làm lần này giúp chúng em rèn lyện thêm các kỹ năng lập
trình cho kit launchpad MSP430, kỹ năng làm mạch in trên orcard hoặc altium.
vận dụng những kiến thức đã học trên giảng đường vào thực tế và đồng thời rèn
luyện được kỹ năng làm việc nhóm
3 | P a g e
CHƯƠNG 1: CƠ SỞ LÝ THUYẾT
I.Tìm hiểu chung về kít launchpad MSP430.
1.Giới thiệu chung
-MSP430 là họ vi điều khiển cấu trúc RISC 16-bit được sản xuất bởi công ty
Texas Instruments.


-MSP là chữ viết tắt của “MIXED SIGNAL MICROCONTROLLER” là dòng vi
điều khiển siêu tiết kiệm năng lượng, sử dụng nguồn thấp, khoảng điện áp nguồn
cấp từ 1.8V – 3.6V. MSP430 kết hợp các đặc tính của một CPU hiện đại và tích
hợp sẵn các module ngoại vi.
-MSP430 Tích hợp phần mô phỏng trên kit
Nghĩa là bạn có thể nạp chương trình và gỡ lỗi project của bạn mà không cần
thêm công cụ nào khác. Đặc biệt hơn là bạn có thể dùng Kit để nạp và debug cho
tất cả các chip MSP430 nằm trên một mạch khác
-MSP430 Tương thích với các module hỗ trợ
Các chân của MSP430G2 được thiết kế rất thoáng. Các chân này giúp cho việc
cắm các module hỗ trợ khác rất dễ dàng, để thêm các tính năng như wireless,
capacitive touch…
-Hỗ trợ các vi điều khiển MSP430G2xx
Kit MSP430 hỗ trợ các vi điều hiển dòng MSP430G2xx. Đây là các vi điều
khiển tần số dao động có thể lên đến 16MHZ, bộ nhớ lên đên 16KB Flash, 512B
RAM, có tích hợp ADC, timer và các module giao tiếp
4 | P a g e
Hình ảnh của kit launchpad MSP430
2.Các ứng dụng của kít launchpad MSP430
Kit MSP430 LaunchPad có thể được sử dụng trong rất nhiều các ứng dụng như:
- Làm máy nghe nhạc
- Điều khiển động cơ bước
- Hiển thị Graphic LCD
- Robot dò đường
- Xe tự cân bằng
- Robot
- Ứng dụng trong đo lường
- Led cube



5 | P a g e
II.Tìm hiểu về giao tiếp LCD
-MSP430 là loại vi điều khiển tiết kiệm năng lượng dùng nguồn 3V3 trong khi
màn hình LCD1602 thông dụng lại dùng 5V. Thật ra trong lúc giao tiếp nếu chỉ
gửi lệnh mà không cần đọc thì thiết lập phần cứng cũng không quá khó khăn, tuy
nhiên trong giao tiếp có cả việc đọc cờ báo bận, nên dĩ nhiên việc giao tiếp trên
trở nên không ổn định về lâu dài, nhất là cho MSP430.
Thật may mắn cho mình là chip HD44780 (chip điều khiển màn hình LCD, mình
giao tiếp với chip này) có hỗ trợ cả nguồn 3V3, và khi tra thêm trong datasheet
có nói về một vấn đề là với nguồn 3V3 thì độ tương phản sẽ không được cao (cụ
thể hơn là mức áp phân cực cho chân V0). Như vậy cần có một mức áp cao hơn
vào chân này. Việc tạo mức áp cao này bạn có thể dùng một mạch boost, rồi so
sánh với GND cũng được, riêng cá nhân mình dùng IC7660 tạo mức áp âm
khoảng -3V so sánh với 3V3 (rất dễ dùng và cũng rẻ, chỉ cần lắp thêm 2 tụ
ngoài)
-LCD có 3 chân điều khiển là RS, R/W, E. Và 8 chân dữ liệu từ D0-D7.
tóm tắt bảng đó theo dạng tính năng từng chân như sau:
Chân RS: Chọn thanh ghi. Có 2 thanh ghi trong chip LCD. Một thanh ghi lệnh
(IR) và một thanh ghi dữ liệu (DR). Như vậy khi cần ghi lệnh điều khiển hoạt
động LCD thì RS=0. Khi cần ghi dữ liệu thì RS=1
Chân R/W: Gửi hay đọc dữ liệu. Khi đọc dữ liệu từ chip LCD gửi về thì R/W=1,
khi không ghi dữ liệu thì R/W=0
Chân E (không có trong bảng): đây là chân enable của chip LCD. Do giao tiếp
dữ liệu của LCD khá giống giao tiếp song song nên mục đích chân này là: khi
ghi dữ liệu, sau khi tín hiệu ngõ ra của các chân dữ liệu đã đúng thì phát một
xung tích cực mức cao sẽ làm chip LCD đọc tín hiệu ở các chân dữ liệu; còn khi
đọc dữ liệu, phát xung này sẽ làm chip LCD xuất giá trị dữ liệu cần đọc ra chân
dữ liệu.
Dựa trên bảng này mình đã define một số lệnh cũng như chi tiết các bit để dễ
nhớ hơn. Cách sử dụng mình đã có kèm một file main.c để ví dụ

6 | P a g e
Vấn đề tiếp theo khi giao tiếp mà mình nghĩ :chip này hỗ trợ tần số giao tiếp là
bao nhiêu? Chân E phát xung như thế nào? Xuất dữ liệu trên các chân tín hiệu ra
sao?
Điều đầu tiên như mình đã nói, chip HD44780 có hỗ trợ giao tiếp dữ liệu với vi
điều khiển chỉ cần dùng 4 dây thay vì 8 dây (như vậy rõ ràng là khi truyền dữ
liệu cũng phải truyền 2 lần thay vì 1 lần cho 1 byte như chế độ 8 dây). Và vì lý
do kinh tế cũng như sự gọn gàng khi đi dây bus, mình chỉ viết thư viện cho chế
độ 4 dây (4bit), các bạn nếu cần có thể viết lại để hỗ trợ chế độ 8bit.
Ngoài ra trong thư viện của mình cũng mặc định là bạn dùng 2 dòng của LCD,
và khi ghi không dịch màn hình
Và cũng như 1 quy ước để khỏi nhầm lẫn, mình sẽ chọn BIT4 – BIT7 cho chân
D4 – D7, các chân này được define trong file .h. Các bạn vào define các chân
cho các dây dữ liệu và điều khiển.
Kế đến là vấn đề chuyển dữ liệu ra sao. Về vấn đề này, bạn có thể tham khảo
trang 200 của datasheet. Từ trang này mình đã viết hàm lcd_check_busy(),
lcd_send_data() và lcd_send_instruction(). Mình chỉ làm khác thư viện của C18
một điểm ở chỗ chân E. Thư việc C18 sẽ xuất tín hiệu ở chân dữ liệu D4-D7
trước, sau đó mới phát một xung cao ở chân E. Mình thì Kéo chân E lên mức cao
rồi mới xuất dữ liệu ở chân ra, sau đó kéo chân E về lại mức 0. Kết quả đều như
nhau, bạn có thể thử và xem kết quả.
Trong quá trình viết code, chỉ có hàm khởi tạo lcd_init() là hơi đặc biệt vì theo
như trong datasheet, trong mạch của chip LCD có phần khởi tạo, tuy nhiên
không phải lúc nào cũng thành công. Ngoài việc đợi 10ms (code của mình đợi
15ms) cho mức áp LCD đạt mức cần thiết thì để phần khởi tạo thành công 100%.
Hàm lcd_init()cần phải định nghĩa 3 khoảng thời gian (trong file .h) là 15ms,
5ms và 500us dựa trên MCLK của MSP430 mà các bạn đang dùng (mặc định là
1,1MHZ). Các thông số đưa vào hàm lcd_init() có 3 phần tương ứng 3 thanh ghi:
Function, Display, Entry. Thông số đầu tiên đưa vào là kiểu font, kế đến là cách
hiển thị và thứ ba là chế độ tự động dịch chuyển.

Kế đến là các địa chỉ trên màn hình. Module LCD có 3 loại bộ nhớ, CGROM,
CGRAM và DDRAM. CGROM là bộ nhớ ROM (nên bạn không tác động đến
7 | P a g e
nó được) chứa các mảng ký tự theo địa chỉ trên bảng code ASCII. Còn DDRAM
dữ liệu trên màn hình LCD. Như vậy khi bạn gửi dữ liệu cần hiển thị lên
DDRAM thì địa chỉ DDRAM tại đó sẽ tự động hiển thị dữ liệu tại địa chỉ
CGROM tương ứng. Nói tóm lại là dữ liệu hiển thị trên DDRAM và CGROM là
giống nhau. Còn về bộ nhớ khá đặc biệt CGRAM mình sẽ bàn sau.
dùng hàm lcd_set_ddram_add() để chọn ô hiển thị trên LCD. Như mình đã nói
mỗi hàng trên LCD có 40 ký tự nhưng do giới hạn kích thước màn hình nên bạn
chỉ có thể thấy 16 ký tự. Nếu muốn thấy những ký tự kia thì cần phải dịch màn
hình sang phải hay trái bằng hàm lcd_shift_display(). Khi bạn ghi dữ liệu vào
một ô địa chỉ DDRAM thì con trỏ tự động chuyển sang địa chỉ kế tiếp, do đó bạn
có thể ghi liên tục mà không cần phải chọn lại địa chỉ nếu như địa chỉ là liên tục
với nhau. Điều đặc biệt bạn có thể thấy là DDRAM có 128 địa chỉ (7bit) nhưng
mỗi hàng chỉ có 40 địa chỉ, nếu ghi vào những địa chỉ còn lại thì sao? Mình đã
thử và thấy rằng những ô địa chỉ đó bị chồng lấn lên những ô khác nên tốt nhất
bạn nên dùng đúng như khuyến cáo của datasheet: hàng trên từ 0 - 39 ; hàng
dưới từ 64 - 103.
Như vậy với các dòng lệnh trên bạn đã có thể hiển thị theo ý mình muốn, sau khi
dùng lcd_init() để khởi tạo, bạn có thể dùng lệnh lcd_clear_all() để xóa hết màn
hình và reset địa chỉ DDRAM thành 0. Sau đó nếu muốn ghi một ký tự bạn dùng
hàm lcd_send_data(), nếu muốn ghi một đoạn chữ bạn dùng hàm
lcd_send_string().
8 | P a g e
CHƯƠNG 2: TÌM HIỂU VỀ MACH ĐIỀU KHIỂN
ĐỘNG CƠ
I.Sơ đồ mạch
1.Sơ đồ khối
9 | P a g e

Khối bàn
phím
Khối công
suất
Khối hiển
thị
Khối vi sử

2.Sơ đồ nguyên lý
10 | P a g e
II.Tìm hiểu từng linh kiện
1.Màn hình LCD 1602
-LCD có chức năng hiển thị tốc độ của động cơ
LCD 1602 datasheet
Tên các các chân 1->16
11 | P a g e
2.IC L298
-Chức năng chính của L298 là dùng để khuếch đại công suất của động cơ
L298 datasheet
Hình ảnh trên thực tế của L298
12 | P a g e
3.Chíp MSP430 G2553
-chíp này được gắn trên kit launchpad MSP430 ,để nạp chương trình cho chíp
này ta dùng phần mền CSS để nạp.
-để làm dược thành công thì ta phải thử nghiệm trên kit trước đã sau đó mới làm
mạch thật.
-Sau khi nạp chương trình xong ta lấy chip ra và gắn vào mạch mà ta đã làm.
Sơ đồ chân của msp430g2553
Hình ảnh của chip
13 | P a g e

III.Hình ảnh liên quan đến mạch
1.Hình ảnh mạch in
14 | P a g e
2.Hình ảnh của mạch sau khi hoàn thành
15 | P a g e
IV.MÃ NGUỒN
#include <msp430g2553.h>
union reg{
unsigned char _byte;
struct bit {
unsigned char b0:1;
unsigned char b1:1;
unsigned char b2:1;
unsigned char b3:1;
unsigned char b4:1;
unsigned char b5:1;
unsigned char b6:1;
unsigned char b7:1;
} _bit;
};
union reg* P2_dir=(union reg*)0x2a;
union reg* P2_out=(union reg*)0x29;
union reg* P2_sel=(union reg*)0x2e;
union reg* P2_in=(union reg*)0x28;
union reg* P1_sel=(union reg*)0x26;
union reg* P1_dir=(union reg*)0x22;
union reg* P1_out=(union reg*)0x21;
union reg* P1_in=(union reg*)0x20;
#define RW P2_out->_bit.b5
#define RS P1_out->_bit.b7

#define EN P2_out->_bit.b4
#define DATA_4 P2_out->_bit.b3
#define DATA_5 P2_out->_bit.b2
#define DATA_6 P2_out->_bit.b1
#define DATA_7 P2_out->_bit.b0
#define line_1 0x80
#define line_2 0xC0
#define clr_scr 0x01
void delay( unsigned long int t)
16 | P a g e
{
unsigned long int i=0;
for(i=0;i<(t*100);i++){};
}
void enable()
{EN=1;delay(100);EN=0;delay(20);
}
void set_data_lsb( unsigned char data)
{ char convert=0;
convert=data&0x01;
if(convert==0x01)DATA_4=1;
else DATA_4=0;convert=data&0x02;
if(convert==0x02)DATA_5=1;
else DATA_5=0;convert=data&0x04;
if(convert==0x04)DATA_6=1;
else DATA_6=0;convert=data&0x08;
if(convert==0x08)DATA_7=1;
else DATA_7=0;
}void set_data_msb(unsigned char data)
{ char convert=0;

convert=data&0x10;
if(convert==0x10)DATA_4=1;
else DATA_4=0;convert=data&0x20;
if(convert==0x20)DATA_5=1;
else DATA_5=0;convert=data&0x40;
if(convert==0x40)DATA_6=1;
else DATA_6=0;convert=data&0x80;
if(convert==0x80)DATA_7=1;
else DATA_7=0;
}
void put_cmd( unsigned char cmd)
{
RS=0;
set_data_msb(cmd);
enable();
set_data_lsb(cmd);
enable();
delay(1000);
}
17 | P a g e
void lcd_putchar( char data)
{
RS=1;set_data_msb(data);
enable();
set_data_lsb(data);
enable();
delay(1000);
}
void lcd_putsf( char *s)
{

while(*s)
{
lcd_putchar(*s);
s++;
};
}
void lcd_init()
{
delay(100);
RS=0;
set_data_lsb(0x03);
enable();
enable();
enable();
set_data_lsb(0x02);
enable();
put_cmd ( 0x28 );
put_cmd ( 0x0C);
put_cmd ( 0x06 );
put_cmd ( 0x01 );
put_cmd ( 0x01 );
put_cmd ( 0x01 );
}
int td =10 ,c= 1;
void hienthi(int td,int c);
#pragma vector=TIMER0_A1_VECTOR
__interrupt void TA0IV_Interrupt (void)
{
18 | P a g e
if((P1IN & BIT1) == 0){

_delay_cycles(10000);
TA0CCR1 += 150 ;
td += 5 ;
if(td >= 100) td=100 ;
if(td < 10) td = 10 ;
hienthi(td,c);
while((P1IN & BIT1) == 0) {}
_delay_cycles(10000);
}
if((P1IN & BIT2) == 0){
_delay_cycles(10000);
TA0CCR1 -= 150 ;
td -= 5 ;
if(td < 10) td= 0 ;
hienthi(td,c);
while((P1IN & BIT2) == 0) {}
_delay_cycles(10000);
}
if((P1IN & BIT3) == 0){
_delay_cycles(10000);
P1OUT ^= (BIT4 + BIT5);
c=!c ;
hienthi(td,c);
while((P1IN & BIT3) == 0) {}
_delay_cycles(10000);
}
if(TA0CCR1 >= 5000) TA0CCR1 = 5000 ;
if((TA0CCR1 < 2300)&&(TA0CCR1 > 2100)) TA0CCR1 = 0 ;
if((TA0CCR1 > 100)&&(TA0CCR1<200)) TA0CCR1 = 2300 ;
}

void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
TA0CTL = TASSEL_2 +MC_1;
TA0CCTL1 = OUTMOD_7 + CCIE;
P1DIR |= BIT6 +BIT7 ;
P1DIR |= BIT4+ BIT5 ;
19 | P a g e
P1DIR &= ~(BIT3 + BIT2 +BIT1) ;
P1REN |= (BIT3 +BIT2 +BIT1 );
P1SEL |= (BIT6) ;
P1SEL2 &=~(BIT6);
P2DIR=0xff;
P2SEL=0x00;
TA0CCR0 = 5000;
TA0CCR1=2300;
P1OUT |= BIT5;
P1OUT &= ~BIT4;
RW = 0 ;
lcd_init();
_delay_cycles(5000);
hienthi(td,c);
_BIS_SR(GIE);
}
//void hienthi(int td,int c){
put_cmd(0x01);
put_cmd(0x02);
put_cmd (line_1);
lcd_putsf(" toc do : ");
lcd_putchar(td/100 +48);

lcd_putchar((td%100)/10 +48);
lcd_putchar(((td%100)%10) +48);
lcd_putchar(0x20);
lcd_putchar(0x25);
_delay_cycles(50);
put_cmd (line_2);
lcd_putsf(" chieu : ");
if(c) lcd_putsf("thuan");
else lcd_putsf("nguoc");
_delay_cycles(500);
}
20 | P a g e
TÀI LIỆU THAM KHẢO
www.diendanti.com
www.alldatasheet.com
www.diedandientuvietanam.net
google.com.vn
21 | P a g e

×