Tải bản đầy đủ (.doc) (17 trang)

Đồ án Vi điều khiển ( vi điều khiển PIC 16F877A)

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 (681.05 KB, 17 trang )

MỤC LỤC

MỤC LỤC..................................................................................................1
PHẦN 1:GIỚI THIỆU CÁC LINH KIỆN ĐIỆN TỬ TRONG MẠCH
ĐIỆN..........................................................................................................3
Giới thiệu về vi điều khiển PIC 16F877A.................................3
1.1Giới thiệu về các linh kiện sử dụng trong mạch..................4
1.1.1 LCD 16x2......................................................................................4
a/ Hình dạng và kích thức........................................................4
................................................................................................................5
Chú ý :......................................................................................................7
b/ Tập lệnh....................................................................................8
1.1.2 Encoder.........................................................................................8
PHẦN 2: MÔ PHỎNG NGUYÊN LÝ VÀ MẠCH IN..........................11
2.1 Mạch nguyên lý............................................................................11
2.2 Mạch mô phỏng và mạch in.....................................................11
2.3 Nguyên lý hoạt động và phần mềm hỗ trợ.........................12
PHẦN 3: LƯU ĐỒ THUẬT TOÁN VÀ CODE NẠP CHO VI ĐIỀU
KHIỂN....................................................................................................12
3.1 Lưu đồ............................................................................................12
3.2 Chương trình...............................................................................14

1


MỞ ĐẦU
Hiện nay đất nước ta trong thời kì đổi mới, thời kì công nghiệp hoá hiện
đại họá cùng với sự phát triển của công nghệ thông tin, ngành kỹ thuật điện tự
động hóa cũng phát triển lên tầm cao mới. Điều khiển tự động là một trong
những ngành quan trọng trong quá trình công nghiệp hóa, hiện đại hóa đặc
biệt là góp phần vào việc giải phóng sức lao động của con người và chính xác


hơn con người. Điều khiển tự động có mặt từ trước công nguyên đó là chiếc
đồng hồ có phao điều chỉnh Ktesibios của Hi Lạp. Rồi sau này cũng có thêm một
số máy móc điều khiển tự động (như: hệ điều chỉnh nhiệt độ của Cornelis
drebble, hệ điều chỉnh tốc độ được ứng dụng trong công nghiệp….). Trong
chiến tranh thế giới thứ 2 người hỏi điều khiển tự động để ứng dụng vào mục
đích quân sự (như: máy bay tự động lái, điều khiển vũ khí, điều khiển ra đa...) .
Những năm 50 các phương pháp toán học bắt đầu ra đời được đưa nhanh vào
ứng dụng thực tế. Ở Mỹ người ta nghiên cứu dựa trên miền tần số còn ở Liên
Xô thì lại dựa trên miền thời gian. Ngày nay để đáp ứng được nhu cầu của con
người, giảm tải lao động tay chân, hệ thống “Đo tốc độ động cơ và hiển thị
LCD” ra đời giúp cho việc đo tốc độ động cơ trong công nghiệp trở nên dễ dàng
và thuận tiện hơn rất nhiều, giảm thiểu các sai sót khi vận hành hệ thống với
các động cơ điện.

2


PHẦN 1:GIỚI THIỆU CÁC LINH KIỆN ĐIỆN TỬ TRONG MẠCH ĐIỆN
Giới thiệu về vi điều khiển PIC 16F877A
Pic16f877a có độ dài lệnh 14 bit
sơ đồ chân gồm 40 pin

- Pic 16f877a có tập lệnh gồm 35 lệnh, mỗi lệnh được thực hiện trong
một chu kỳ xung clock. Tốc độ hoạt động tối đa cho phép là 20mhz. với mỗi chu
kỳ lệnh là 200ms , bộ nhớ chương trình 8K*14bit . Số port I/O là 5 với 33 pin
I/O
Các đặc tính ngoaji vi bao gồm các khối chức năng sau:
+/ timer0: bộ đếm 8 bit với bộ chia tần số 8 bit
+/timer1: bộ đếm 16 bit với bộ chia tần số ,có thể thực hiện chức năng đếm
dựa vào xung clock ngoại vi ngay khi vi điều khi vi điều khiển hoạt động ở chế

độ sleep
+/ timer2: bộ đếm 8 bit với bộ chia tần số, bộ postcaler

3


+/ hai bộ Capture /so sánh/ điều chế độ rộng xung
+/ Các chuẩn giao tiếp UART với 9 bit địa chỉ
+/ Các đặc tính Analog: 8 kênh chuyển đổi ADC 10 bit, 2 bộ so sánh
+/ Bên cạnh đó là một vài đặc tính khác của vi điều khiển: như bộ nhớ flash có
thể nạp xóa 100.000 nghìn lần, bộ nhớ eproom ghi xóa được 1.000.000 lần
+/ Nạp được chương trình ngay trên mạch điện ICSP

1.1

Giới thiệu về các linh kiện sử dụng trong mạch

1.1.1 LCD 16x2
Màn hình tinh thể lỏng (Liquid Crystal Display, LCD) là loại thiết bị hiển
thị cấu tạo bởi các tế bào (các điểm ảnh) chứa tinh thể lỏng có khả năng thay
đổi tính phân cực của ánh sáng và do đó thay đổi cường độ ánh sáng truyền
qua khi kết hợp với các kính lọc phân cực. Chúng có ưu điểm là phẳng, cho
hình ảnh
sáng, chân thật và tiết kiệm điện.
Ngày nay, thiết bị hiển thị LCD được sử dụng trong rất nhiều các ứng dụng của
VĐK. LCD có rất nhiều ưu điểm so với các dạng hiển thị khác: Nó
có khả năng
hiển thị kí tự đa dạng, trực quan (chữ, số và kí tự đồ họa), dễ
dàng đưa vào
mạch ứng dụng theo nhiều giao thức giao tiếp khác nhau, tốn rất

ít tài nguyên hệ
thống và giá thành rẻ . . .
a/ Hình dạng và kích thức
Có rất nhiều loại LCD với nhiều hình dáng và kích thước khác nhau, trên
hình là loại LCD thông dụng

4


Khi sản xuất LCD, nhà sản xuất đã tích hợp chíp điều khiển bên trong lớp
vỏ và chỉ đưa các chân giao tiếp cần thiết. Các chân này được đánh số thứ tự
và đặt tên như hình :

Chân

Kí hiệu

Ý nghĩa

1

VSS

Chân nối đất cho LCD, khi thiết kế
mạch ta nối chân này với GND của mạch
điều khiển

2

Vdd


Chân cấp nguồn cho LCD, khi thiết kế
mạch ta nối chân này với VCC=5V của mạch
điều khiển

3

VEE

Điều chỉnh độ tương phản của LCD.

5


4

RS

Chân chọn thanh ghi (Register
select). Nối chân RS với logic “0” (GND)
hoặc logic “1” (VCC) để chọn thanh ghi.
+ Logic “0”: Bus DB0-DB7 sẽ nối với
thanh ghi lệnh IR của LCD (ở chế độ “ghi” write) hoặc nối với bộ đếm địa chỉ của LCD
(ở chế độ “đọc” - read)
+ Logic “1”: Bus DB0-DB7 sẽ nối với
thanh ghi dữ liệu DR bên trong LCD

5

RW


6
E

Chân chọn chế độ đọc/ghi
(Read/Write). Nối chân R/W với logic “0”
để LCD hoạt động ở chế độ ghi, hoặc nối với
logic “1” để LCD ở chế độ đọc.
Chân cho phép (Enable). Sau khi các
tín hiệu được đặt lên bus DB0-DB7, các
lệnh chỉ được chấp nhận khi có 1 xung cho
phép của chân E.
Ở chế độ ghi: Dữ liệu ở bus sẽ được
LCD chuyển vào(chấp nhận) thanh ghi bên
trong nó khi phát hiện một xung (high-tolow transition) của tín hiệu chân E.
Ở chế độ đọc: Dữ liệu sẽ được LCD
xuất ra DB0-DB7 khi phát hiện cạnh lên
(low-to- high transition) ở chân E và được
LCD giữ ở bus đến khi nào chân E xuống
mức thấp.

6


7-14

D0 – D7

Tám đường của bus dữ liệu dùng để trao đổi
thông tin với MPU. Có 2 chế độ sử dụng 8

đường bus này :
+ Chế độ 8 bit : Dữ liệu được truyền trên cả
8 đường, với bit MSB là bit DB7.
+ Chế độ 4 bit : Dữ liệu được truyền trên 4
đường từ DB4 tới DB7, bit MSB là
DB7

Chú ý :
Ở chế độ “đọc”, nghĩa là MPU sẽ đọc thông tin từ LCD thông qua các chân
Dx.
Còn khi ở chế độ “ghi”, nghĩa là MPU xuất thông tin điều khiển cho LCD
thông qua các chân Dx.
Chân 15 và chân 16: ghi là A và K. Nó là anot và katot của một con led
dùng để sáng LCD trong bóng tối, chúng ta có thể k nối , nếu sử dụng nối chân
15 với trở 220 or 330 ôm lên VCC, chân 16 nối đất.

Tập lệnh của LCD.
Một số chú ý :
Trước khi tìm hiểu tập lệnh của LCD, sau đây là một vài chú ý khi giao
tiếp với LCD :
+Tuy trong sơ đồ khối của LCD có nhiều khối khác nhau, nhưng khi lập
trình điều khiển LCD ta chỉ có thể tác động trực tiếp được vào 2 thanh ghi DR
và IR thông qua các chân DBx, và ta phải thiết lập chân RS, R/W phù hợp để
chuyển qua lại giữ 2 thanh ghi này. (xem bảng trên)
+Với mỗi lệnh, LCD cần một khoảng thời gian để hoàn tất, thời gian này
có thể khá lâu đối với tốc độ của MPU, nên ta cần kiểm tra cờ BF hoặc đợi
(delay) cho LCD thực thi xong lệnh hiện hành mới có thể ra lệnh tiếp theo.
+Địa chỉ của RAM (AC) sẽ tự động tăng (giảm) 1 đơn vị, mỗi khi có lệnh
ghi vào RAM. (Điều này giúp chương trình gọn hơn)
Các lệnh của LCD có thể chia thành các nhóm như sau :


7


+Các lệnh về kiểu hiển thị. VD : Kiểu hiển thị (1 hàng / 2 hàng), chiều dài
dữ liệu (8 bit / 4 bit), …
+Chỉ định địa chỉ RAM nội.
+Nhóm lệnh truyền dữ liệu trong RAM nội.
b/ Tập lệnh
Tập lệnh của LCD tương đối đơn giản. Nhưng khi lập trình cho mạch có
LCD ta chỉ cần gọi các hàm có sẵn trong trình biên dịch mà không cần phải
đánh các lệnh phức tạp.

1.1.2 Encoder
Encoder mục đích dùng để quản lý vị trí góc của một đĩa quay, đĩa quay
có thể là bánh xe, trục động cơ, hoặc bất kỳ thiết bị quay nào cần xác định vị trí
góc.
Encoder được chia làm 2 loại, absolute encoder và incremental encoder. Tạm
gọi là encoder tuyệt đối và encoder tương đối.
Với encoder tuyệt đối thì với tín hiệu ta nhận được, sẽ chỉ rõ ràng vị trí của
encoder, chúng ta không cần xử lý gì thêm, cũng biết chính xác vị trí của
encoder.
Còn incremental encoder, là loại encoder chỉ có 1, 2, hoặc tối đa là 3 vòng lỗ. Ta
có thể hình dung thế này, nếu bây giờ các bạn đục một lỗ trên một cái đĩa quay,
thì cứ mỗi lần đĩa quay 1 vòng, ta sẽ nhận được tín hiệu, và biết đĩa quay một
vòng. Nếu bây giờ các có nhiều lỗ hơn, ta sẽ có được thông tin chi tiết hơn, có
nghĩa là đĩa quay 1/4 vòng, 1/8 vòng, hoặc 1/n vòng, tùy theo số lỗ nằm trên
incremental encoder.
Cứ mỗi lần đi qua một lỗ, chúng ta phải lập trình để thiết bị đo đếm lên 1. Do
vậy, encoder loại này có tên incremental encoder (encoder tăng lên 1 đơn vị).


8


Nguyên lý cơ bản của encoder, đó là một đĩa tròn xoay, quay quanh trục.
Trên đĩa có các lỗ (rãnh). Người ta dùng một đèn led để chiếu lên mặt đĩa. Khi
đĩa quay, chỗ không có lỗ (rãnh), đèn led không chiếu xuyên qua được, chỗ có
lỗ (rãnh), đèn led sẽ chiếu xuyên qua. Khi đó, phía mặt bên kia của đĩa, người
ta đặt một con mắt thu. Với các tín hiệu có, hoặc không có ánh sáng chiếu qua,
người ta ghi nhận được đèn led có chiếu qua lỗ hay không.
Khi trục quay, giả sử trên đĩa chỉ có một lỗ duy nhất, cứ mỗi lần con mắt thu
nhận được tín hiệu đèn led, thì có nghĩa là đĩa đã quay được một vòng.
nguyên lý cơ bản của hoạt động encoder.

9


Với việc sử dụng encoder để đo xung và tính toán tốc độ của động cơ, ta
phải có công thức để có thể tính toán ra được tốc độ của động cơ
V=

60.n
N .T

Với :-V là vận tốc của động cơ (vòng/phút)
-n là số xung xuất ra của 1 kênh trong 1s
-N là số xung của đĩa của động cơ encoder
-T là thời gian lấy mẫu

10



PHẦN 2: MÔ PHỎNG NGUYÊN LÝ VÀ MẠCH IN
2.1 Mạch nguyên lý

2.2 Mạch mô phỏng và mạch in

11


2.3 Nguyên lý hoạt động và phần mềm hỗ trợ
+Mạch sử dụng vi điều khiển PIC 16F877A để đếm các xung xuất ra từ
chân của encoder bằng phương pháp ngắt ngoài và đếm số lần ngắt ngoài đo
được trên chân B0. Sau đó vi điều khiển sẽ tính toán theo công thức đã cho sẵn
và sẽ hiển thị ra LCD tốc độ vòng/phút của động cơ
+Phần mềm thiết kế mạch in: Altium 16
+Phần mềm mô phỏng: Proteus 8.0
+Phần mềm lập trình:MikroC

PHẦN 3: LƯU ĐỒ THUẬT TOÁN VÀ CODE NẠP CHO VI ĐIỀU KHIỂN
3.1 Lưu đồ

12


13


3.2 Chương trình
#include <thth.h>

#include <16f877a.c>
#define LCD_RS PIN_D2
#define LCD_EN PIN_D3
#define LCD_D4 PIN_D4
#define LCD_D5 PIN_D5
#define LCD_D6 PIN_D6
#define LCD_D7 PIN_D7
#include <lcd123.h>
#include <lcd_lcd.c>
#use delay(clock=20000000)
float32 w = 0;//cai dat w=0 voi kieu bien co dau cham dong
long int Dem=0,dem1=0,xung=0,count=0;// Dem xung Encoder, so chu ki Dem++
float32 Get_W(void);// Ngat kenh A
#int_ext
void kenh_A()
{ Dem++; // dem tang
}
#int_timer1
void ngat_timer1()
{
set_timer1(3036);// // Cai dat timer1
count ++;

14


if(count==10)
{ w=get_w();// Tinh van toc w (vong/phut)
}
else

{ count = 0 ;}

// Prescale = 8; tran timer sau 100ms
// T_interrupt = {4*8*[(2^16-1)-timer1]x 1 }/20MHz= 100 ms => gia tri ban dau cua timer 1
=3036 }
void main()
{char so[8];// dinh nghia ham "so"=8 voi kieu char
// Cai dat thong so ban dau
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);// setup 1/4 xung clock, lay thoi gian mau o
che do T1_DIV_BY_8 voi Tmax=104.8ms
ext_int_edge( L_TO_H );// ngat khi co xung canh len
// Khai bao ngat
enable_interrupts(global);// ham khoi tao ngat
enable_interrupts(int_ext);// ngat ngoai
enable_interrupts(int_timer1);// ngat khi timer tran
set_timer1(3036);
LCD_Init();//Ham khoi tao LCD
sprintf(so," Toc do "); //hien thi len LCD gia tri muon hien thi
lcd_Gotoxy(1,2);// toa do
lcd_Puts(so);// xuat ra LCD den
sprintf(so,"dong co");
lcd_Gotoxy(1,8);

15


lcd_Puts(so);
sprintf(so,"vong/phut");
LCD_gotoxy(4,8);
LCD_Puts(so);

LCD_SendCommand( 0x0C);// tat con tro nhap nhay

while(1)//vong lap hien thi toc do lien tuc
{

sprintf(so,"%5.0f",w);
LCD_Gotoxy(2,0);
LCD_Puts(so);
delay_ms(1000);
// Hien thi len LCD
}

}
// Ham tinh van toc goc vong/phut
float32 Get_W(void)
{ float32 tocdo;
Xung = Dem - dem1;
//

Xungencoder: so xung/vong cua encoder

xung: so xung doc duoc giua hai lan ngat lien tiep
thoigianmau: thoi gian(s) lay mau
Quy tac tam xuat:
Xung

giay

tocdo x xungencoder
xung


60

thoigianmau

16


=> tocdo x xungencoder x thoigianmau = xung x 60
=> tocdo = (xung x 60)/( xung encoder x Thoigianmau
// xungencoder = 20 xung/vong
// thoigianmau = 1s
tocdo = 3*(float32)xung;
dem1 = Dem;
return(tocdo);
}

17



×