lOMoARcPSD| 58488183
Chương 5
Hướng dẫn thiết kế một hệ vi điều khiển ứng dụng
5.1 Hướng dẫn thiết kế ứng dụng cho MSP làm báo cáo học phần
5.1.1 Qui trình thực hiện đồ án học phần
Khi nhận được đề tài chúng ta cần tìm hiểu về cơ sở kiến thức liên quan đến đề tài
gồm phần cứng và giải thuật phần mềm để điều khiển. Qui trình thực hiện sau đây rất
cần thiết để giúp các bạn sinh viên có cái nhìn tổng quan về cách thực hiện một đồ án
học phần Kỹ thuật Vi xử lý đạt hiệu quả nhất.
Bước 1: Xác định mục tiêu và giới hạn của đề tài cần đạt được.
Sinh viên phải hỏi lại giáo viên hướng dẫn để xác nhận thông tin cụ thể cho từng
đề tài.
Bước 2: Xây dựng mô hình hóa phần cứng hệ thống thông qua sơ đồ khối
Sinh viên cần phải xây dựng được hình hóa hthống để biết được nguyên
hoạt động hệ thống cần thiết kế, biết được đối tượng nào là ngõ vào cần giám sát, đối
tượng nào cần điều khiển trong hệ thống cũng giúp loại bỏ những thiết kế dư thừa trong
hệ thống. Sau khi xây dựng xong sơ đồ khối hệ thống phần cứng cần thực hiện cho đề
tài, sinh viên nên gặp giáo viên hướng dẫn để thảo luận trao đổi để tối ưu cho đồ
khối hệ thống.
Bước 3: Phân tích, lựa chọn linh kiện thiết kế phần cứng cho từng khối
module có trong hệ thống trên giấy.
Phân tích và lựa chọn linh kiện giúp tối ưu hóa hệ thống làm giảm thời gian, công
sức thiết kế, sử dụng hết khả năng của phần cứng tích hợp nên giảm giá thành thiết kế
cũng như tiết kiệm năng lượng tiêu thụ cho hệ thống. Sau khi phân tích thiết kế phần
cứng cho từng khối chức năng trên giấy hoàn thành, sinh viên nên gặp giáo viên hướng
dẫn để thảo luận và trao đổi để phát hiện sai sót trong thiết kế.
Bước 4: Mô phỏng giả lập kiểm tra hoạt động của từng khối module thiết kế
và toàn hệ thống (nếu cần thiết) bằng phần mềm mô phỏng chuyên dụng
Sinh viên dùng các phần mềm mô phỏng chuyên ngành như Protues, MultiSim vẽ
đồ mạch nguyên phỏng để dự đoán trước kết quả mong muốn cho từng
module phần cứng trong hệ thống. Trong phần mềm mô phỏng có thể sẽ không có đầy
đủ các linh kiện mong muốn trong thiết kế do đó sinh viên nên chọn linh kiện tương
đương để hoàn thành mạch phỏng. Chú ý trong protues cần lựa chọn linh kiện có
tính chất “Schematic model”, không chọn linh kiện tính chất “No simulator model”.
Bước này có thbỏ qua và không cần thiết đối với sinh viên có kỹ năng về thiết kế
phần cứng và kiểm tra mạch. Tuy nhiên, để giảm thiểu chi phí thiết kế và dự trù trước
các phát sinh không mong muốn khác, sinh viên nên thực hiện tốt bước này.
Bước 5: Xây dựng lưu đồ chương trình điều khiển chương trình chính, chương
trình con, các điều kiện rẽ nhánh, chương trình phục vụ ngắt các hàm chức
năng.
lOMoARcPSD| 58488183
Chúng ta cần biết rằng lập trình cho hệ vi điều khiển lập trình điều khiển dựa
trên thiết kế phần cứng thiết kế của hệ thống. Do đó không thể lấy một chương trình
của một đề tài giống như đề tài hiện nạp cho vi điều khiển để điều khiển hệ
thống, với một phần cứng thiết kế khác nhau thì những định nghĩa, những khái báo,
cách sử dụng hàm trong chương trình điều khiển cũng khác nhau.
Sinh viên dựa vào module phần cứng thiết kế của hệ thống để xây dựng giải thuật
điều khiển riêng. dụ như xem bít nào ngõ vào, bít nào dùng cho ngắt ngoài, bit
nào dùng điều khiển LCD, giao tiếp UART,... những khai báo khởi tạo trong
chương trình cũng như sửa lại thư viện điều khiển cho hợp lý nhất.
Bước 6: Tổng hợp tất cả các chương trình và giải thuật phần mềm điều khiển
các module phần cứng riêng lẻ để phát triển thành chương trình ứng dụng
trên hệ thống.
Đây là bước khó nhất đối với người mới làm quen với lập trình cho vi điều khiển
nên cần phải thời gian để hình thành kỹ năng nhất định. Tuy nhiên, để tránh mất
nhiều thời gian cho vấn đề này, chỉ cần người lập trình trình xây dựng đúng giải thuật
điều khiển gắn ghép các chương trình riêng lẽ theo lưu đồ giải thuật xây dựng cho
chương trình chính ban đầu. Thử tổng hợp và tiến hành mô phỏng để kiểm chứng.
Bước 7: Ráp các module phần cứng được thiết kế trên Project Board để kiểm
tra và hiệu chỉnh thực tế từ mạch mô phỏng ở bước 4
Sinh viên cần phải thực hiện bước này để hiệu chỉnh các thông số linh kiện cần
thiết nếu gặp khó khăn trong kiểm tra mạch thì cần nhờ sự giúp đỡ của giáo viên
hướng dẫn.
Bước 8: Hoàn thành đồ nguyên lý hoàn chỉnh cho từng khối module chức
năng.
Vì môi trường mô phỏng trong các phần mềm được xem là điều kiện lý tưởng nên
trong thực tế cần hoàn thiện đầy đủ các điều kiện về nguồn cung cấp, gắn đầy đủ linh
kiện như điện trở, tụ điện, ... cũng như các giá trị của các linh kiện điện tử trong
mạch cần phải tính toán lại cho chính xác. Sinh viên phải hoàn thành đồ mạch
nguyên lý hoàn chỉnh nhất bằng cách dùng một trong các phần mềm sau: Protues hoặc
EAGLE hoặc Atilum hoặc OrCAD. Sau khi hoàn thành đồ nguyên thì chuyển
sang vẽ PCB layout để làm bảng mạch in cho đồ án, thể dùng mạch in một hoặc 2
lớp tùy thích sao cho tiết kiệm và hiệu quả nhất. Lưu ý cần kiểm tra các lỗi khi vẽ PCB
layout để tránh chạm mạch khoảng cách giữa các đường mạch sao cho an toàn,
chống nhiễu tốt phải cách ly giữa mạch sử dụng điện thế AC DC cho an toàn
nhất.
Bước 9: Rửa và khoan mạch in để hàn gắn linh kiện
Sinh viên tập hợp lại nhiều nhóm để mua vật tư (cho tiết kiệm chi phí) về để có thể
tự gia công mạch in hoặc có thể thuê gia công mạch in.
Bước 10: Ráp mạch kiểm tra ngắn mạch, kiểm tra GND V
CC
cung cấp
cho IC và các điểm chung.
Sinh viên phải đo kiểm tra ngắn mạch, cách ly các đường mạch chạm nhau, đo các
điểm cấp nguồn chung trên board mạch, đo kiểm tra tiếp xúc các điểm nghi ngờ hở
mạch trước khi cung cấp nguồn cho board mạch. Nếu chưa đảm bảo, sinh viên có thể
gặp giáo viên hướng dẫn giúp đỡ nếu gặp khó khăn trong khâu kiểm tra này.
lOMoARcPSD| 58488183
Bước 11: Thử test hoạt động của mạch với một chương trình đơn giản nhất
Sinh viên phải đảm bảo rằng trước khi cấp nguồn cho board mạch, phải thực hiện
hoàn tất bước 8. Để kiểm tra mạch hoạt động được hay không, chỉ cần tạo một project
trên IAR và viết một chương trình đơn giản nhất như cho 1 led đơn đã kết nối với 1 bit
của Port bất kỳ hoặc 1 bit của Port bất kỳ trên MSP430 on/off với thời gian 1 giây. Nếu
trong phần cứng thiết có led đơn thì quan sát kết quả trên led còn nếu phần cứng thiết
kế không có kết nối với led đơn thì dùng VOM để đo điện thế ngõ ra trên bit cần kiểm
tra, nếu điện thế đo được thay đổi từ 0 3,3 volt với thời gian qui định thì mạch hoạt
động và ngược lại sẽ không hoạt động. Do đó trong thiết kế phần cứng bất kỳ của một
hệ vi điều khiển cần dùng một bit của Port bất kỳ (nếu tài nguyên I/O còn thừa) để kết
nối với một led đơn và khi đó bít dùng để điều khiển led đơn này được xem là bit trạng
thái để kiểm tra xem vi điều khiển có hoạt động hay không.
Khi đã đảm bảo khối xử lý trung tâm hoạt động thì mới tiến hành viết chương trình
để kiểm tra từng module khối phần cứng còn lại trên hệ thống. Sinh viên cũng cần xem
lại qui trình setup để tạo ra một project chương trình điều khiển trên IAR, chọn chip vi
điều khiển thực tế (có thể khác với chip đang mô phỏng trên Proteus) và đảm bảo khai
báo sử dụng đúng thư viện cho chip vi điều khiển cũng như thư viện cho các module
phần cứng tích hợp trên chip vi điều khiển và ngoại vi thiết kế khác.
Bước 12: Kiểm tra hoạt động của từng module phần cứng
Chuyển đổi chương trình viết để phỏng cho từng module phần cứng riêng lẻ
xuống điều module phần cứng thực tế trên hệ thống. Chúng ta thường nhận thấy kết
quả không giống đã phỏng môi trường phỏng thường được xem môi trường
tưởng nhất. Do đó sinh viên cần một số hiệu chỉnh nhất định như về trị số linh
kiện thực tế, thời gian thiết lập giao thức điều khiển đối với ngoại vi, ... Bên cạnh đó
cũng kiểm tra lại giải thuật của phần mềm điều khiển.
Bước 13: Kết hợp với bước thứ 6 để điều khiển hệ thống thực tế.
Sau khi đã kiểm tra hoạt động của các module phần cứng riêng lẻ, bước tiếp theo
tổng hợp lại chương trình sao cho thể điều khiển mọi hoạt động của hệ thống.
Chú ý phần cứng thiết kế thực tế trên chip thực khác với chip mô phỏng về I/O thực tế
được sử dụng
Nếu gặp bất kỳ khó khăn nào trong quá trình thực hiện đồ án học phần, sinh
viên phải gặp giáo viên hướng dẫn để được tư vấn và chỉ dẫn tốt nhất.
5.1.2 Ví dụ minh họa về qui trình thực hiện đồ án
Đề tài tên Thiết kế và điều khiển hình đo nhiệt độ môi trường hiển thị kết
quả đo được lên LCD.
Bước 1: Xác định mục tiêu và giới hạn của đề tài cần đạt được.
Đối với đề tài đồ án học phần này, mục tiêu và giới hạn của để tài là thiết kế được
hình đo nhiệt độ môi trường hiển thị kết quả đo được trên LCD. Với mục tiêu
này, sinh viên chỉ cần dùng cảm biến nhiệt độ bất kỳ để đo được nhiệt độ (có ngõ ra
dạng số hoặc tương tự), dùng chip vi điều khiển MSP430 bất kỳ để xử số liệu đọc
được từ cảm biến sau đó qui đổi đại lượng vật này hiển thị kết quả đo được lên
LCD với sai số thấp. Do đó để đạt kết quả tốt sinh viên cần chú ý đển các yêu cầu đặt
ra như sau:
lOMoARcPSD| 58488183
- Chọn và sử dụng linh kiện hợp lý nhất, tránh lãng phí tài nguyên
- Thiết kế phải sử dụng được chức năng phần cứng tích hợp trong MSP430 hiện
có để có thể tối ưu nhất định trong thiết kế phần cứng của hệ thống.
- Nhiệt độ đọc được có thể có sai số không quá 5%.
- Trong thiết kế cần phải có ít nhất một ý tưởng phát triển của đề tài và nếu minh
chứng được thông qua kết quả sẽ đạt điểm tốt.
Bước 2: Xây dựng mô hình hóa phần cứng hệ thống thông qua sơ đồ khối
Từ mục tiêu và giới hạn đặt ra cần xây dựng mô hình hóa sơ đồ khối hệ thống như
hình 5-1.
Hình 5-1: Sơ đồ khối hệ thống đo nhiệt độ hiển thị lên LCD
Thay chỉ cần 3 khối gồm: Cảm biến nhiệt độ, bộ xử trung tâm khối hiển
thị LCD thể thực hiện được mục tiêu giới hạn của đề tài đặt ra. Tuy nhiên ta
cần thêm khối phím điều khiển tùy chọn để giúp cho người dùng có thể phát triển thêm
ý tưởng như thiết lập ngưỡng nhiệt độ cần thiết để điều khiển hệ thống cũng như các
chế độ hoạt động khác tùy thích mà không mất thời gian phải thiết kế lại phần cứng hệ
thống.
Bước 3: Phân tích, lựa chọn linh kiện thiết kế phần cứng cho từng khối
module có trong hệ thống trên giấy.
Đối với đề tài này việc lựa chọn linh kiện để thiết kế hệ thống, ta cần thực hiện
theo qui trình sau:
- Trước tiên cần chọn chíp vi điều khiển MSP430 vì dựa vào khả năng tài nguyên
của MSP430 hiện có sẽ giúp ta chọn các linh kiện còn lại thuận tiện hơn. Ví dụ
nếu dùng chíp MSP430 có tích hợp chức năng biến đổi ADC thì chọn cảm biến
nhiệt độ ngõ ra dạng analog, còn nếu chọn chip MSP430 không chức
năng ADC thì chọn cảm biến nhiệt độ có ngõ ra dạng số và tuyệt đối không nên
chọn cảm biến nhiệt độ có ngõ ra dạng analog vì khi đó phải cần chip biến đổi
ADC ngoài, khi đó thiết kế phần cứng phức tạp hơn cũng như khó khăn do hạn
chế ngõ vào ra GPIO của MSP430 dòng bản. Vậy đối với đề tài này chỉ
cần chọn chip MSP430 số chân GPIO ít nhất 10 bit chúng ta cần tối
thiểu 6 bít để điều khiển hiển thị trên LCD,
1 bit cho kênh ngõ vào analog, 3 phím đơn để thiết lập chế độ điều khiển như
tăng giảm nhiệt độ ngưỡng để điều khiển hệ thống. Do đó để thuận tiện cho thiết
kế nên chọn chip MSP430 trong trường hợp này số chân GPIO tối đa 16
bit. Thêm vào đó MSP430 cần phải chức năng biến đổi ADC với độ phân
giải tối thiểu 10 bit. Những chip MSP430 đáp ứng yêu cầu đặt ra thể chọn
MSP430G2452/G2453/2553.
B
ộ xử lý trung tâm
MSP430xxx
C
ảm biến
ệt độ
Phím đi
ều
khi
ển t
ùy ch
ọn
Hi
ển thị nhiệt độ
đo đư
ợc l
ên LCD
lOMoARcPSD| 58488183
- Với chip MSP430 được chọn ta tiến hành chọn cảm biến nhiệt độ loại ngõ
ra là điện thế để có thể dùng chức năng biến đổi ADC được tích hợp trong chip
vi điều khiển. Tùy thuộc vào ứng dụng cụ thể chọn cảm biến nhiệt độ hợp
lý. Trong để tài này do yêu cầu đặt ra cũng đơn giản nên chọn cẩm biến nhiệt
độ thông dụng và dễ tìm đó là LM35.
- Sau cùng là chọn LCD thông dụng trên thị trường sao cho có thể hiển thị được
tối thiểu 2 dòng thông tin.
Tất cả các linh kiện sử dụng trong đề tài, người thiết kế cần nắm vững sở
thuyết về đặc tính kỹ thuật, cấu tạo, nguyên hoạt động, đồ nguyên được nhà
sản xuất khuyên dùng,... dựa vào datasheet của linh kiện đó tìm được trên website
http://www.alldatasheet.com
Bước 4: Mô phỏng giả lập kiểm tra hoạt động của từng khối module thiết kế
và toàn hệ thống (nếu cần thiết) bằng phần mềm mô phỏng chuyên dụng
Do các linh kiện được lựa chọn ở bước 3 có thể không có đầy đủ ở phần mềm mô
phỏng Protues nên chúng ta cần lựa chọn linh kiện tương đương để mô phỏng. Đối với
đề tài này ta cần hoàn thiện sơ đồ mạch mô phỏng như hình 5-2.
Hình 5-2: Sơ đồ mạch mô phỏng hệ thống đo nhiệt độ dùm LM35
Do chip MSP430G2553 không có trong phần mềm Protues nên ta chọn chíp tương
đương MSP430F2112. Về GPIO chip này đến 3 port (port 1, port 2 port 3)
nhiều hơn MSP430G2553 loại 20 chân chỉ 2 Port vào ra (port 1 port 2). Do đó
trong phỏng ta chỉ nên dùng port 1 port 2 của chip MSP430F2112 để sau này
chuyển sang mạch thiết kế thực tế dùng MSP430G2553 không phải xây dựng lại giải
thuật điều khiển, các định nghĩa ngõ vào ra, thư viện sử dụng và cũng như các thiết lập
khác trong chương trình. Cảm biến LM35 được cấp nguồn V
DC
= 5.0V/3.3V, LCd giao
tiếp với vi điều khiển ở chế độ 4 bít để tiết kiệm tài nguyên GPIO.
lOMoARcPSD| 58488183
Bước 5: Xây dựng lưu đồ chương trình điều khiển chương trình chính, chương
trình con, các điều kiện rẽ nhánh, chương trình phục vụ ngắt các hàm chức
năng.
Hình 5-3: Lưu đồ chương trình đọc và điều khiển theo nhiệt độ đơn giản
Để điều khiển được LCD hiển thị thông tin nhiệt độ đo được, ta cần xây dựng các
hàm viết cho LCD. Cộng đồng phát triển ứng dụng cho MSP430 ngày nay được phát
triển rất mạnh nên một số thư viện chuẩn được chia sẽ ngày càng nhiều giúp cho người
mới bắt đầu lập trình cho MSP430 tiếp cận nhanh hơn về dòng vi điều khiển này. Trong
đề tài này chúng ta sử dụng thư viện “LCD_new.h” thông qua các hàm được định nghĩa
lại để xây dựng thành các hàm viết cho LCD theo thiết kế phần cứng như hình 5-2.
Khi sử dụng các hàm xây dựng sẵn cần phải kiểm tra xem thư viện LCD và các
thư viện khác (nếu có) hoạt động tốt chưa, định nghĩa các I/O giống với phần
cứng đang thiết kế của mình chưa?. Nếu chưa đúng thì phải sửa chữa định
nnghĩa lại các I/O trong hàm của thư viện cũng như các thiết lập tiêu chuẩn khác.
Các hàm của thư viện “LCD_New.h” được viết như sau:
#include <msp430.h>
#define MCLK_F 16 // frequency of Master Clock in MHz
typedef unsigned char uchar; union reg
{ unsigned char _byte; struct
bit
B
ắt đầu
Nhi
ệt độ đo đ
ư
ợc
ngư
>
ỡng nhiệt độ
cài đ
ặt ?
Hi
ển thị
ệt độ đo đ
ư
ợc
Hi
ển thị nhiệt độ ng
ư
ỡng c
ài
đ
ặt
S
Đ
Kh
ởi tạo ngắt ngo
ài
Kh
ởi tạo ADC10
Kh
ởi tạo LCD
Hi
ển thị các thông tin về đề t
ài
Đ
ọc nhiệt độ từ cảm biến
Hi
ển thị nhiệt độ đọc đ
ư
ợc
C
ảnh báo
on/off đèn
lOMoARcPSD| 58488183
{ unsigned char b0:1; //bit 0 trong byte
unsigned char b1:1; //bit 1 trong byte unsigned
char b2:1; //bit 2 trong byte unsigned char
b3:1; //bit 3 trong byte unsigned char b4:1;
//bit 4 trong byte unsigned char b5:1; //bit 5
trong byte unsigned char b6:1; //bit 6 trong
byte unsigned char b7:1; //bit 7 trong byte
} _bit;
};
union reg* P3_dir=(union reg*)0x1a;
union reg* P3_out=(union reg*)0x19;
union reg* P3_sel=(union reg*)0x1b; union
reg* P3_in=(union reg*)0x18; union reg*
P3_ren=(union reg*)0x10; 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*
P2_ren=(union reg*)0x2f; 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; union reg*
P1_ren=(union reg*)0x27;
/* Function Set definitions – LCD sử dụng chế độ 4 bit*/
#define FOUR_BIT 0x2C /* 4-bit Interface */ #define
LINES_5X7 0x38 /* 5x7 characters, multiple line */ /*note:
EIGHT_BIT 0x3C == 8-bit Interface
LINE_5X7 0x30 == 5x7 characters, single line
LINE_5X10 0x34 == 5x10 characters */
/* Display ON/OFF Control definitions */
#define DON 0x0F /* Display on */
#define DOFF 0x0B /* Display off */
#define CURSOR_ON 0x0F /* Cursor on */
#define CURSOR_OFF 0x0D /* Cursor off */
lOMoARcPSD| 58488183
#define BLINK_ON 0x0F /* Cursor Blink */
#define BLINK_OFF 0x0E /* Cursor No Blink */
/* Cursor or Display Shift definitions */
#define SHIFT_CUR_LEFT 0x04 /* Cursor shifts to the left */ /*note:
SHIFT_CUR_RIGHT 0x05 == Cursor shifts to the right
SHIFT_DISP_LEFT 0x06 == Display shifts to the left
SHIFT_DISP_RIGHT 0x07 == Display shifts to the right */
#define LCD_RS P1_out -> _bit.b1
#define LCD_RS_DIR P1_dir -> _bit.b1
#define LCD_EN P1_out -> _bit.b3
#define LCD_EN_DIR P1_dir -> _bit.b3
// This driver just help you to "write" LCD, not to read LCD "status".
// So that, you must pull your pin LCD_RW to GND (0V).
#define LCD_DATA_4 P1_out -> _bit.b4
#define LCD_DATA_4_DIR P1_dir -> _bit.b4 #define
LCD_DATA_5 P1_out -> _bit.b5
#define LCD_DATA_5_DIR P1_dir -> _bit.b5 #define
LCD_DATA_6 P1_out -> _bit.b6
#define LCD_DATA_6_DIR P1_dir -> _bit.b6
#define LCD_DATA_7 P1_out -> _bit.b7
#define LCD_DATA_7_DIR P1_dir -> _bit.b7
void lcd_delay_us (unsigned long t)
{int i; for (i = t;
i>0; i-- )
__delay_cycles(MCLK_F); } void
lcd_delay_ms (unsigned long t) {int
i; for (i = t; i>0; i-- )
__delay_cycles(MCLK_F*50); }
// Send a byte of data (rs == 1) or command (rs == 0) to LCD void
lcd_put_byte(unsigned char rs, unsigned char data)
{ LCD_RS = 0;
if(rs) LCD_RS = 1;
lcd_delay_us(20);
LCD_EN = 0;
// send the high nibble
lOMoARcPSD| 58488183
if (data&BIT4) LCD_DATA_4 = 1;
else LCD_DATA_4 = 0;
if (data&BIT5) LCD_DATA_5 = 1;
else LCD_DATA_5 = 0;
if (data&BIT6) LCD_DATA_6 = 1;
else LCD_DATA_6 = 0;
if (data&BIT7) LCD_DATA_7 = 1;
else LCD_DATA_7 = 0;
lcd_delay_us(20);
LCD_EN = 1;
lcd_delay_us(20); LCD_EN
= 0;
// send the low nibble if
(data&BIT0) LCD_DATA_4 = 1;
else LCD_DATA_4 = 0; if
(data&BIT1) LCD_DATA_5 = 1;
else LCD_DATA_5 = 0; if
(data&BIT2) LCD_DATA_6 = 1;
else LCD_DATA_6 = 0; if
(data&BIT3) LCD_DATA_7 = 1;
else LCD_DATA_7 = 0;
lcd_delay_us(20);
LCD_EN = 1;
lcd_delay_us(20); LCD_EN
= 0; }
lOMoARcPSD| 58488183
void lcd_init(void)
{// Set all signal pins as output
LCD_RS_DIR = 1;
LCD_EN_DIR = 1;
LCD_DATA_4_DIR = 1;
LCD_DATA_5_DIR = 1;
LCD_DATA_6_DIR = 1;
LCD_DATA_7_DIR = 1;
LCD_RS = 0; LCD_EN = 0;
lcd_delay_ms(200); // delay for power on
// reset LCD lcd_put_byte(0,0x30); lcd_delay_ms(50);
lcd_put_byte(0,0x30); lcd_delay_ms(50); lcd_put_byte(0,0x32);
lcd_delay_ms(200); // delay for LCD reset lcd_delay_ms(2); //
wait for LCD lcd_put_byte(0,FOUR_BIT & LINES_5X7); // Set
LCD type lcd_delay_ms(2); // wait for LCD
lcd_put_byte(0,DOFF&CURSOR_OFF&BLINK_OFF); // display off
lcd_delay_ms(2); // wait for LCD
lcd_put_byte(0,DON&CURSOR_OFF&BLINK_OFF); // display on
lcd_delay_ms(2); // wait for LCD
lcd_put_byte(0,0x01); // clear display and move cursor to home
lcd_delay_ms(2); // wait for LCD
lcd_put_byte(0,SHIFT_CUR_LEFT); // cursor shift mode
lcd_delay_ms(2); // wait for LCD lcd_put_byte(0,0x01); //
clear display and move cursor to home lcd_delay_ms(2); } // wait for
LCD void lcd_clear(void)
{ lcd_put_byte(0,0x01); // display off
lcd_delay_ms(2); } // wait for LCD void
lcd_gotoxy(unsigned char row, unsigned char col) {
unsigned char address; if(row!=0) address=0x40;
else address=0; address += col;
lcd_put_byte(0,0x80|address); lcd_delay_ms(2); } //
wait for LCD void lcd_putc(char c)
{ switch(c){
case '\f':
lOMoARcPSD| 58488183
lcd_put_byte(0, 0x01);
lcd_delay_ms(2); // wait for LCD
break; case '\n':
lcd_gotoxy(0, 0x01);
break; default:
lcd_put_byte(1, c);
lcd_delay_ms(2); // wait for LCD
break; }}
void lcd_puts(const char* s)
{ while(*s){ lcd_putc(*s++); }
} void lcd_string(unsigned char
*data)
{ char length=16; while(length > 0) // Write data to
LCD up to null { lcd_putc(*data); // Write character
to LCD data++; length--; }}// Increment buffer void
lcd_2l_puts (const char* s1 , const char* s2)
{ lcd_gotoxy (0,0); lcd_puts (s1); lcd_gotoxy (0,1); lcd_puts
(s2);} void lcd_put_num (unsigned long val, char dec, unsigned char
neg) { char i, j, digit,k; long total; long temp; for (i = 0, total =
val; total > 0;i++) // count number total /= 10; total = i; if (neg
!=0 ) lcd_putc ('-'); if ((total - dec) <=0) // if total < dec put 0.xxxx
lcd_putc('0'); else
{ for (i=0; i< (total-dec); i++)
{ temp = 1; for (j=1;j<(total-i);j++) temp
*=10; digit = (val/temp)%10; lcd_putc(digit +
0x30); } } if (dec > 0) { lcd_putc('.'); if ( (dec -
total)> 0) // ex: val = 55; dec = 3 put 0.055
{ for ( i = 0; i < (dec-total);i++)
lcd_putc('0'); k = 0; } else
k = total - dec; for (i=k; i< total;
i++) { temp = 1; for
(j=1;j<(total-i);j++) temp *=10;
digit = (val/temp)%10;
lcd_putc(digit + 0x30);}}} void
lcd_2n(unsigned char x) {
lOMoARcPSD| 58488183
lcd_putc((x/10)+48);
lcd_putc((x%10)+48);} void
lcd_3n(unsigned char x)
{ lcd_putc((x/100)+48); lcd_putc(((x/10)
% 10)+48); lcd_putc((x%10)+48);}}
Bước 6: Tổng hợp tất cả các chương trình và giải thuật phần mềm điều khiển
các module phần cứng riêng lẻ để phát triển thành chương trình ứng dụng
trên hệ thống.
Tạo project trên trình biên dịch IAR để viết chương trình để mô phỏng sơ đồ mạch
hình 5-2. Hãy soạn thảo đoạn chương trình viết sẵn bên dưới trên IAR. Cài đặt cấu hình
cho chương trình phỏng, biên dịch nạp chương trình phỏng cho MSP. Khi
thay đổi giá trị trên LM35, ta thấy kết quả thay đổi như hình 5-4.
#include "msp430g2553.h" #include
"LCD_New.h" void lm35_read();
void canhbao(); unsigned long
nhietdo,nhietdoset=30; void
main(void)
{ WDTCTL=WDTPW|WDTHOLD;
// chon tan so dao dong noi
BCSCTL1 = CALBC1_1MHZ; /* Set DCO to 1MHz */
DCOCTL = CALDCO_1MHZ;
// Khoi tao ngat ngoai cho 2 phim don
P2IE |= 0x06; // P2.1 & P2.2 interrupt enabled
P2IES |= 0x06; // P2.1 & P2.2 Hi/lo edge
P2IFG &= ~0x06; // P2.1 & P2.2IFG cleared
P1DIR = 0xff;
// Khai báo ADC
// tham chieu noi 1,5V, cho phep ngat ADC, bat ADC10, Time lay mau
16*ADC10CLKs
ADC10CTL0 = SREF_1 + ADC10SHT_2 + REFON + ADC10ON + ADC10IE;
__delay_cycles (30);
ADC10CTL1 = INCH_0; // chon kênh ngõ vào A0
ADC10AE0 |= 0x01; // P2.0 ADC option select
// khoi tao LCD lcd_init();//--hàm
khoi tao cho LCD lcd_clear();//--
xoa man hinh LCD
lOMoARcPSD| 58488183
//dinh vi vi tri con tro tren LCD de in ky tu (y,x)
lcd_gotoxy(0,0); // hien thi thong tin ve de tai lcd_puts(" DO AN VI XY LY
"); lcd_gotoxy(1,0); lcd_puts("DO NHIET DO LM35");
__delay_cycles(2000000); lcd_clear(); lcd_gotoxy(0,0); lcd_puts("Giao
vien huong dan"); lcd_gotoxy(1,0); lcd_puts(" TRAN HUU DANH ");
__delay_cycles(2000000); lcd_gotoxy(0,0); lcd_puts("NHIET DO:
C");//--HANG 1 HIEN THI NHIET DO lcd_gotoxy(1,0);
lcd_puts("NHIETDOSET: C"); //--HANG 2 HIEN THI NHIET DO SET.
//__enable_interrupt(); //--cho phet ngat toan cuc.
_BIS_SR(GIE);
while(1) {
lm35_read();
lcd_gotoxy(0,12);
lcd_3n(nhietdo);
lcd_putc(223);
lcd_gotoxy(1,11);
lcd_3n(nhietdoset);
lcd_putc(223);
canhbao();}} void
lm35_read()
{ nhietdo = (unsigned long)(ADC10MEM*1.5*100)/1024;
ADC10CTL0 |= ENC + ADC10SC;} void canhbao()
{ if(nhietdo>nhietdoset)
P1OUT|=BIT2;
__delay_cycles(100000);
P1OUT &=~ BIT2;
__delay_cycles(100000);}
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR (void)
{ __bic_SR_register_on_exit(CPUOFF); }
#pragma vector=PORT2_VECTOR
__interrupt void Port_2(void)
{if (P2IFG & BIT1)
{nhietdoset++;
lOMoARcPSD| 58488183
P2IFG &= ~BIT1;} // P2.1 IFG cleared if
(P2IFG & BIT2)
{nhietdoset--;
P2IFG &= ~BIT2;} } // P2.1 IFG cleared
Hình 5-4: Kết quả mô phỏng của đề tài
Khi ấn phím UP thì nhiệt độ SET sẽ tăng lên 1 đơn vị, còn khi ấn phím DOWN thì
nhiệt độ SET sẽ giảm xuống 1 đơn vị. Khi nhiệt độ đo được lớn hơn nhiệt độ SET thì
led đơn ở bit P1.2 sẽ on/off liên tục để cảnh báo quá nhiệt.
Bước 7: Ráp các module phần cứng được thiết kế trên Project Board để kiểm tra
và hiệu chỉnh thực tế từ mạch mô phỏng ở bước 4
Sinh viên tự kiểm tra thực tế và cần phải các định nghĩa I/O trên chip cần ráp mạch
thực tế. Như vậy chương trình viết cho chip được dùng trong thiết kế khác với chương
trình cho chip mô phỏng chủ yếu ở cấu hình I/O thực tế.
Bước 8: Hoàn thành đồ nguyên hoàn chỉnh cho từng khối module chức
năng.
lOMoARcPSD| 58488183
Hình 5-5: Sơ đồ mạch nguyên lý hoàn thiện theo thực tế
lOMoARcPSD| 58488183
Do trong thực tế chúng ta chọn chip vi điều khiển là MSP430G2553 nên kênh A0
ngõ vào analog nằm bit P1.0 nên bắt buộc chúng ta phải thay đổi thiết như hình
5-5 cụ thể như sau: LCD được kết nối thực tế với port 1 của MSP430G2553, kênh ngõ
vào analog A0 được kết nối với LM35 ở bit P1.0, hai phím đơn UP và DOWN lần lượt
kết nối với bit P1.3 P1.4 led đơn cảnh báo quá nhiệt được kết nối với bit P1.5.
Gắn thêm nguồn, GND, điện trở phân cực, mạch điều chỉnh độ tương phản hiển thị trên
LCD, ....
Do đó chương trình viết hệ thống cần phải định nghĩa lại ngõ vào I/O cho phù hợp
với thiết kế mới thể chạy được trên thực tế. Chương trình thư viên chuẩn
“LCD_new.h” được thay đổi như sau:
Thư viện trên “LCD_new.h” dùng cho chương trình phỏng một số định
nghĩa sau: (đây là các định nghĩa chỉ dẫn hướng I/O)
#define LCD_RS P1_out -> _bit.b1
#define LCD_RS_DIR P1_dir -> _bit.b1
#define LCD_EN P1_out -> _bit.b3
#define LCD_EN_DIR P1_dir -> _bit.b3
#define LCD_DATA_4 P1_out -> _bit.b4
#define LCD_DATA_4_DIR P1_dir -> _bit.b4 #define
LCD_DATA_5 P1_out -> _bit.b5
#define LCD_DATA_5_DIR P1_dir -> _bit.b5 #define
LCD_DATA_6 P1_out -> _bit.b6
#define LCD_DATA_6_DIR P1_dir -> _bit.b6 #define
LCD_DATA_7 P1_out -> _bit.b7
#define LCD_DATA_7_DIR P1_dir -> _bit.b7
Thư viện trên “LCD_new.h” dùng cho chương trình thực tế. Chỉ cần thay các
định nghĩa trên thành các định nghĩa sau: (vì do phần cứng kết nối thực tế với
port 2, tùy theo tình hình thức tế)
#define LCD_RS P2_out -> _bit.b1
#define LCD_RS_DIR P2_dir -> _bit.b1
#define LCD_EN P2_out -> _bit.b3
#define LCD_EN_DIR P2_dir -> _bit.b3
#define LCD_DATA_4 P2_out -> _bit.b4
#define LCD_DATA_4_DIR P2_dir -> _bit.b4 #define
LCD_DATA_5 P2_out -> _bit.b5
#define LCD_DATA_5_DIR P2_dir -> _bit.b5 #define
LCD_DATA_6 P2_out -> _bit.b6
#define LCD_DATA_6_DIR P2_dir -> _bit.b6
#define LCD_DATA_7 P2_out -> _bit.b7
lOMoARcPSD| 58488183
#define LCD_DATA_7_DIR P2_dir -> _bit.b7
Bên cạnh đó cần bổ sung mới một số lệnh sửa lại một số lệnh trên chương trình
chính mô phỏng. Các lệnh thay đổi tương ứng như sau:
Khi báo thêm mới ở chương trình thiết kế
P2DIR =BIT1| BIT3| BIT4| BIT5| BIT6 | BIT7; // định nghĩa P2 là ngõ ra
P2SEL &= ~(BIT6 | BIT7); // su dung chuc nang tich hop
P2SEL2 &= ~(BIT6 | BIT7); // chon bit P2.6 và P2.7 là ngõ ra, P2OUT
&= ~(BIT6 | BIT7); //bỏ chức năng mặc định là ngõ vào dao động.
Sửa lại khởi tạo ngắt cho hai phím đơn như sau
P1IE |= 0x18; // P1.31 & P1.4 interrupt enabled
P1IES |= 0x18; // P1.3 & P1.4 Hi/lo edge
P1IFG &= ~0x18; // P1.3 & P1.4 IFG cleared
Sửa lạ chương trình con phụ vụ ngắt
// Port 2 interrupt service routine
#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{if (P1IFG & BIT3)
{nhietdoset++;
P1IFG &= ~BIT3;} // P1.3 IFG cleared if
(P1IFG & BIT4)
{nhietdoset--;
P1IFG &= ~BIT4;} // P.4 IFG cleared
}
Sửa lạ chương trình con void canhbao() void
canhbao()
{ if(nhietdo>nhietdoset)
P1OUT|=BIT5;
__delay_cycles(100000);
P1OUT &=~ BIT5;
__delay_cycles(100000);}
Bước 9: Rửa và khoan mạch in để hàn gắn linh kiện
Sinh viên có thể sử dụng các phần mềm vẽ mạch điện bất kỳ để tạo ra board PCB
layout. Trong đề tài này ta vẫn dùng protues để mô phỏng và vẽ sơ đồ mạch nguyên lý
theo thực tế như hình 5-5. Chú ý nên chọn những linh kiên footprint để thuận lợi
cho việc xuất ra boar PCB layout một lớp đồng
lOMoARcPSD| 58488183
Hình 5-6: Board PCB layout một lớp đồng vẽ bằng Protues
Bước tiếp theo là tiến hành rửa mạch, khoan lỗ để hàn chân linh kiện, ... Gắn linh kiện
lên board để hàn, ...
Sau cùng tiến hành thực hiện bước 10, bước 11, bước 12 bước 13 theo mô tả
trên.
5.2 Danh sách các đồ án tham khảo
Sau đây một số các đồ án học phần tham khảo với mục tiêu và giới hạn mức
bản nhất nhằm củng cố lại kiến thức thuyết đã học trên lớp. Thời gian nhận đồ
án, chip Vi điều khiển và các linh kiện khác bắt đầu vào tuần thứ 2 của học kỳ. Trong
thời gian học sinh viên cần báo cáo tiến độ thường xuyên và những khó khăn gặp phải
cho giáo viên hướng dẫn để được hỗ trợ kịp thời.
STT
Tên Đồ Án Học Phần
Số lượng
1
Thiết kế điều khiển hình đo vận tốc xe gắn máy cảnh báo
quá tốc độ
1-2 SV
2
Thiết kế và điều khiển mô hình bể nuôi cá cảnh thông minh
1-2 SV
3
Thiết kế và điều khiển mô hình lò ấp trứng tự động
1-2 SV
4
Thiết kế và điều khiển mô hình khóa số điện tử
1-2 SV
5
Thiết kế điều khiển hình hệ thống tưới phun sươn tự động trong
vườn ươm hoa lan
1-2 SV
6
Thiết kế và điều khiển mô hình bảng điểm dùng trong thi đấu thể thao
1-2 SV
7
Thiết kế và điều khiển mô hình máy đếm tôm giống
1-2 SV
8
Thiết kế và điều khiển mô hình trang trại nuôi gà thông minh
1-2 SV
lOMoARcPSD| 58488183
9
Thiết kế và điều khiển mô hình khảo sát và thu thập nhiệt độ có
1-2 SV
giao tiếp PC
10
Thiết kế điều khiển mô hình khảo sát thu thập độ ẩm giao
tiếp PC
1-2 SV
11
Thiết kế và điều khiển mô hình lò sấy nông sản tự động
1-2 SV
12
Thiết kế và điều khiển mô hình xe tự hành
1-2 SV
13
Thiết kế và điều khiển mô hình ươm mầm tự động
1-2 SV
14
Thiết kế và điều khiển mô hình mái che tự động
1-2 SV
15
Thiết kế và điều khiển mô hình hệ thống tưới tiêu theo thời gian thực
1-2 SV
16
Thiết kế và điều khiển mô hình nhà vệ sinh thông minh
1-2 SV
17
Thiết kế và điều khiển mô hình hệ thống bảo quản nông sản trong nhà
kho
1-2 SV
18
Thiết kế điều khiển hình hệ thống giám sát và cảnh báo nguy
cơ cháy nổ trong nhà
1-2 SV
19
Thiết kế điều khiển hình giám sát nhiệt độ và độ ẩm hệ thống
thông gió trong nhà kho
1-2 SV
20
Thiết kế điều khiển hình hệ thống đèn chiếu sáng công cộng
theo thời gian thực
1-2 SV
21
Thiết kế và điều khiển mô hình quản lý nhà gửi xe thông minh
1-2 SV
22
Thiết kế mô hình điều khiển thiết bị AC theo thời gian thực
1-2 SV
23
Thiết kế và điều khiển mô hình bảng thông tin điện tử dùng led ma
trận có thể nhập dữ liệu từ PC
1-2 SV
24
Thiết kế và điều khiển mô hình xào phơi đồ thông minh
1-2 SV
25
Thiết kế và điều khiển mô hình bảng thông tin điện tử dùng trong thi
đấu thể thao
1-2 SV
26
Thiết kế điều khiển hình máy phát sóng tần số thay đổi được
1-2 SV
27
Thiết kế và điều khiển mô hình tưới tự động công viên KCN
1-2 SV
28
Thiết kế điều khiển hình quạt AC theo nhiệt độ hiển thị nhiệt
độ ra 2 led 7 đoạn
1-2 SV
29
Thiết kế điều khiển mô hình hệ thống tưới tự động cho nhà nuôi
trồng nấm
1-2 SV
30
Thiết kế điều khiển hình tưới tự động dùng vườn ươm trong
nhà kín
1-2 SV
31
Thiết kế và điều khiển mô hình báo trộm qua SMS.
1-2 SV
32
Thiết kế và điều khiển mô hình định vị GPS đơn giản
1-2 SV
33
Thiết kế điều khiển hình đèn giao thông dùng MSP430.
đếm ngược thời gian
1-2 SV
34
Thiết kế và điều khiển mô hình chống trôm xe gắn máy
1-2 SV
35
Thiết kế và điều khiển mô hình đo và ổn định tốc độ động cơ DC
1-2 SV
36
Thiết kế và điều khiển mô hình bảng quang thông tin điện tử hiển thị
tỷ giá ngoại tệ và giá vàng có thể nhập liệu từ PC
1-2 SV
lOMoARcPSD| 58488183
37
Thiết kế và điều khiển mô hình cân điện tử đơn giản
1-2 SV
38
Thiết kế và điều khiển mô hình trạm rửa xe tự động
1-2 SV
39
Thiết kế điều khiển mô hình quan trắc các thông số môi trường và
lưu trữ dữ liệu trên PC
1-2 SV
40
Thiết kế và điều khiển mô hình quan trắc các chỉ số độ mặn, đọ
1-2 SV
PH, nồng độ Oxy trong môi trường nuôi trồng thủy hải sản
41
Thiết kế và điều khiển mô hình chuông học đường
1-2 SV
42
Thiết kế và điều khiển mô hình lịch vạn niên
1-2 SV
43
Bảng thông tin điện tử nhập liệu và điều khiển từ xa
1-2 SV
44
Quạt thông minh tự điều khiển theo nhiệt độ môi trường
1-2 SV
45
Thùng rác thông minh có thể tự phân loại rác thải
1-2 SV
46
Thiết kế mô hình thước đo không dây
1-2 SV
47
Thiết kế mô hình cân băng chuyền điện tử
1-2 SV
48
Thiết kế bộ điều khiển và truyền dữ từ xa dùng RF
1-2 SV
49
Thiết kế mạng cảm biến không dây dùng Lora
1-2 SV

Preview text:

lOMoAR cPSD| 58488183 Chương 5
Hướng dẫn thiết kế một hệ vi điều khiển ứng dụng
5.1 Hướng dẫn thiết kế ứng dụng cho MSP làm báo cáo học phần
5.1.1 Qui trình thực hiện đồ án học phần
Khi nhận được đề tài chúng ta cần tìm hiểu về cơ sở kiến thức liên quan đến đề tài
gồm phần cứng và giải thuật phần mềm để điều khiển. Qui trình thực hiện sau đây rất
cần thiết để giúp các bạn sinh viên có cái nhìn tổng quan về cách thực hiện một đồ án
học phần Kỹ thuật Vi xử lý đạt hiệu quả nhất.
Bước 1: Xác định mục tiêu và giới hạn của đề tài cần đạt được.
Sinh viên phải hỏi lại giáo viên hướng dẫn để xác nhận thông tin cụ thể cho từng đề tài.
Bước 2: Xây dựng mô hình hóa phần cứng hệ thống thông qua sơ đồ khối
Sinh viên cần phải xây dựng được mô hình hóa hệ thống để biết được nguyên lý
hoạt động hệ thống cần thiết kế, biết được đối tượng nào là ngõ vào cần giám sát, đối
tượng nào cần điều khiển trong hệ thống cũng giúp loại bỏ những thiết kế dư thừa trong
hệ thống. Sau khi xây dựng xong sơ đồ khối hệ thống phần cứng cần thực hiện cho đề
tài, sinh viên nên gặp giáo viên hướng dẫn để thảo luận và trao đổi để tối ưu cho sơ đồ khối hệ thống.
Bước 3: Phân tích, lựa chọn linh kiện và thiết kế phần cứng cho từng khối
module có trong hệ thống trên giấy.
Phân tích và lựa chọn linh kiện giúp tối ưu hóa hệ thống làm giảm thời gian, công
sức thiết kế, sử dụng hết khả năng của phần cứng tích hợp nên giảm giá thành thiết kế
cũng như tiết kiệm năng lượng tiêu thụ cho hệ thống. Sau khi phân tích và thiết kế phần
cứng cho từng khối chức năng trên giấy hoàn thành, sinh viên nên gặp giáo viên hướng
dẫn để thảo luận và trao đổi để phát hiện sai sót trong thiết kế.
Bước 4: Mô phỏng giả lập kiểm tra hoạt động của từng khối module thiết kế
và toàn hệ thống (nếu cần thiết) bằng phần mềm mô phỏng chuyên dụng
Sinh viên dùng các phần mềm mô phỏng chuyên ngành như Protues, MultiSim vẽ
sơ đồ mạch nguyên lý và mô phỏng để dự đoán trước kết quả mong muốn cho từng
module phần cứng trong hệ thống. Trong phần mềm mô phỏng có thể sẽ không có đầy
đủ các linh kiện mong muốn trong thiết kế do đó sinh viên nên chọn linh kiện tương
đương để hoàn thành mạch mô phỏng. Chú ý trong protues cần lựa chọn linh kiện có
tính chất “Schematic model”, không chọn linh kiện có tính chất “No simulator model”.
Bước này có thể bỏ qua và không cần thiết đối với sinh viên có kỹ năng về thiết kế
phần cứng và kiểm tra mạch. Tuy nhiên, để giảm thiểu chi phí thiết kế và dự trù trước
các phát sinh không mong muốn khác, sinh viên nên thực hiện tốt bước này.
Bước 5: Xây dựng lưu đồ chương trình điều khiển chương trình chính, chương
trình con, các điều kiện rẽ nhánh, chương trình phục vụ ngắt và các hàm chức năng. lOMoAR cPSD| 58488183
Chúng ta cần biết rằng lập trình cho hệ vi điều khiển là lập trình điều khiển dựa
trên thiết kế phần cứng thiết kế của hệ thống. Do đó không thể lấy một chương trình
của một đề tài giống như đề tài hiện có mà nạp cho vi điều khiển để điều khiển hệ
thống, với một phần cứng thiết kế khác nhau thì những định nghĩa, những khái báo,
cách sử dụng hàm trong chương trình điều khiển cũng khác nhau.
Sinh viên dựa vào module phần cứng thiết kế của hệ thống để xây dựng giải thuật
điều khiển riêng. Ví dụ như xem bít nào là ngõ vào, bít nào dùng cho ngắt ngoài, bit
nào dùng điều khiển LCD, giao tiếp UART,... mà có những khai báo khởi tạo trong
chương trình cũng như sửa lại thư viện điều khiển cho hợp lý nhất.
Bước 6: Tổng hợp tất cả các chương trình và giải thuật phần mềm điều khiển
các module phần cứng riêng lẻ để phát triển thành chương trình ứng dụng trên hệ thống.
Đây là bước khó nhất đối với người mới làm quen với lập trình cho vi điều khiển
nên cần phải có thời gian để hình thành kỹ năng nhất định. Tuy nhiên, để tránh mất
nhiều thời gian cho vấn đề này, chỉ cần người lập trình trình xây dựng đúng giải thuật
điều khiển và gắn ghép các chương trình riêng lẽ theo lưu đồ giải thuật xây dựng cho
chương trình chính ban đầu. Thử tổng hợp và tiến hành mô phỏng để kiểm chứng.
Bước 7: Ráp các module phần cứng được thiết kế trên Project Board để kiểm
tra và hiệu chỉnh thực tế từ mạch mô phỏng ở bước 4
Sinh viên cần phải thực hiện bước này để hiệu chỉnh các thông số linh kiện cần
thiết và nếu gặp khó khăn trong kiểm tra mạch thì cần nhờ sự giúp đỡ của giáo viên hướng dẫn.
Bước 8: Hoàn thành sơ đồ nguyên lý hoàn chỉnh cho từng khối module chức năng.
Vì môi trường mô phỏng trong các phần mềm được xem là điều kiện lý tưởng nên
trong thực tế cần hoàn thiện đầy đủ các điều kiện về nguồn cung cấp, gắn đầy đủ linh
kiện như điện trở, tụ điện, ... cũng như các giá trị của các linh kiện điện tử có trong
mạch cần phải tính toán lại cho chính xác. Sinh viên phải hoàn thành sơ đồ mạch
nguyên lý hoàn chỉnh nhất bằng cách dùng một trong các phần mềm sau: Protues hoặc
EAGLE hoặc Atilum hoặc OrCAD. Sau khi hoàn thành sơ đồ nguyên lý thì chuyển
sang vẽ PCB layout để làm bảng mạch in cho đồ án, có thể dùng mạch in một hoặc 2
lớp tùy thích sao cho tiết kiệm và hiệu quả nhất. Lưu ý cần kiểm tra các lỗi khi vẽ PCB
layout để tránh chạm mạch và khoảng cách giữa các đường mạch sao cho an toàn,
chống nhiễu tốt và phải cách ly giữa mạch sử dụng điện thế AC và DC cho an toàn nhất.
Bước 9: Rửa và khoan mạch in để hàn gắn linh kiện
Sinh viên tập hợp lại nhiều nhóm để mua vật tư (cho tiết kiệm chi phí) về để có thể
tự gia công mạch in hoặc có thể thuê gia công mạch in.
Bước 10: Ráp mạch và kiểm tra ngắn mạch, kiểm tra GND và VCC cung cấp
cho IC và các điểm chung.
Sinh viên phải đo kiểm tra ngắn mạch, cách ly các đường mạch chạm nhau, đo các
điểm cấp nguồn chung trên board mạch, đo kiểm tra tiếp xúc các điểm nghi ngờ hở
mạch trước khi cung cấp nguồn cho board mạch. Nếu chưa đảm bảo, sinh viên có thể
gặp giáo viên hướng dẫn giúp đỡ nếu gặp khó khăn trong khâu kiểm tra này. lOMoAR cPSD| 58488183
Bước 11: Thử test hoạt động của mạch với một chương trình đơn giản nhất
Sinh viên phải đảm bảo rằng trước khi cấp nguồn cho board mạch, phải thực hiện
hoàn tất bước 8. Để kiểm tra mạch hoạt động được hay không, chỉ cần tạo một project
trên IAR và viết một chương trình đơn giản nhất như cho 1 led đơn đã kết nối với 1 bit
của Port bất kỳ hoặc 1 bit của Port bất kỳ trên MSP430 on/off với thời gian 1 giây. Nếu
trong phần cứng thiết có led đơn thì quan sát kết quả trên led còn nếu phần cứng thiết
kế không có kết nối với led đơn thì dùng VOM để đo điện thế ngõ ra trên bit cần kiểm
tra, nếu điện thế đo được thay đổi từ 0 3,3 volt với thời gian qui định thì mạch hoạt
động và ngược lại sẽ không hoạt động. Do đó trong thiết kế phần cứng bất kỳ của một
hệ vi điều khiển cần dùng một bit của Port bất kỳ (nếu tài nguyên I/O còn thừa) để kết
nối với một led đơn và khi đó bít dùng để điều khiển led đơn này được xem là bit trạng
thái để kiểm tra xem vi điều khiển có hoạt động hay không.
Khi đã đảm bảo khối xử lý trung tâm hoạt động thì mới tiến hành viết chương trình
để kiểm tra từng module khối phần cứng còn lại trên hệ thống. Sinh viên cũng cần xem
lại qui trình setup để tạo ra một project chương trình điều khiển trên IAR, chọn chip vi
điều khiển thực tế (có thể khác với chip đang mô phỏng trên Proteus) và đảm bảo khai
báo sử dụng đúng thư viện cho chip vi điều khiển cũng như thư viện cho các module
phần cứng tích hợp trên chip vi điều khiển và ngoại vi thiết kế khác.
Bước 12: Kiểm tra hoạt động của từng module phần cứng
Chuyển đổi chương trình viết để mô phỏng cho từng module phần cứng riêng lẻ
xuống điều module phần cứng thực tế trên hệ thống. Chúng ta thường nhận thấy kết
quả không giống đã mô phỏng vì môi trường mô phỏng thường được xem là môi trường
lý tưởng nhất. Do đó sinh viên cần có một số hiệu chỉnh nhất định như về trị số linh
kiện thực tế, thời gian thiết lập giao thức điều khiển đối với ngoại vi, ... Bên cạnh đó
cũng kiểm tra lại giải thuật của phần mềm điều khiển.
Bước 13: Kết hợp với bước thứ 6 để điều khiển hệ thống thực tế.
Sau khi đã kiểm tra hoạt động của các module phần cứng riêng lẻ, bước tiếp theo
là tổng hợp lại chương trình sao cho có thể điều khiển mọi hoạt động của hệ thống.
Chú ý phần cứng thiết kế thực tế trên chip thực khác với chip mô phỏng về I/O thực tế được sử dụng
Nếu gặp bất kỳ khó khăn nào trong quá trình thực hiện đồ án học phần, sinh
viên phải gặp giáo viên hướng dẫn để được tư vấn và chỉ dẫn tốt nhất.
5.1.2 Ví dụ minh họa về qui trình thực hiện đồ án
Đề tài có tên là Thiết kế và điều khiển mô hình đo nhiệt độ môi trường hiển thị kết
quả đo được lên LCD.
Bước 1: Xác định mục tiêu và giới hạn của đề tài cần đạt được.
Đối với đề tài đồ án học phần này, mục tiêu và giới hạn của để tài là thiết kế được
mô hình đo nhiệt độ môi trường và hiển thị kết quả đo được trên LCD. Với mục tiêu
này, sinh viên chỉ cần dùng cảm biến nhiệt độ bất kỳ để đo được nhiệt độ (có ngõ ra
dạng số hoặc tương tự), dùng chip vi điều khiển MSP430 bất kỳ để xử lý số liệu đọc
được từ cảm biến sau đó qui đổi đại lượng vật lý này và hiển thị kết quả đo được lên
LCD với sai số thấp. Do đó để đạt kết quả tốt sinh viên cần chú ý đển các yêu cầu đặt ra như sau: lOMoAR cPSD| 58488183
- Chọn và sử dụng linh kiện hợp lý nhất, tránh lãng phí tài nguyên
- Thiết kế phải sử dụng được chức năng phần cứng tích hợp trong MSP430 hiện
có để có thể tối ưu nhất định trong thiết kế phần cứng của hệ thống.
- Nhiệt độ đọc được có thể có sai số không quá 5%.
- Trong thiết kế cần phải có ít nhất một ý tưởng phát triển của đề tài và nếu minh
chứng được thông qua kết quả sẽ đạt điểm tốt.
Bước 2: Xây dựng mô hình hóa phần cứng hệ thống thông qua sơ đồ khối
Từ mục tiêu và giới hạn đặt ra cần xây dựng mô hình hóa sơ đồ khối hệ thống như hình 5-1. C ảm biến B ộ xử lý trung tâm Hi ển thị nhiệt độ nhi ệt độ MSP430xxx đo đư ợc l ên LCD Phím đi ều khi ển t ùy ch ọn
Hình 5-1: Sơ đồ khối hệ thống đo nhiệt độ hiển thị lên LCD
Thay vì chỉ cần 3 khối gồm: Cảm biến nhiệt độ, bộ xử lý trung tâm và khối hiển
thị LCD là có thể thực hiện được mục tiêu và giới hạn của đề tài đặt ra. Tuy nhiên ta
cần thêm khối phím điều khiển tùy chọn để giúp cho người dùng có thể phát triển thêm
ý tưởng như thiết lập ngưỡng nhiệt độ cần thiết để điều khiển hệ thống cũng như các
chế độ hoạt động khác tùy thích mà không mất thời gian phải thiết kế lại phần cứng hệ thống.
Bước 3: Phân tích, lựa chọn linh kiện và thiết kế phần cứng cho từng khối
module có trong hệ thống trên giấy.
Đối với đề tài này việc lựa chọn linh kiện để thiết kế hệ thống, ta cần thực hiện theo qui trình sau:
- Trước tiên cần chọn chíp vi điều khiển MSP430 vì dựa vào khả năng tài nguyên
của MSP430 hiện có sẽ giúp ta chọn các linh kiện còn lại thuận tiện hơn. Ví dụ
nếu dùng chíp MSP430 có tích hợp chức năng biến đổi ADC thì chọn cảm biến
nhiệt độ có ngõ ra dạng analog, còn nếu chọn chip MSP430 không có chức
năng ADC thì chọn cảm biến nhiệt độ có ngõ ra dạng số và tuyệt đối không nên
chọn cảm biến nhiệt độ có ngõ ra dạng analog vì khi đó phải cần chip biến đổi
ADC ngoài, khi đó thiết kế phần cứng phức tạp hơn cũng như khó khăn do hạn
chế ngõ vào ra GPIO của MSP430 ở dòng cơ bản. Vậy đối với đề tài này chỉ
cần chọn chip MSP430 có số chân GPIO ít nhất là 10 bit vì chúng ta cần tối
thiểu 6 bít để điều khiển hiển thị trên LCD,
1 bit cho kênh ngõ vào analog, 3 phím đơn để thiết lập chế độ điều khiển như
tăng giảm nhiệt độ ngưỡng để điều khiển hệ thống. Do đó để thuận tiện cho thiết
kế nên chọn chip MSP430 trong trường hợp này có số chân GPIO tối đa là 16
bit. Thêm vào đó MSP430 cần phải có chức năng biến đổi ADC với độ phân
giải tối thiểu 10 bit. Những chip MSP430 đáp ứng yêu cầu đặt ra có thể chọn MSP430G2452/G2453/2553. lOMoAR cPSD| 58488183
- Với chip MSP430 được chọn ta tiến hành chọn cảm biến nhiệt độ loại có ngõ
ra là điện thế để có thể dùng chức năng biến đổi ADC được tích hợp trong chip
vi điều khiển. Tùy thuộc vào ứng dụng cụ thể mà chọn cảm biến nhiệt độ hợp
lý. Trong để tài này do yêu cầu đặt ra cũng đơn giản nên chọn cẩm biến nhiệt
độ thông dụng và dễ tìm đó là LM35.
- Sau cùng là chọn LCD thông dụng trên thị trường sao cho có thể hiển thị được
tối thiểu 2 dòng thông tin.
Tất cả các linh kiện sử dụng trong đề tài, người thiết kế cần nắm vững cơ sở lý
thuyết về đặc tính kỹ thuật, cấu tạo, nguyên lý hoạt động, sơ đồ nguyên lý được nhà
sản xuất khuyên dùng,... dựa vào datasheet của linh kiện đó tìm được trên website http://www.alldatasheet.com
Bước 4: Mô phỏng giả lập kiểm tra hoạt động của từng khối module thiết kế
và toàn hệ thống (nếu cần thiết) bằng phần mềm mô phỏng chuyên dụng
Do các linh kiện được lựa chọn ở bước 3 có thể không có đầy đủ ở phần mềm mô
phỏng Protues nên chúng ta cần lựa chọn linh kiện tương đương để mô phỏng. Đối với
đề tài này ta cần hoàn thiện sơ đồ mạch mô phỏng như hình 5-2.
Hình 5-2: Sơ đồ mạch mô phỏng hệ thống đo nhiệt độ dùm LM35
Do chip MSP430G2553 không có trong phần mềm Protues nên ta chọn chíp tương
đương là MSP430F2112. Về GPIO chip này có đến 3 port (port 1, port 2 và port 3)
nhiều hơn MSP430G2553 loại 20 chân chỉ có 2 Port vào ra (port 1 và port 2). Do đó
trong mô phỏng ta chỉ nên dùng port 1 và port 2 của chip MSP430F2112 để sau này
chuyển sang mạch thiết kế thực tế dùng MSP430G2553 không phải xây dựng lại giải
thuật điều khiển, các định nghĩa ngõ vào ra, thư viện sử dụng và cũng như các thiết lập
khác trong chương trình. Cảm biến LM35 được cấp nguồn VDC = 5.0V/3.3V, LCd giao
tiếp với vi điều khiển ở chế độ 4 bít để tiết kiệm tài nguyên GPIO. lOMoAR cPSD| 58488183
Bước 5: Xây dựng lưu đồ chương trình điều khiển chương trình chính, chương
trình con, các điều kiện rẽ nhánh, chương trình phục vụ ngắt và các hàm chức năng. B ắt đầu Kh ởi tạo ngắt ngo ài Kh ởi tạo ADC10 Kh ởi tạo LCD
Hi ển thị các thông tin về đề t ài
Đ ọc nhiệt độ từ cảm biến
Hi ển thị nhiệt độ đọc đ ư ợc Đ Nhi ệt độ đo đ ư ợc C ảnh báo > ngư ỡng nhiệt độ on/off đèn cài đ ặt ? S
Hi ển thị nhi ệt độ đo đ ư ợc
Hi ển thị nhiệt độ ng ư ỡng c ài đ ặt
Hình 5-3: Lưu đồ chương trình đọc và điều khiển theo nhiệt độ đơn giản
Để điều khiển được LCD hiển thị thông tin nhiệt độ đo được, ta cần xây dựng các
hàm viết cho LCD. Cộng đồng phát triển ứng dụng cho MSP430 ngày nay được phát
triển rất mạnh nên một số thư viện chuẩn được chia sẽ ngày càng nhiều giúp cho người
mới bắt đầu lập trình cho MSP430 tiếp cận nhanh hơn về dòng vi điều khiển này. Trong
đề tài này chúng ta sử dụng thư viện “LCD_new.h” thông qua các hàm được định nghĩa
lại để xây dựng thành các hàm viết cho LCD theo thiết kế phần cứng như hình 5-2.
Khi sử dụng các hàm xây dựng sẵn cần phải kiểm tra xem thư viện LCD và các
thư viện khác (nếu có) có hoạt động tốt chưa, định nghĩa các I/O giống với phần
cứng đang thiết kế của mình chưa?. Nếu chưa đúng thì phải sửa chữa và định
nnghĩa lại các I/O trong hàm của thư viện cũng như các thiết lập tiêu chuẩn khác
.
Các hàm của thư viện “LCD_New.h” được viết như sau: #include
#define MCLK_F 16 // frequency of Master Clock in MHz
typedef unsigned char uchar; union reg { unsigned char _byte; struct bit lOMoAR cPSD| 58488183
{ unsigned char b0:1; //bit 0 trong byte
unsigned char b1:1; //bit 1 trong byte unsigned
char b2:1; //bit 2 trong byte unsigned char
b3:1; //bit 3 trong byte unsigned char b4:1;
//bit 4 trong byte unsigned char b5:1; //bit 5
trong byte unsigned char b6:1; //bit 6 trong
byte unsigned char b7:1; //bit 7 trong byte } _bit; };
union reg* P3_dir=(union reg*)0x1a;
union reg* P3_out=(union reg*)0x19;
union reg* P3_sel=(union reg*)0x1b; union
reg* P3_in=(union reg*)0x18; union reg*
P3_ren=(union reg*)0x10; 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*
P2_ren=(union reg*)0x2f; 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; union reg* P1_ren=(union reg*)0x27;
/* Function Set definitions – LCD sử dụng chế độ 4 bit*/
#define FOUR_BIT 0x2C /* 4-bit Interface */ #define
LINES_5X7 0x38 /* 5x7 characters, multiple line */ /*note:
EIGHT_BIT 0x3C == 8-bit Interface
LINE_5X7 0x30 == 5x7 characters, single line
LINE_5X10 0x34 == 5x10 characters */
/* Display ON/OFF Control definitions */
#define DON 0x0F /* Display on */
#define DOFF 0x0B /* Display off */
#define CURSOR_ON 0x0F /* Cursor on */
#define CURSOR_OFF 0x0D /* Cursor off */ lOMoAR cPSD| 58488183
#define BLINK_ON 0x0F /* Cursor Blink */
#define BLINK_OFF 0x0E /* Cursor No Blink */
/* Cursor or Display Shift definitions */
#define SHIFT_CUR_LEFT 0x04 /* Cursor shifts to the left */ /*note:
SHIFT_CUR_RIGHT 0x05 == Cursor shifts to the right
SHIFT_DISP_LEFT 0x06 == Display shifts to the left
SHIFT_DISP_RIGHT 0x07 == Display shifts to the right */
#define LCD_RS P1_out -> _bit.b1
#define LCD_RS_DIR P1_dir -> _bit.b1
#define LCD_EN P1_out -> _bit.b3
#define LCD_EN_DIR P1_dir -> _bit.b3
// This driver just help you to "write" LCD, not to read LCD "status".
// So that, you must pull your pin LCD_RW to GND (0V).
#define LCD_DATA_4 P1_out -> _bit.b4
#define LCD_DATA_4_DIR P1_dir -> _bit.b4 #define
LCD_DATA_5 P1_out -> _bit.b5
#define LCD_DATA_5_DIR P1_dir -> _bit.b5 #define
LCD_DATA_6 P1_out -> _bit.b6
#define LCD_DATA_6_DIR P1_dir -> _bit.b6
#define LCD_DATA_7 P1_out -> _bit.b7
#define LCD_DATA_7_DIR P1_dir -> _bit.b7
void lcd_delay_us (unsigned long t) {int i; for (i = t; i>0; i-- )
__delay_cycles(MCLK_F); } void
lcd_delay_ms (unsigned long t) {int i; for (i = t; i>0; i-- ) __delay_cycles(MCLK_F*50); }
// Send a byte of data (rs == 1) or command (rs == 0) to LCD void
lcd_put_byte(unsigned char rs, unsigned char data) { LCD_RS = 0; if(rs) LCD_RS = 1; lcd_delay_us(20); LCD_EN = 0; // send the high nibble lOMoAR cPSD| 58488183
if (data&BIT4) LCD_DATA_4 = 1; else LCD_DATA_4 = 0;
if (data&BIT5) LCD_DATA_5 = 1; else LCD_DATA_5 = 0;
if (data&BIT6) LCD_DATA_6 = 1; else LCD_DATA_6 = 0;
if (data&BIT7) LCD_DATA_7 = 1; else LCD_DATA_7 = 0; lcd_delay_us(20); LCD_EN = 1; lcd_delay_us(20); LCD_EN = 0; // send the low nibble if
(data&BIT0) LCD_DATA_4 = 1; else LCD_DATA_4 = 0; if
(data&BIT1) LCD_DATA_5 = 1; else LCD_DATA_5 = 0; if
(data&BIT2) LCD_DATA_6 = 1; else LCD_DATA_6 = 0; if
(data&BIT3) LCD_DATA_7 = 1; else LCD_DATA_7 = 0; lcd_delay_us(20); LCD_EN = 1; lcd_delay_us(20); LCD_EN = 0; } lOMoAR cPSD| 58488183 void lcd_init(void)
{// Set all signal pins as output LCD_RS_DIR = 1; LCD_EN_DIR = 1; LCD_DATA_4_DIR = 1; LCD_DATA_5_DIR = 1; LCD_DATA_6_DIR = 1; LCD_DATA_7_DIR = 1; LCD_RS = 0; LCD_EN = 0;
lcd_delay_ms(200); // delay for power on
// reset LCD lcd_put_byte(0,0x30); lcd_delay_ms(50);
lcd_put_byte(0,0x30); lcd_delay_ms(50); lcd_put_byte(0,0x32);
lcd_delay_ms(200); // delay for LCD reset lcd_delay_ms(2); //
wait for LCD lcd_put_byte(0,FOUR_BIT & LINES_5X7); // Set
LCD type lcd_delay_ms(2); // wait for LCD
lcd_put_byte(0,DOFF&CURSOR_OFF&BLINK_OFF); // display off
lcd_delay_ms(2); // wait for LCD
lcd_put_byte(0,DON&CURSOR_OFF&BLINK_OFF); // display on
lcd_delay_ms(2); // wait for LCD
lcd_put_byte(0,0x01); // clear display and move cursor to home
lcd_delay_ms(2); // wait for LCD
lcd_put_byte(0,SHIFT_CUR_LEFT); // cursor shift mode
lcd_delay_ms(2); // wait for LCD lcd_put_byte(0,0x01); //
clear display and move cursor to home lcd_delay_ms(2); } // wait for
LCD void lcd_clear(void)
{ lcd_put_byte(0,0x01); // display off
lcd_delay_ms(2); } // wait for LCD void
lcd_gotoxy(unsigned char row, unsigned char col)
{
unsigned char address; if(row!=0) address=0x40;
else address=0; address += col;
lcd_put_byte(0,0x80|address); lcd_delay_ms(2); } //
wait for LCD void lcd_putc(char c) { switch(c){ case '\f': lOMoAR cPSD| 58488183 lcd_put_byte(0, 0x01);
lcd_delay_ms(2); // wait for LCD break; case '\n': lcd_gotoxy(0, 0x01); break; default: lcd_put_byte(1, c);
lcd_delay_ms(2); // wait for LCD break; }}
void lcd_puts(const char* s)
{ while(*s){ lcd_putc(*s++); }
} void lcd_string(unsigned char *data)
{ char length=16; while(length > 0) // Write data to
LCD up to null { lcd_putc(*data); // Write character
to LCD data++; length--; }}// Increment buffer void
lcd_2l_puts (const char* s1 , const char* s2)

{ lcd_gotoxy (0,0); lcd_puts (s1); lcd_gotoxy (0,1); lcd_puts
(s2);} void lcd_put_num (unsigned long val, char dec, unsigned char
neg)
{ char i, j, digit,k; long total; long temp; for (i = 0, total =
val; total > 0;i++) // count number total /= 10; total = i; if (neg
!=0 ) lcd_putc ('-'); if ((total - dec) <=0) // if total < dec put 0.xxxx lcd_putc('0'); else
{ for (i=0; i< (total-dec); i++)
{ temp = 1; for (j=1;j<(total-i);j++) temp
*=10; digit = (val/temp)%10; lcd_putc(digit +
0x30); } } if (dec > 0) { lcd_putc('.'); if ( (dec - total)> 0)
// ex: val = 55; dec = 3 put 0.055
{ for ( i = 0; i < (dec-total);i++) lcd_putc('0'); k = 0; } else
k = total - dec; for (i=k; i< total; i++) { temp = 1; for
(j=1;j<(total-i);j++) temp *=10; digit = (val/temp)%10;
lcd_putc(digit + 0x30);}}} void lcd_2n(unsigned char x) { lOMoAR cPSD| 58488183 lcd_putc((x/10)+48); lcd_putc((x%10)+48);} void
lcd_3n(unsigned char x)
{ lcd_putc((x/100)+48); lcd_putc(((x/10)
% 10)+48); lcd_putc((x%10)+48);}}
Bước 6: Tổng hợp tất cả các chương trình và giải thuật phần mềm điều khiển
các module phần cứng riêng lẻ để phát triển thành chương trình ứng dụng trên hệ thống.
Tạo project trên trình biên dịch IAR để viết chương trình để mô phỏng sơ đồ mạch
hình 5-2. Hãy soạn thảo đoạn chương trình viết sẵn bên dưới trên IAR. Cài đặt cấu hình
cho chương trình mô phỏng, biên dịch và nạp chương trình mô phỏng cho MSP. Khi
thay đổi giá trị trên LM35, ta thấy kết quả thay đổi như hình 5-4.
#include "msp430g2553.h" #include
"LCD_New.h" void lm35_read();
void canhbao();
unsigned long nhietdo,nhietdoset=30; void main(void) { WDTCTL=WDTPW|WDTHOLD; // chon tan so dao dong noi
BCSCTL1 = CALBC1_1MHZ; /* Set DCO to 1MHz */ DCOCTL = CALDCO_1MHZ;
// Khoi tao ngat ngoai cho 2 phim don
P2IE |= 0x06; // P2.1 & P2.2 interrupt enabled
P2IES |= 0x06; // P2.1 & P2.2 Hi/lo edge
P2IFG &= ~0x06; // P2.1 & P2.2IFG cleared P1DIR = 0xff; // Khai báo ADC
// tham chieu noi 1,5V, cho phep ngat ADC, bat ADC10, Time lay mau 16*ADC10CLKs
ADC10CTL0 = SREF_1 + ADC10SHT_2 + REFON + ADC10ON + ADC10IE; __delay_cycles (30);
ADC10CTL1 = INCH_0; // chon kênh ngõ vào A0
ADC10AE0 |= 0x01; // P2.0 ADC option select
// khoi tao LCD lcd_init();//--hàm
khoi tao cho LCD lcd_clear();//-- xoa man hinh LCD lOMoAR cPSD| 58488183
//dinh vi vi tri con tro tren LCD de in ky tu (y,x)
lcd_gotoxy(0,0); // hien thi thong tin ve de tai lcd_puts(" DO AN VI XY LY
"); lcd_gotoxy(1,0); lcd_puts("DO NHIET DO LM35");
__delay_cycles(2000000); lcd_clear(); lcd_gotoxy(0,0); lcd_puts("Giao
vien huong dan"); lcd_gotoxy(1,0); lcd_puts(" TRAN HUU DANH ");
__delay_cycles(2000000); lcd_gotoxy(0,0); lcd_puts("NHIET DO:
C");//--HANG 1 HIEN THI NHIET DO lcd_gotoxy(1,0);
lcd_puts("NHIETDOSET: C"); //--HANG 2 HIEN THI NHIET DO SET.
//__enable_interrupt(); //--cho phet ngat toan cuc. _BIS_SR(GIE); while(1) { lm35_read(); lcd_gotoxy(0,12); lcd_3n(nhietdo); lcd_putc(223); lcd_gotoxy(1,11); lcd_3n(nhietdoset); lcd_putc(223); canhbao();}} void lm35_read()
{ nhietdo = (unsigned long)(ADC10MEM*1.5*100)/1024;
ADC10CTL0 |= ENC + ADC10SC;} void canhbao() { if(nhietdo>nhietdoset) P1OUT|=BIT2; __delay_cycles(100000); P1OUT &=~ BIT2; __delay_cycles(100000);}
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR (void)
{ __bic_SR_register_on_exit(CPUOFF); }
#pragma vector=PORT2_VECTOR
__interrupt void Port_2(void) {if (P2IFG & BIT1) {nhietdoset++; lOMoAR cPSD| 58488183
P2IFG &= ~BIT1;} // P2.1 IFG cleared if (P2IFG & BIT2) {nhietdoset--;
P2IFG &= ~BIT2;} } // P2.1 IFG cleared
Hình 5-4: Kết quả mô phỏng của đề tài
Khi ấn phím UP thì nhiệt độ SET sẽ tăng lên 1 đơn vị, còn khi ấn phím DOWN thì
nhiệt độ SET sẽ giảm xuống 1 đơn vị. Khi nhiệt độ đo được lớn hơn nhiệt độ SET thì
led đơn ở bit P1.2 sẽ on/off liên tục để cảnh báo quá nhiệt.
Bước 7: Ráp các module phần cứng được thiết kế trên Project Board để kiểm tra
và hiệu chỉnh thực tế từ mạch mô phỏng ở bước 4
Sinh viên tự kiểm tra thực tế và cần phải các định nghĩa I/O trên chip cần ráp mạch
thực tế. Như vậy chương trình viết cho chip được dùng trong thiết kế khác với chương
trình cho chip mô phỏng chủ yếu ở cấu hình I/O thực tế.
Bước 8: Hoàn thành sơ đồ nguyên lý hoàn chỉnh cho từng khối module chức năng. lOMoAR cPSD| 58488183
Hình 5-5: Sơ đồ mạch nguyên lý hoàn thiện theo thực tế lOMoAR cPSD| 58488183
Do trong thực tế chúng ta chọn chip vi điều khiển là MSP430G2553 nên kênh A0
ngõ vào analog nằm ở bit P1.0 nên bắt buộc chúng ta phải thay đổi thiết kê như hình
5-5 cụ thể như sau: LCD được kết nối thực tế với port 1 của MSP430G2553, kênh ngõ
vào analog A0 được kết nối với LM35 ở bit P1.0, hai phím đơn UP và DOWN lần lượt
kết nối với bit P1.3 và P1.4 và led đơn cảnh báo quá nhiệt được kết nối với bit P1.5.
Gắn thêm nguồn, GND, điện trở phân cực, mạch điều chỉnh độ tương phản hiển thị trên LCD, ....
Do đó chương trình viết hệ thống cần phải định nghĩa lại ngõ vào I/O cho phù hợp
với thiết kế mới có thể chạy được trên thực tế. Chương trình và thư viên chuẩn
“LCD_new.h” được thay đổi như sau:
Thư viện trên “LCD_new.h” dùng cho chương trình mô phỏng có một số định
nghĩa sau: (đây là các định nghĩa chỉ dẫn hướng I/O)
#define LCD_RS P1_out -> _bit.b1
#define LCD_RS_DIR P1_dir -> _bit.b1
#define LCD_EN P1_out -> _bit.b3
#define LCD_EN_DIR P1_dir -> _bit.b3
#define LCD_DATA_4 P1_out -> _bit.b4
#define LCD_DATA_4_DIR P1_dir -> _bit.b4 #define
LCD_DATA_5 P1_out -> _bit.b5
#define LCD_DATA_5_DIR P1_dir -> _bit.b5 #define
LCD_DATA_6 P1_out -> _bit.b6
#define LCD_DATA_6_DIR P1_dir -> _bit.b6 #define
LCD_DATA_7 P1_out -> _bit.b7
#define LCD_DATA_7_DIR P1_dir -> _bit.b7
Thư viện trên “LCD_new.h” dùng cho chương trình thực tế. Chỉ cần thay các
định nghĩa ở trên thành các định nghĩa sau: (vì do phần cứng kết nối thực tế với
port 2, tùy theo tình hình thức tế)
#define LCD_RS P2_out -> _bit.b1
#define LCD_RS_DIR P2_dir -> _bit.b1
#define LCD_EN P2_out -> _bit.b3
#define LCD_EN_DIR P2_dir -> _bit.b3
#define LCD_DATA_4 P2_out -> _bit.b4
#define LCD_DATA_4_DIR P2_dir -> _bit.b4 #define
LCD_DATA_5 P2_out -> _bit.b5
#define LCD_DATA_5_DIR P2_dir -> _bit.b5 #define
LCD_DATA_6 P2_out -> _bit.b6
#define LCD_DATA_6_DIR P2_dir -> _bit.b6
#define LCD_DATA_7 P2_out -> _bit.b7 lOMoAR cPSD| 58488183
#define LCD_DATA_7_DIR P2_dir -> _bit.b7
Bên cạnh đó cần bổ sung mới một số lệnh và sửa lại một số lệnh trên chương trình
chính mô phỏng. Các lệnh thay đổi tương ứng như sau:
Khi báo thêm mới ở chương trình thiết kế
P2DIR =BIT1| BIT3| BIT4| BIT5| BIT6 | BIT7; // định nghĩa P2 là ngõ ra
P2SEL &= ~(BIT6 | BIT7); // su dung chuc nang tich hop
P2SEL2 &= ~(BIT6 | BIT7); // chon bit P2.6 và P2.7 là ngõ ra, P2OUT
&= ~(BIT6 | BIT7); //bỏ chức năng mặc định là ngõ vào dao động.
Sửa lại khởi tạo ngắt cho hai phím đơn như sau
P1IE |= 0x18; // P1.31 & P1.4 interrupt enabled
P1IES |= 0x18; // P1.3 & P1.4 Hi/lo edge
P1IFG &= ~0x18; // P1.3 & P1.4 IFG cleared
Sửa lạ chương trình con phụ vụ ngắt
// Port 2 interrupt service routine #pragma vector=PORT1_VECTOR __interrupt void Port_1(void) {if (P1IFG & BIT3) {nhietdoset++;
P1IFG &= ~BIT3;} // P1.3 IFG cleared if (P1IFG & BIT4) {nhietdoset--;
P1IFG &= ~BIT4;} // P.4 IFG cleared }
Sửa lạ chương trình con void canhbao() void canhbao() { if(nhietdo>nhietdoset) P1OUT|=BIT5; __delay_cycles(100000); P1OUT &=~ BIT5; __delay_cycles(100000);}
Bước 9: Rửa và khoan mạch in để hàn gắn linh kiện
Sinh viên có thể sử dụng các phần mềm vẽ mạch điện bất kỳ để tạo ra board PCB
layout. Trong đề tài này ta vẫn dùng protues để mô phỏng và vẽ sơ đồ mạch nguyên lý
theo thực tế như hình 5-5. Chú ý nên chọn những linh kiên có footprint để thuận lợi
cho việc xuất ra boar PCB layout một lớp đồng lOMoAR cPSD| 58488183
Hình 5-6: Board PCB layout một lớp đồng vẽ bằng Protues
Bước tiếp theo là tiến hành rửa mạch, khoan lỗ để hàn chân linh kiện, ... Gắn linh kiện lên board để hàn, ...
Sau cùng là tiến hành thực hiện bước 10, bước 11, bước 12 và bước 13 theo mô tả ở trên.
5.2 Danh sách các đồ án tham khảo
Sau đây là một số các đồ án học phần tham khảo với mục tiêu và giới hạn ở mức
cơ bản nhất nhằm củng cố lại kiến thức lý thuyết đã học trên lớp. Thời gian nhận đồ
án, chip Vi điều khiển và các linh kiện khác bắt đầu vào tuần thứ 2 của học kỳ. Trong
thời gian học sinh viên cần báo cáo tiến độ thường xuyên và những khó khăn gặp phải
cho giáo viên hướng dẫn để được hỗ trợ kịp thời. Số lượng STT
Tên Đồ Án Học Phần
Thiết kế và điều khiển mô hình đo vận tốc xe gắn máy và cảnh báo 1 1-2 SV quá tốc độ 2
Thiết kế và điều khiển mô hình bể nuôi cá cảnh thông minh 1-2 SV 3
Thiết kế và điều khiển mô hình lò ấp trứng tự động 1-2 SV 4
Thiết kế và điều khiển mô hình khóa số điện tử 1-2 SV
Thiết kế và điều khiển mô hình hệ thống tưới phun sươn tự động trong 5 1-2 SV vườn ươm hoa lan
Thiết kế và điều khiển mô hình bảng điểm dùng trong thi đấu thể thao 6 1-2 SV 7
Thiết kế và điều khiển mô hình máy đếm tôm giống 1-2 SV 8
Thiết kế và điều khiển mô hình trang trại nuôi gà thông minh 1-2 SV lOMoAR cPSD| 58488183 9
Thiết kế và điều khiển mô hình khảo sát và thu thập nhiệt độ có 1-2 SV giao tiếp PC
Thiết kế và điều khiển mô hình khảo sát và thu thập độ ẩm có giao 10 1-2 SV tiếp PC
11 Thiết kế và điều khiển mô hình lò sấy nông sản tự động 1-2 SV
12 Thiết kế và điều khiển mô hình xe tự hành 1-2 SV
13 Thiết kế và điều khiển mô hình ươm mầm tự động 1-2 SV
14 Thiết kế và điều khiển mô hình mái che tự động 1-2 SV
Thiết kế và điều khiển mô hình hệ thống tưới tiêu theo thời gian thực 15 1-2 SV
16 Thiết kế và điều khiển mô hình nhà vệ sinh thông minh 1-2 SV
Thiết kế và điều khiển mô hình hệ thống bảo quản nông sản trong nhà 17 1-2 SV kho
Thiết kế và điều khiển mô hình hệ thống giám sát và cảnh báo nguy 18 1-2 SV cơ cháy nổ trong nhà
Thiết kế và điều khiển mô hình giám sát nhiệt độ và độ ẩm hệ thống 19 1-2 SV thông gió trong nhà kho
Thiết kế và điều khiển mô hình hệ thống đèn chiếu sáng công cộng 20 1-2 SV theo thời gian thực
21 Thiết kế và điều khiển mô hình quản lý nhà gửi xe thông minh 1-2 SV
22 Thiết kế mô hình điều khiển thiết bị AC theo thời gian thực 1-2 SV
Thiết kế và điều khiển mô hình bảng thông tin điện tử dùng led ma 23 1-2 SV
trận có thể nhập dữ liệu từ PC
24 Thiết kế và điều khiển mô hình xào phơi đồ thông minh 1-2 SV
Thiết kế và điều khiển mô hình bảng thông tin điện tử dùng trong thi 25 1-2 SV đấu thể thao
Thiết kế và điều khiển mô hình máy phát sóng có tần số thay đổi được 26 1-2 SV
27 Thiết kế và điều khiển mô hình tưới tự động công viên KCN 1-2 SV
Thiết kế và điều khiển mô hình quạt AC theo nhiệt độ và hiển thị nhiệt 28 1-2 SV độ ra 2 led 7 đoạn
Thiết kế và điều khiển mô hình hệ thống tưới tự động cho nhà nuôi 29 1-2 SV trồng nấm
Thiết kế và điều khiển mô hình tưới tự động dùng vườn ươm trong 30 1-2 SV nhà kín
31 Thiết kế và điều khiển mô hình báo trộm qua SMS. 1-2 SV
32 Thiết kế và điều khiển mô hình định vị GPS đơn giản 1-2 SV
Thiết kế và điều khiển mô hình đèn giao thông dùng MSP430. Có 33 1-2 SV đếm ngược thời gian
34 Thiết kế và điều khiển mô hình chống trôm xe gắn máy 1-2 SV
35 Thiết kế và điều khiển mô hình đo và ổn định tốc độ động cơ DC 1-2 SV
Thiết kế và điều khiển mô hình bảng quang thông tin điện tử hiển thị 36 1-2 SV
tỷ giá ngoại tệ và giá vàng có thể nhập liệu từ PC lOMoAR cPSD| 58488183
37 Thiết kế và điều khiển mô hình cân điện tử đơn giản 1-2 SV
38 Thiết kế và điều khiển mô hình trạm rửa xe tự động 1-2 SV
Thiết kế và điều khiển mô hình quan trắc các thông số môi trường và 39 1-2 SV
lưu trữ dữ liệu trên PC
40 Thiết kế và điều khiển mô hình quan trắc các chỉ số độ mặn, đọ 1-2 SV
PH, nồng độ Oxy trong môi trường nuôi trồng thủy hải sản
41 Thiết kế và điều khiển mô hình chuông học đường 1-2 SV
42 Thiết kế và điều khiển mô hình lịch vạn niên 1-2 SV
43 Bảng thông tin điện tử nhập liệu và điều khiển từ xa 1-2 SV
44 Quạt thông minh tự điều khiển theo nhiệt độ môi trường 1-2 SV
45 Thùng rác thông minh có thể tự phân loại rác thải 1-2 SV
46 Thiết kế mô hình thước đo không dây 1-2 SV
47 Thiết kế mô hình cân băng chuyền điện tử 1-2 SV
48 Thiết kế bộ điều khiển và truyền dữ từ xa dùng RF 1-2 SV
49 Thiết kế mạng cảm biến không dây dùng Lora 1-2 SV