TÓM TẮT NỘI DUNG CỦA KHOÁ LUẬN TỐT NGHIỆP 
 
Trong khoá luận này tôi đã nghiên cứu vể một loại đầu đo ứng dụng công nghệ vi 
cảm biến tương tự, đó là dùng đầu đo áp suất để đo độ sâu của nước. Từ các đặc trưng 
cơ bản của các bộ cảm biến nói chung cũng như của cảm biến áp suất nói riêng, bản 
luận văn này đã đưa ra cấu trúc cùng nguyên lý hoạt động của đầu đo áp suất - mức 
nước. Đó là một loại đầu đo thuộc loại cảm biến tương tự được chế tạo theo công nghệ 
vi cảm biến áp suất kiểu áp điện trở có độ nhạy và độ ổn định cao. 
Qua việc thực nghiệm đo điện thế lối ra của đầu đo khi tăng hoặc giảm độ sâu 
của nước tôi đã rút ra được một số đặc trưng cơ bản của đầu đo là độ nhạy và độ tuyến 
tính. Đầu đo này sử dụng module XFPM-200KPG của hãng Fujiura - Nhật, có độ phân 
giải 1cm, độ nhạy của đầu đo cỡ 2mV/cm, đầu đo có thể đo được độ sâu của nước 
khoảng 600cm. 
Trong khoá luận này tôi cũng xin giới thiệu về một mạng cảm nhận không dây có 
các nút mạng sử dụng vi điều khiển CC1010 của hãng Chipcon – Nauy. Từ việc 
nghiên cứu các đặc tính của mạng, của nút mạng cảm nhận, chúng tôi đã xây dựng các 
bước để ghép nối đầu đo áp suất với nút mạng đồng thời xây dựng một chương trình 
nhúng truyền nhận không dây qua nút mạng cơ sở và tiến hành thực nghiệm việc 
truyền nhận này qua một số nút mạng. 
MỤC LỤC 
 
MỞ ĐẦU 4 
 
CHưƠNG 1: ĐẦU ĐO ÁP SUẤT - MỨC NưỚC . 6 
1.1. Giới thiệu về cảm biến. . 7 
1.1.1. Khái niệm. 7 
1.1.2. Đặc trưng cơ bản của bộ cảm biến. . 8 
1.1.2.1. Hàm truyền. . 8 
1.1.2.2. Độ lớn của tín hiệu vào. . 9 
1.1.2.3. Sai số và độ chính xác. . 9 
1.1.3. Một số điều về cảm biến nối tiếp và cách ghép nối. 10 
1.2. Các phương pháp đo áp suất. . 11 
1.2.1. Tồng quan về áp suất. . 12 
1.2.2. Nguyên tắc và các phương pháp đo áp suất. 13 
1.2.3. Đầu đo áp suất - mức nước. 16 
1.3. Khảo sát một số đặc trưng của đầu đo: độ nhạy, độ tuyến tính. 21 
1.3.1. Dụng cụ thí nghiệm 21 
1.3.2. Mục đích thí nghiệm. 22 
1.3.3. Đo điện thế lối ra của đầu đo khi giảm độ cao của cột nước. . 22 
1.3.4. Đo điện thế lối ra của đầu đo khi tăng độ cao của cột nước. 27 
1.3.5. Kết luận. . 28 
 
CHưƠNG 2: GHÉP NỐI ĐẦU ĐO VỚI NÚT MẠNG CẢM NHẬN KHÔNG 
DÂY 30 
2.1. Giới thiệu mạng cảm nhận không dây. 30 
2.1.1. Các ứng dụng của mạng cảm nhận. . 30 
2.1.2. Các chỉ tiêu hệ thống. . 32 
2.1.3. Các chỉ tiêu nút mạng. 33 
2.2. Giới thiệu về nút mạng. 35 
2.2.1. Một số vi điều khiển có thể làm nút mạng cảm nhận. 35 
2.2.2. Giới thiệu về vi điều khiển CC1010. . 36 
2.2.2.1. Các đặc điểm chính. . 36 
2.2.2.2. Cổng. . 36 
2.2.2.3. Ngắt. 37 
2.2.2.4. Biến đổi ADC. . 39 
2.2.2.5. Bộ định thời. 39 
2.2.2.6. Bộ thu phát không dây RF (RF transceiver). 40 
2.2.2.6.1. Miêu tả chung. . 40 
2.2.2.6.2. Mạch ứng dụng RF. . 42 
2.2.2.6.3. Điều khiển bộ thu phát RF và quản lý năng lượng. 43 
2.2.2.6.4. Điều chế dữ liệu và các chế độ dữ liệu. 44 
2.2.2.6.5. Tốc độ Baud. . 44 
2.2.2.6.6. Truyền và nhận dữ liệu. . 45 
2.2.2.7. Module CC1010EM. 47 
2.3. Ghép nối nút mạng CC1010 với đầu đo áp suất - mức nước. . 48 
2.4. Kết luận. 49 
 
CHưƠNG 3: CHưƠNG TRÌNH NHÚNG TRUYỀN/NHẬN THÔNG QUA NÚT 
MẠNG CƠ SỞ . 51 
3.1. Giới thiệu về chương trình nhúng. . 51 
3.1.1. Tổng quan về phần mềm nhúng. . 51 
3.1.2. Các bước xây dựng một phần mềm nhúng. . 52 
3.2. Phần mềm nhúng viết cho CC1010. . 52 
3.3. Chương trình khảo sát quan hệ áp suất - độ cao cột nước. . 57 
3.4. Kết luận. 77 
 
PHẦN KẾT LUẬN 78 
PHỤ LỤC . 80 
TÀI LIỆU THAM KHẢO . 83 
 
MỞ ĐẦU 
 
 Trong số các ngành công nghiệp khác nhau các cảm biến áp suất được ứng 
dụng nhiều nhất trong nhiều lĩnh vực. Đó là vì trong các thiết bị cung cấp năng lượng 
thuỷ lực, nhiệt, hạt nhân cần phải đo và theo dõi áp suất một cách liên tục. Nếu áp 
suất vượt ngưỡng cho phép sẽ gây nhiều hậu quả nghiêm trọng đến cơ sở vật chất và 
tính mạng con người. Chính vì vậy, cảm biến áp suất là rất quan trọng trong đời sống. 
 Trong y tế cũng có rất nhiều ứng dụng của cảm biến áp suất như dùng để đo 
huyết áp, nhịp tim và đo nồng độ máu từ xa. 
 Trong khoá luận này chúng ta sẽ khảo sát một số đặc tính của một cảm biến áp 
suất dùng để đo độ sâu của nước. Đây là loại cảm biến có rất nhiều ứng dụng và ý 
nghĩa trong khoa học cũng như trong thực tế, chúng có thể dùng để đo liên tục suốt 
ngày đêm và trong tự động hoá thì ngày càng có lợi. Đặc biệt ứng dụng trong theo dõi 
diễn biến môi trường, thời tiết, ứng dụng trong thu thập thông tin và cảnh báo, thì 
việc theo dõi được một cách liên tục sẽ rất có lợi, phục vụ đắc lực cho con người. 
 Cùng với sự phát triển của khoa học công nghệ, ngày nay có rất nhiều loại đầu 
đo áp suất ra đời với những ưu thế vượt trội, ngày càng đáp ứng nhu cầu sử dụng của 
đời sống. Các loại đầu đo này đạt được độ chính xác càng cao càng tốt, cỡ centimet 
(cm), decimet (dm), thậm chí lên đến hang chục centimet, và chúng có độ tuyến tính 
trên một dải rộng. 
 Để thu thập và xử lý các thông tin từ đầu đo áp suất thì cần phải kết nối đầu đo 
với một số thiết bị khác có thể truyền/nhận, xử lý, tính toán các dữ liệu thông tin đó để 
phục vụ cho những mục đích khác nhau của con người. Một trong các thiết bị đó là 
mạng cảm nhận không dây (Wireless Sensor Network, viết tắt là WSN). 
 Một đặc điểm nổi bật của mạng cảm nhận không dây là sự kết hợp việc cảm 
nhận, tính toán và truyền thông vào một thiết bị nhỏ. Thông qua mạng hình lưới, 
những thiết bị này tạo ra một sự kết nối rộng lớn trong thế giới vật lý. Trong khi khả 
năng của từng thiết bị là rất nhỏ, sự kết hợp hang trăm thiết bị như vậy yêu cầu phải có 
công nghệ mới. 
 Thế mạnh của WSN là khả năng triển khai một số lượng lớn các thiết bị nhỏ có 
thể tự thiết lập cấu hình hệ thống. Sử dụng những thiết bị này để theo dõi theo thời 
gian thực, để giám sát điều kiện môi trường, để theo dõi cấu trúc hoặc hình dạng thiết 
bị. 
 Hầu hết những ứng dụng của WSN là giám sát môi trường từ xa với tần số lấy 
dữ liệu thấp.Chẳng hạn, có thể dễ dàng giám sát sự rò rỉ của một nhà máy hóa chất bời 
hang trăm cảm biến tự động kết nối thành hệ thống mạng không dây để ngay lập tức 
phát hiện và thông báo có sự rò rỉ. Không giống những hệ thống có dây truyền thống, 
chi phí triển khai cho WSN được giảm thiểu. Thay vì hang ngàn mét dây dẫn thông 
qua các ống dẫn bảo vệ, người lắp đặt chỉ việc đơn giản là đặt thiết bị nhỏ gọn vào nơi 
cần thiết. Mạng có thể được mở rộng chỉ bằng cách đơn giản là thêm các thiết bị, 
không cần các thao tác phức tạp như trong hệ thống mạng có dây. Hệ thống cũng có 
khả năng hoạt động trong vài năm chỉ với một nguồn pin duy nhất. 
 Nhìn chung, khi nói đến mạng không dây thì người ta thương sẽ nghĩ đến các 
thiết bị di động, PDA hay laptop. Đó là những thiết bị có giá thành cao, được ứng dụng 
theo một mục đích cho trước, và dựa trên cơ sở hạ tầng đã có sẵn. Ngược lại, mạng 
cảm nhận không dây lại sử dụng các thiết bị nhúng nhỏ, giá thành thấp cho các ứng 
dụng đa dạng và không dựa trên bất kì cơ sở hạ tầng nào đã sẵn có từ trước. Không 
giống các thiết bị không dây truyền thống, các nút mạng WSN không cần truyền trực 
tiếp tới trạm gốc, mà chỉ cần truyền tới mạng gần nó, rồi lần lượt truyền vể trạm gốc 
theo dạng truyền thông multihop. 
 Một thách thức cơ bản của WSN là đưa các ràng buộc khắt khe vào chỉ trong 
một thiết bị đơn lẻ. Rất nhiều ràng buộc đối với các thiết bị được triển khai với số 
lượng lớn cần có kích thước nhỏ và giá thành thấp. Kích thước giảm là điều chủ yếu 
dẫn đến giá thành giảm cũng như khả năng cho phép được sử dụng trong một dải rộng 
các ứng dụng. 
 Một khó khăn lớn của WSN là năng lượng tiêu thụ. Kích thước vật lý giảm thì 
cũng làm giảm năng lượng tiêu thụ, các ràng buộc về năng lượng sẽ tạo nên những 
giới hạn tính toán. 
 Bản luận văn “Ghép nối đầu đo áp suất cho nút mạng cảm nhận không dây 
với phần mềm nhúng” sẽ giới thiệu về một loại vi cảm biến thuộc công nghệ MEMS 
là đầu đo áp suất - mức nước, khảo sát một số đặc trưng của đầu đo như độ nhạy, độ 
tuyến tính, khả năng làm việc Đồng thời bản luận văn này cũng khái quát hoá về 
mạng cảm nhận không dây WSN và xây dựng một thử nghiệm mạng cảm nhận không 
dây dùng vi điều khiển CC1010 của hãng Chipcon – Nauy. 
 Bản luận văn gồm 3 chương nội dung, phần mở đầu, phần kết luận, phần phụ 
lục và tài liệu tham khảo. 
 Chương 1: Đầu đo áp suất - mức nước sẽ tổng quát về đầu đo, các đặc trưng cơ 
bản của cảm biến, đưa ra các phương pháp đo áp suất cùng các đặc trưng chính của 
đầu đo. 
 Chương 2: Ghép nối đầu đo với nút mạng cảm nhận không dây. Chương này sẽ 
giới thiệu qua về mạng cảm nhận không dây và nút mạng cơ sở dùng vi điều khiển 
CC1010, đồng thời chỉ ra phương thức kết nối giữa đầu đo và nút mạng. 
 Chương 3: Chương trình nhúng truyền/ nhận thông qua nút mạng cơ sở. 
Chương này giới thiệu về phần mềm nhúng, các bước xây dựng một phần mềm nhúng 
và chương trình nhúng cụ thể dùng để ghép nối đầu đo cảm biến cho nút mạng không 
dây cơ sở. 
 Phần kết luận tổng kết những công việc đã thực hiện và những kết quả đã đạt 
được, đồng thời đề cập đến công việc và hướng nghiên cứu trong tương lai. 
 Để hoàn thành được khoá luận này là nhờ sự hướng dẫn tận tình của PGS 
TS.Vương Đạo Vy, thuộc Khoa Điện tử - Viễn thông, trường Đại học Công nghệ, Đại 
học Quốc gia Hà Nội, người đã giúp đỡ tôi rất nhiều trong suốt quá trình thực hiện 
khoá luận. Tôi xin chân thành gửi tới thầy lời cảm ơn sâu sắc nhất.
                
              
                                            
                                
            
 
            
                 84 trang
84 trang | 
Chia sẻ: lvcdongnoi | Lượt xem: 2811 | Lượt tải: 1 
              
            Bạn đang xem trước 20 trang tài liệu Đề tài Ghép nối đầu đo áp suất cho nút mạng cảm nhận không dây với phần mềm nhúng, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
au: 
- 13 bit Timer/Counter (mode 0). 
- 16 bit Timer/Counter (mode 1). 
- 8 bit Timer/Counter tự động nạp lại (mode 2). 
- 2 Timer 8 bit (chỉ dùng cho Timer 0, mode 0). 
 40 
Chi tiết về các chế độ, cách điều khiển sử dụng hai thanh ghi TMOD và TCON 
xin xem thêm phần Tài liệu tham khảo [4]. 
Timer 2 / Timer 3: 
Ngoài tính năng như bộ định thời, Timer 2 và 3 có thể được sử dụng như bộ điều 
chế độ rộng xung PWM. Nếu bít TCON2.M2/TCON2.M3 = 0 thì chúng sẽ là bộ định 
thời, nếu CON2.M2/TCON2.M3 = 1 thì sẽ là PWM. Khi đó chân P3.4 và chân P3.5 là 
chân phát xung đầu ra tương ứng cho Timer2/ Timer3. chu kì TnPWM đối với timer n 
như sau (n = 2, 3): 
fsystem
T
TnPRE
nP
)1.(255
WM
Trong đó thời gian trạng thái cao Tnh là: 
fsystem
Tn
T
TnPRE
nhP
)1.(
WM
Điều này có nghĩa là trong chế độ PWM, nếu Tn = 0 thì có mức thấp ở đầu ra và 
nếu Tn = 255 thì có mức cao. 
Trong đó thanh ghi Tn và TnPRE được đặt từ trước. 
2.2.2.6. Bộ thu phát không dây RF (RF transceiver). 
2.2.2.6.1. Miêu tả chung. 
Bộ thu phát CC1010 UHF RF được thiết kế chững ứng dụng tiêu thụ năng lượng 
thấp và điện áp thấp. Mạch thu phát được dành cho ISM (Industrial, Scientific and 
Medical) và SRD (Short Range Device) dải tần 315, 433, 868 và 915 MHz, nhưng có 
thể dễ dàng lập trình để hoạt động trong dải tần 300 – 1000 MHz. Các thông số chính 
của CC1010 có thể được lập trình thông qua các thanh ghi chức năng SFRs (Special 
Function Registers), làm cho CC1010 rất mềm dẻo và dễ sử dụng bộ thu phát vô 
tuyến. Bộ thu phát RF đòi hỏi rất ít các thành phần tích cực cho hoạt động của mình. 
 41 
Sơ đồ khối đã được đơn giản hoá của bộ thu phát RF mô tả trong hình 2.1. Ở đó 
chỉ có các chân tín hiệu tương tự được chỉ ra và bus dữ liệu SFR bên trong được dùng 
để thiết lập giao diện RF và để truyền/nhận dữ liệu. 
Trong chế độ nhận, CC1010 được cấu hình như bộ thu đổi tần truyền thống. Tín 
hiệu lối vào RF được khuếh đại bởi bộ khuếch đại ồn thấp LNA (low-noise amplifier) 
và chuyển xuống thành trung tần (intermediate frequency – IF) bởi bộ trộn MIXER. 
Trong trạng thái trung tần (IF STAGE) các tín hiệu chuyển đổi này được khuếch đại và 
lọc trước khi đưa tới bộ giải điều chế DEMOD. Một tín hiệu RSSI hay tín hiệu trung 
tần IF sau khi được trộn được đưa vào chân AD2 (RSSI/IF). Sau giải điều chế, tín hiệu 
số được chuyển vào thanh ghi RFBUF. Các ngắt có thể được phát ứng với mỗi bit 
hoặc byte nhận được (EXIF.RFIF). 
Trong chế độ truyền, tín hiệu ra của một bộ dao động điều khiển bằng điện áp 
VCO (Voltage Controlled Oscilator) được đưa trực tiếp tới bộ khuếch đại công suất 
PA. Lối ra RF là khoá dịch chuyển đổi tần số FSK bởi luồng bít được đưa tới thanh ghi 
RFBUF. Tại đây các ngắt cũng có thể được sinh ra ứng với mỗi bit hay byte.Mạch 
chuyển đổi nội tại T/R giúp cho việc giao tiếp với anten dễ dàng hơn mà chỉ sử dụng 
rất ít các thành phàn ngoại vi. 
Bộ tổ hợp tần số tạo ra tín hiệu dao động bên trong và đưa tín hiệu này tới bộ 
MIXER ở chế độ nhận hoặc đưa tới PA ở chế độ truyền. Bộ tổ hợp tần số bao gồm 
Hình 2.1. Sơ đồ khối của bộ thu phát RF 
 42 
một bộ dao động thạch anh XOSC, một bộ dò pha PD, bộ bơm nạp, bộ lọc, VCO và 
các bộ chia tần (/N và /R). 
2.2.2.6.2. Mạch ứng dụng RF. 
Bộ thu phát RF đòi hỏi rất ít các thiết bị ngoại vi. Một mạch ứng dụng điển hình 
được thể hiện ở hình 2.2. Các giá trị cụ thể của các thành phần xin xem thêm Tài liệu 
tham khảo [4]. 
Hình 2.2: Mạch ứng dụng RF điển hình. 
Tương ứng vào/ra: Cặp C31/L32 là đầu vào của bộ nhận, nội trở của L32 có tác 
dụng định thiên một chiều. C41, L41 và C42 được dùng để tương ứng với bộ truyền có 
trở kháng 50Ω. Bộ chuyển T/R làm cho nó có thể nối với lối vào và ra với nhau và 
tương thích với bộ truyền 50Ω ở cả hai chế độ RX và TX. 
VCO được tích hợp hoàn toàn trừ cuộn cảm L101. 
 43 
Nguồn: các tụ tách và lọc nguồn cung cấp cần được sử dụng (trong sơ đồ mạch 
ứng dụng không chỉ ra phần này). Các tụ này càng đặt gần chân nguồn càng tốt. Vị trí 
và kích thước của tụ tách và lọc nguồn cần được chú ý để đạt được độ nhạy tốt nhất. 
2.2.2.6.3. Điều khiển bộ thu phát RF và quản lý năng lƣợng. 
Thanh ghi RFMAIN điều khiển chế độ hoạt động (RX hay TX), sử dụng hai 
thanh ghi tần số và các chế độ tiết kiệm năng lượng. Theo cách này vi điều khiển 
CC1010 có được sự mềm dẻo để quản lý công suất RF nhằm đạt được chính xác năng 
lượng tiêu thụ đòi hỏi và các ứng dụng chỉ sử dụng pin. Các chế độ năng lượng khác 
nhau được điều khiển thông qua các bít riêng biệt trong thanh ghi RFMAIN. Các bít 
này điều khiển phần RX, TX, bộ tổ hợp tần số và bộ dao động thạch anh.. Sự điều 
khiển riêng biệt này có thể tối ưu hoá để làm cho dòng tiêu thụ thấp nhất có thể trong 
các ứng dụng nào đó. Một thứ tự bật nguồn điển hình để đạt được dòng tiêu thụ thấp 
nhất thể hiện ở hình 2.3. Trong hình vẽ này giả thiết tần số A dùng cho RX và tần số B 
dùng cho TX. Nếu không cần đến trường hợp này thì đảo lại thiết lập cho F_REG. 
RX hay TX 
Bật RX: 
RFMAIN: RXTX=0, 
F_REG=0 
RX_PD=0, FS_PD=0 
CURRENT=”RX 
current” 
Chờ 250 s 
Bật TX: 
PA_POW=00h 
RFMAIN: RXTX=1, 
F_REG=1 
TX_PD=0, FS_PD=0 
CURRENT=”RX 
current” 
Chờ 250 s Chế độ RX Chế độ TX 
Tắt RX: 
RFMAIN: RX_PD=1, 
FS_PD=1 
Tắt TX: 
RFMAIN: TX_PD=1, 
FS_PD=1 
PA_POW=00h 
Tắt RF 
Tắt RF 
Hình 2.3. Tuần tự bật thu phát 
RF 
 44 
2.2.2.6.4. Điều chế dữ liệu và các chế độ dữ liệu. 
Có bốn chế độ dữ liệu khác nhau có thể lập trình được qua 
MODEM0.DATA_FORMAT. Các chế độ này khác nhau ở cách mã hoá dữ liệu, cách 
dữ liệu đến và đi và được chấp nhận, và liệu có sự đồng bộ hóa luồng bit hay không. 
Định dạng dữ liệu cần được chọn trước khi bộ thu phát RF hoạt động. 
Hai trong số các chế độ, chế độ đồng bộ NRZ và chế độ đồng bộ Manchester, 
truyền hay nhận dữ liệu có tốc độ baud được thiết lập trong MODEM0.BAUDRATE. 
Modem thực hiện đồng bộ hoá trong suốt quá trình nhận. các chế độ NRZ và 
Manchester chấp nhận và truyền dữ liệu theo cả hai cách một bit hay một byte trong 
cùng một thời điểm, có thể lập trình được qua RFCON.BYTEMOD. Dữ liệu được 
truyền đi hay nhận về được đặt trong thanh ghi RFBUF. Tuỳ thuộc vào ngắt RF có 
được cho phép hay không (EIE.RFIE) mà việc truyền/nhận dữ liệu có thể được điều 
khiển bởi chương trình phục vụ ngắt hay có thể được thực hiện bằng cách hỏi 
(polling). 
Hai chế độ khác, Transparent mode và UART mode, chỉ đơn giản là truyền dữ 
liệu FSK và thanh ghi RFBUF và UART0, cho phép lựa chọn tốc độ và mã hoá dữ 
liệu. 
Chipcon khuyên dùng các chế độ đồng bộ, các chế độ dữ liệu khác bỏ qua mạch 
quyểt định dữ liệu của bộ thu phát RF và không hỗ trợ chế độ bytemode, chế độ 
Transparent mode chỉ dùng để kiểm thử. 
2.2.2.6.5. Tốc độ Baud. 
Bit điều khiển MODEM0.BAUDRATE thiết lập tốc độ từ 0.6kBaud đến 
76.8kBaud. MODEM0.XOSC_FREQ cũng phải được thiết lập tuỳ vào tinh thể thạch 
anh đang sử dụng. 
Tốc độ baud được tính theo công thức: 
kbaud
f
XO
BAUDRATERF XO
BAUDRATE
6.0
3.6864MHzSC_FREQ
2
_ SC 
Trong đó: RF_BAUDRATE là tốc độ tính theo Baud. 
 BAUDRATE và XOSC_FREQ là các bit điều khiển trong MODEM0. 
Sử dụng một trong các thạch anh chuẩn đặt trong MODEM0.XOSC_FREQ sẽ 
đặt ra các tốc độ chuẩn 0.6, 1.2, 2.4, 4.8, 9.6, 19.2, 38.4, hay 76.8 kbaud. Các tần số 
thạch anh khác nhau sẽ quy định các tốc độ khác nhau. Tốc độ nhỏ hơn 19.2kbaud có 
 45 
thể được tạo ra bởi bất kì tần số thạch anh nào. Tốc độ lớn hơn 19.2kbaud cần có thêm 
các sự kết hợp như đưa ra trong bảng 2.2. 
MODEM0. 
BAUDRAT
E 
/XOSC 
fxosc (MHz) 
RF_BAUDRATE 
(kBaud) 
3.6864 
7.3728 
11.0592 
14.7456 
18.4320 
22.1184 
0.6 0/0 0/1 0/2 0/3 0/4 0/5 
1.2 1/0 1/1 1/2 1/3 1/4 1/5 
2.4 2/0 2/1 2/2 2/3 2/4 2/5 
4.8 3/0 3/1 3/2 3/3 3/4 3/5 
9.6 4/0 4/1 4/2 4/3 4/4 4/5 
19.2 5/0 5/1 5/2 5/3 5/4 5/5 
38.4 NA 5/0 NA 5/1 NA 5/2 
76.8 NA NA NA 5/0 NA NA 
Bảng 2.2: Tốc độ Baud theo tần số thạch anh 
2.2.2.6.6. Truyền và nhận dữ liệu. 
Trong chế độ Transparent hay UART dữ liệu đi hay đến được đưa trực tiếp tới bộ 
điều chế trong chế độ truyền và được nhận trực tiếp trong chế độ nhận. 
Trong các chế độ NRZ và Manchester dữ liệu được lưu tại RFBUF như được 
minh hoạ ở hình 2.4. 
Quá trình truyền: 
Khi đặt RFCON.BYTEMODE = 1 thì dữ liệu truyền theo bytemode, một thanh 
ghi 8 bit sẽ dịch từng bit tời bộ điều chế theo nguyên tắc bit cao nhất MSB truyền 
 46 
trước tiên, chu kì phụ thuộc vào tốc độ được lựa chọn. Khi thanh ghi dịch này rỗng sẽ 
nạp một byte mới từ RFBUF và tiếp tục dịch bit. Nội dung của thanh ghi RFBUF 
không thay đổi sau khi thanh ghi dịch này lấy dữ liệu từ nó. Khi một ngắt được tạo ta 
(EICON.RFIF), RFBUF có thể được nạp vào byte dữ liệu mới. Nếu byte mới không 
được nạp trong chu kì 8 bit (chu kì 8bit trong chế độ NRZ và chu kì 16baud trong chế 
độ Manchester) thì thời điểm tiếp theo thanh ghi dịch rỗng sẽ lấy lại dữ liệu cũ của 
thanh ghi RFBUF. 
Ở chế độ bitmode (khi RFCON.BYTEMODE = 0) cũng xảy ra hiện tượng tương 
tự như bytemode nhưng chỉ truyền một bít tại một thời điểm. Theo đó, thanh ghi dịch 
sẽ bạp bit mới từ RFBUF.0 sau khi truyền một bit đi, và ngắt RF được tạo ra để báo có 
bit mới được nạp. Để ghi bit tiếp theo vào RFBUF.0 trong một chu kì bit ở tốc độ cao 
nên sử dụng vòng quét nhanh (tight polling loop) thay vị thủ tục truyền dựa trên ngắt. 
Để bắt đầu truyền dữ liệu ngay khi có thể, bit/byte đầu tiên được truyền được ghi 
vào RFBUF trước khi bộ điều chế hoạt động (RFMAIN.TX_PD = 0). Nó sẽ ngay lập 
tức được nạp vào thanh ghi dịch và một yêu cầu ngắt được tạo ra cho bit/byte thứ hai 
được truyền. Điều này đặc biệt quan trọng khi tính đến việc lưu trữ dữ liệu tại cuối một 
quá trình truyền. 
Khi bit/byte cuối cùng của một frame hay một packet được nạp vào thanh ghi 
dịch nó vẫn không được truyền đi. Như vậy yêu cầu ngắt được tạo ra tại cùng thời 
điểm không bị dừng đối với cả phần tương tự hay số của một quá trình truyền. Quá 
Thanh ghi dịch 8 bit 
RFBUF 
Nhân 8051 
Điều chế 
truyền 
không dây 
Giải điều 
chế nhận 
không dây 
LSB 
Hình 2.4: Đệm dữ liệu RF. Đường gạch là chế độ bit 
 47 
trình truyền không thể kết thúc một cách an toàn cho tới chu kì 9bit cuối cùng của chế 
độ bytemode và chu kì 2bit trong chế độ bitmode, khi bit cuối cùng được dịch và được 
truyền tới anten. 
Một giải pháp đơn giản là luôn luôn truyền 2byte mở rộng trong chế độ 
bytemode hay 2bit mở rộng trong chế độ bitmode ở cuối quá trình truyền dữ liệu. Điều 
này không gây ra vấn đề gì trong thực tế. 
Quá trình nhận: 
Khi nhận dữ liệu, lược đồ nhận sẽ hoạt động ngược với quá trình truyền. Từng bit 
từ bộ giải điều chế được dịch vào thanh ghi dịch 8bit với bit cao nhất MSB trước tiên. 
Khi thanh ghi dịch đầy nó được nạp vào RFBUF và một yêu cầu ngắt được sinh ra 
(EICON.RFIF). Byte cần được đọc trong chu kì 1byte (chu kì 8baud trong chế độ NRZ 
và chu kì 16baud trong chế độ Manchester). Nếu không nó sẽ bị ghi đè bởi byte nhận 
được tiếp theo và dữ liệu sẽ bị mất. 
Trong chế độ bitmode quá trình đệm cũng xảy ra tương tự, nhưng mỗi bit tại một 
thời điểm. Theo đó khi một bit mới tới từ bộ giải điều chế, thanh ghi dịch sẽ lưu nó và 
lưu bit cuối cùng vào RFBUF.0, lần lượt tạo ra các yều cầu ngắt để có thể đọc được 
các bit mới. Để có thể đọc bit tiếp theo từ RFBUF.0 trong chu kì 1bit ở tốc độ cao nên 
sử dụng vòng quét nhanh thay vì dựa vào ngắt. Không có sự cân nhắc đặc biệt nào đối 
với thời điểm bắt đầu hay kết thúc quá trình nhận. 
2.2.2.7. Module CC1010EM. 
Để dễ dàng và thuận tiện cho việc phát triển các ứng dụng sử dụng vi điều khiển 
CC1010, hãng Chipcon cũng cung cấp module CC1010EM (Evaluation Module) trên 
đó có tích hợp hầu hết các linh kiện cần cho việc xây dựng một nút mạng như: 
- Vi điều khiển CC1010. 
- Dao động thạch anh. 
- Antena. 
- Một cảm biến nhiệt độ đưa vào chân AD1. 
- Các chân cổng. 
Module được mô tả trên hình 2.5. 
 48 
Việc xây dựng thử nghiệm trong khuôn khổ khoá luận này chúng tôi cũng dùng 
module CC1010EM. Việc thử nghiệm sau này đã cho thấy rằng module này đã đáp 
ứng được các chức năng cơ bản của nút mạng đó là hai chức năng mạng và cảm nhận. 
2.3. Ghép nối nút mạng CC1010 với đầu đo áp suất - mức nƣớc. 
Trên đây chúng ta đã tìm hiểu về đầu đo áp suất cùng các đặc tính cơ bản của nó 
và chúng tôi cũng đã giới thiệu về nút mạng cảm nhận không dây sử dụng vi điều 
khiển CC1010. Ở phần này sẽ là cách thức ghép nối đầu đo với nút mạng. 
Sơ đồ tổ chức tổng quát của việc ghép nối và truyền nhận dữ liệu như hình 2.6 và 
sơ đồ ghép nối giữa vi điều khiển với đầu đo ở hình 2.7. 
Hình 2.5: Module CC1010EM 
Cảm biến VĐK có tích 
hợp thu phát 
RF (Slave) 
VĐK có tích 
hợp thu phát 
RF (Master) 
Máy tính RS232 
Hình 2.6: Sơ đồ tổng quát của mạng có 2 nút mạng 
Đầu đo áp 
suất - mức 
nước 
CC1010 
VDD VDD 
GND GND 
ADCi 
Hình 2.8: Sơ đồ ghép nối giữa VĐK và đầu đo. 
 49 
Trong đó: ADCi là các lối vào AD0, AD1 và AD2. 
Các lối vào ADCi của CC1010 có điện áp tham chiếu chọn là 1.25V hoặc VDD, 
sử dụng chung một ADC trên cơ sở hợp kênh lối vào. Trong khoá luận này chúng tôi 
chọn tham chiếu cho ADC là VDD, tức là bằng 3.5V, như đã nói ở mục 1.3.3. 
Thí dụ, trong hệ thống nói trên, lối ra của đầu đo sau khi được khuếch đại thì đưa 
tới AD0 và chương trình khởi tạo quá trình chuyển đổi tương tự - số qua ADC phải 
tiến hành bằng lệnh: 
mov ADCON,#0Ch 
Tức là chọn kênh AD0, điện áp tham chiếu 3.5V, bộ biến đổi ADC ở chế độ hoạt 
động. Lệnh bắt đầu chuyển đổi ADC: 
setb ADCRUN 
Khi ADC thực hiện xong việc chuyển đổi tương tự - số, bit ADCRUN tự động 
xoá. Thời gian đợi chuyển đổi được thể hiện qua việc quét bit ADCRUN: 
jb ADCRUN,$ 
Giá trị chuyển đổi đọc ở hai thanh ghi ADDATL(7:0) và ADDATH(9:8). Giá trị 
đọc được từ 0 đến 1023 tương ứng với điện áp lối vào ADC từ 0 đến 3.5V. 
Chương trình đọc giá trị ADC được thực hiện theo các bước sau: 
Bước 1: Khởi tạo ADC: 
- Đặt bộ biến đổi ADC về chế độ single. 
- Đặt điện áp tham chiếu là 3.5V 
Bước 2: Đọc giá trị ADC: 
- Chọn kênh ADC. 
- Ra lệnh đọc ADC. 
- Chờ cho ADC biến đổi xong. 
- Đọc giá trị chuyển đổi. 
 50 
2.4. Kết luận. 
Chương 2 đã giới thiệu khái quát các khái niệm, ứng dụng của mạng cảm nhận 
không dây. Hầu hết các ứng dụng của WSN đều thuộc ba một trong ba ứng dụng là: 
thu thập dữ liệu môi trường, giám sát an ninh và theo dõi đối tượng. Mỗi dạng ứng 
dụng đều có mục đích và nguyên tắc làm việc riêng, qua đó đòi hỏi phải có các hệ 
thống khác nhau, tuy nhiên chúng đều có chung các chỉ tiêu đánh giá hệ thống là giống 
nhau mà tuỳ ứng dụng cụ thể có cách đánh giá các chỉ tiêu đó là khác nhau. 
Chương này cũng đã giới thiệu một số loại vi điều khiển có thể được dùng làm 
nút mạng cảm nhận trong hệ thống WSN theo các tiêu chí: năng lượng tiêu thụ thấp, 
tính mềm dẻo, sức mạnh, tính bảo mật, truyền thông, khả năng tính toán, kích thước 
của nút mạng. Từ đó đã chọn được loại vi điều khiển CC1010 của hãng Chipcon – 
Nauy để làm nút mạng. Đây là loại vi điều khiển tương thích họ 8051 thông dụng, sử 
dụng ngôn ngữ lập trình C và chương trình dịch Keil uVision2. Bên cạnh đó Chipcon 
cũng cung cấp các thư viện làm việc với CC1010 giúp cho việc viết chương trình trở 
nên dễ dàng và thuận tiện hơn. 
Đồng thời chương này đã giới thiệu các bước để giao tiếp giữa vi điều khiển và 
vi cảm biến, cụ thể là với cảm biến đo áp suất - một loại cảm biến tương tự. Việc ghép 
nối giữa cảm biến tương tự và vi điều khiển CC1010 được thực hiện qua ba lối vào 
tương tự của CC1010 là AD0, AD1 và AD2. Từ đó cho thấy rằng CC1010 hoàn toàn 
có thể làm việc tốt với cảm biến tương tự. 
Việc giao tiếp giữa vi điều khiển CC1010 và cảm biến tương tự sử dụng chương 
trình nhúng sẽ được giới thiệu trong chương tiếp theo – chương 3. 
 51 
CHƢƠNG 3 
CHƢƠNG TRÌNH NHÚNG TRUYỀN/NHẬN THÔNG QUA 
NÚT MẠNG CƠ SỞ. 
3.1. Giới thiệu về chƣơng trình nhúng. 
3.1.1. Tổng quan về phần mềm nhúng. 
Phần mềm nhúng đang có những bước đột phá mới tạo ra những cuộc cách mạng 
triệt để trong tương lai. Sự phát triển này xuất phát từ những nhu cầu bức thiết của 
thực tế và những bước tiến mạnh mẽ trong công nghệ phần cứng. Một phần mềm 
nhúng phải kết hợp chặt chẽ với môi trường của nó bao gồm phần cứng và các hệ 
thống liên quan. Nó có những rang buộc vế tốc độ xử lý, dung lượng bộ nhớ và các 
mức tiêu thụ điện năng… Một phần mềm nhúng tốt là phải đảm bảo các yếu tố trên và 
đó cũng là hướng phát triển quan trọng của các phần mềm nhúng. Điểm mấu chốt của 
các phần mềm nhúng hiện nay là việc lựa chọn các phương pháp thực thi của một chức 
năng giống như một thành phần phần cứng nhưng theo một cách riêng. Vì vậy mà 
không thể bỏ đi các tính năng “cứng” của phần mềm như các phần mềm truyền thống 
khác. Một phần mềm nhúng ngày nay được phát triển theo các cách sau: 
- Liên kết phần mềm nhúng từ dưới lên trên, từ các lơp trừu tượng đến các 
chức năng hệ thống. 
- Liên kết phần mềm nhúng với các nền lập trình được – các nền hỗ trợ nó 
cung cấp các phương tiện cần thiết để đánh giá các rang buộc đưa ra có thoả 
mãn nữa hay không. 
Để làm được như vậy thì cần phải phát triển các kĩ thuật hình thức ở mức trừu 
tượng để có những đánh giá sớm cùng các nhóm công cụ và phương pháp đúng đắn. 
Mặt khác cũng cần phải xem xét phần mềm nhúng và kiến trúc phần cứng của nó trong 
một tổng thể hoàn chỉnh. Do phải thoã mãn nhiều yếu tố khác nhau về phần cứng, môi 
trường, giá thành, hiệu năng nên tồn tại nhiều thách thức trong việc phát triển phần 
mềm nhúng hiện nay như: 
 52 
- Tăng cường việc tái sử dụng. 
- Đồng thiết kế phần cứng, phần mềm. 
- Xây dựng mô hình các thuộc tính phi chức năng. 
- Chuyển đổi các phần mềm thành các dịch vụ thông qua các thành phần 
phần mềm. 
- Kiến trúc hệ thống và kiến trúc phần mềm. 
- Đánh giá và kiểm định mức hệ thống. 
- Tương thích phần cứng và phần mềm nhờ các cấu trúc có thể định cấu 
hình lại và các thành phần Plug hay Play. 
- Xây dựng các hệ thống có khả năng tổ hợp được nhờ các thành phần 
phần mềm có thể tái sử dụng. 
3.1.2. Các bƣớc xây dựng một phần mềm nhúng. 
Phần mềm nhúng viết cho họ vi xử lý có thể sử dụng các ngôn ngữ khác nhau 
như C/C++ hoặc Asembler. Tuỳ việc xây dựng hệ thống mà lựa chọn ngôn ngữ thích 
hợp. Từ đó cũng chọn chương trình dịch thích hợp. Ngày nay, do nhu cầu phát triển hệ 
thống nhanh, bảo trì dễ dàng nên ngôn ngữ được lựa chọn thường là ngôn ngữ bậc cao 
như C/C++. 
Quy trình xây dựng một phần mềm bất kì thường trải qua các bước sau: 
- Tìm hiểu bài toán. 
- Phân tích. 
- Thiết kế. 
- Viết chương trình. 
- Kiểm thử. 
Việc xây dựng phần mềm nhúng cũng tuân theo các bước như trên. Ngoài ra, 
phần mềm nhúng còn có đặc trưng là làm việc trực tiếp được với phần cứng. Do đó, để 
kiểm soát quá trình làm việc với các thành phần chấp hành có đúng đắn hay không là 
điều đặc biệt quan trọng. 
 53 
3.2. Phần mềm nhúng viết cho CC1010. 
Phần mềm nhúng viết cho CC1010 được viết bằng ngôn ngữ C, sử dụng các thư 
viện cho CC1010 do hãng Chipcon cung cấp, dùng chương trình biên dịch Keil 
uVision2. 
Chương trình biên dịch Keil uVision 2.0 do hãng Keil Elektronik GmbH xây 
dựng là một môi trường phát triển tích hợp IDE (Integrated Development 
Environment) dùng để xây dựng các chương trình cho các họ vi điều khiển tương thích 
8051 của Intel. Đây là bộ chương trình dịch cho phép người viết chương trình có thể 
soạn thảo chương trình, dịch chương trình và gỡ lỗi trên cùng một môi trường. Chương 
trình dịch này hỗ trợ cho cả ngôn ngữ C và Asembler. 
Hãng Chipcon cũng cung cấp một bộ thư viện tiện ích giúp cho việc xây dựng 
phần mềm cho vi điều khiển CC1010 được dễ dàng và nhanh chóng. 
CC1010IDE dựa trên công cụ phát triển uVision2 của hãng Keil TM Elektronik 
GmbH. Công cụ này cung cấp một khung (framework) cho hầu hết các đặc điểm của 
CC1010IDE và cũng hỗ trợ hầu hết cho các vi điều khiển họ 8051. Trình soạn thảo là 
một công cụ chủ yếu để soạn thảo các file nguồn và file hợp ngữ. Nó cũng cung cấp 
các chức năng trợ giúp khác như giao diện đồ hoạ, mô phỏng, gỡ lỗi… Thêm vào đó, 
IDE cũng cung cấp các giao diện với thư viện liên kết động DLL (Dynamic Linking 
Library) dùng để mô phỏng và gỡ lỗi trên mạch. Một điểm đặc biệt của chương trình 
dịch là có thể chuyển dịch các file nguồn được viết bằng ngôn ngữ C sang dạng hợp 
ngữ để sau đó có thể tối ưu hoá mã lệnh, dạng hợp ngữ sau đó được chuyển thành các 
file đối tượng (mã máy hoặc dữ liệu nhị phân). Cuối cùng, bộ liên kết đưa ra dạng file 
thực thi dạng HEX và có thể nạp vào bộ nhớ Flash của vi điều khiển. 
Mô hình của một phần mềm nhúng viết cho CC1010 như sau: 
Chương trình ứng dụng 
Thư viện C 
chuẩn. 
thư viện tiện ích Chipcon 
(Chipcon Utility Library – CUL) 
thư viện phần cứng (hardware 
abstractiom library – HAL) 
 54 
Bảng 3.1: Mô hình một phần mềm nhúng 
Các file định nghĩa phần cứng HDF: định nghĩa địa chỉ các thanh ghi, ánh xạ 
vector ngắt và các hằng số khác. Chúng cũng thường dùng các macro cho CC1010EB, 
và các định nghĩa hỗ trợ hợp ngữ và ngôn ngữ C. 
Thƣ viện phần cứng HAL: đây là thư viện macro và các hàm truy cập phần 
cứng CC1010 nhằm hỗ trợ việc phát triển chương trình nhanh chóng và dễ dàng. 
Những thư viện nằm trong HAL thi hành một giao tiếp phần cứng trừu tượng đối với 
chương trình người dùng. Nhờ đó chương trình người dùng có thể truy cập ngoại vi 
của vi điều khiển, thông qua các lời gọi hàm/macro, mà không cần hiểu chi tiết vểf 
phần cứng. 
Thư viện HAL hỗ trợ các chức năng sau: 
- Truyền/nhận không dây. 
- Đo cường độ RSSI. 
- Truyền nhận RS232. 
- Làm việc với ADC. 
- Xử lý thời gian thực. 
- Mã hoá DES. 
- Thiết lập các bộ định thời. 
- Làm việc với các cổng. 
Các file định nghĩa phần cứng (hardware 
definition file – HDF) 
 55 
Thƣ viện tiện ích Chipcon CUL: cung cấp một thư viện cho truyền thông RF. 
Thư viện này thường dùng cho những ứng dụng RF điển hình và cung cấp một giao 
thức RF đầy đủ. Các chức năng hỗ trợ của CUL: 
- Truyền/nhận không dây. 
- Tính toán mã dư vòng (CRC). 
- Xử lý thời gian thực. 
Cả hai thư viện HAL và CUL đều hỗ trợ truyền/nhận không dây và xử lý thời 
gian thực. Tuy nhiên, các hàm ở thư viện CUL làm việc ở mức cao hơn, người viết 
chương trình cũng dễ dàng và tiện lợi hơn, nhưng bù lại cũng kém mềm dèo hơn so 
với sử dụng các hàm ở thư viện HAL. Do vậy, đối với những ứng dụng đòi hỏi sự 
phức tạp thì thường dùng thư viện HAL. 
Phần mềm mạng cảm nhận không dây viết cho CC1010: 
Phần mềm viết cho nút mạng CC1010 trong mạng cảm nhận không dây cần thực 
hiện các chức năng sau đây: 
- Cảm nhận. 
- Tính toán. 
- Truyền thông. 
Một khó khăn là phải thực hiện tất cả các công việc này trên một vi điều khiển bị 
ràng buộc về mặt tài nguyên. Điều đó đòi hỏi chương trình viết càng ngắn và càng tốn 
ít bộ nhớ càng tốt, trong khi vẫn đảm bảo việc viết chương trình nhanh, bảo trì và nâng 
cấp dễ dàng. 
Việc cảm nhận và tính toán đã được đề cập chi tiết tại chương 2, con thực hiện 
việc truyền thông thì chương trình sử dụng các hàm trong bộ thư viện HAL củ 
Chipcon. 
Các bước thực hiện truyền thông cho CC1010 như sau: 
 Khởi tạo RF: thiết lập tần số RF, tốc độ truyền, cách điều chế tín hiệu, 
công suất phát. Trong chương trình cụ thể, các thông số trên lần lượt có giá trị là: 
868MHz, 2.4kbps, mã hoá Manchester, 4dBm. Các khai báo này được đặt trong 
một cấu trúc RF_SETTINGS được khai báo như sau: 
 56 
RF_RXTXPAIR_SETTINGS code RF_SETTINGS = { 
 0x4B, 0x2F, 0x15, //modem 0, 1 và 2: Manchester, 2.4kBaud 
 0x75, 0xA0, 0x00, //Freq A 
 0x58, 0x32, 0x8D, //Freq B 
 0x01, 0xAB, //FSEP 1 and 0 
 0x40, //PLL_RX 
 0x30, //PLL_TX 
 0x6C, //CURRENT_RX 
 0xF3, //CURRENT_TX 
 0x32, //FREND 
 0xFF, //PA_POW 4bBm 
 0x00, //MATCH 
 0x00, //PRESCALER 
 }; 
Việc khởi tạo RF theo trình tự như sau: 
halRFCalib(&RF_SETTINGS, &RF_CALDATA); //chuẩn hoá RF 
INT_GLOBAL_ENABLE(INT_OFF); //cấm ngắt toàn 
cục 
INT_SETFLAG(INUM_RF, INT_CLR); //xoá ngắt RF 
INT_PRIORITY(INUM_RF, INT_HIGH); //mức ưu tiên 
ngắt RF là cao 
RF_SET_BYTEMODE(); //RF hoạt động ở 
chế độ byte 
RF_SET_PREMBLE_COUNT(PREAMBLE_BYTE_COUNT); //thiết lập
 số byte dẫn đường 
RF_SET_SYNC_BYTE(RF_SUITABLE_SYNC_BYTE); //thiết lập byte 
đồng bộ 
MODEM1=(MODEM1&0x03)|0x24; //lọc trung bình 
 57 
//Reset preamble detection 
PDET& = ~0x80; 
PDET| = 0x80; 
INT_ENABLE(INUM_RF, INT_OFF); //cấm ngắt RF 
INT_GLOBAL_ENABLE(INT_ON); //cho phép ngắt toàn cục 
 Nhận dữ liệu RF: việc nhận dữ liệu RF thông qua ngắt. Mỗi khi nhận 
được một byte, vi điều khiển sinh ra một ngắt. Chương trình xử lý ngắt có nhiệm vụ 
đưa byte này vào một bộ đệm. Khi toàn bộ gói tin đã nhận xong, ngắt này bị cấm để 
chờ xử lý trong bộ đệm. Quá trình nhận một byte từ bộ đệm RFBUF vào bộ đệm 
chương trình như sau: 
//nhận một byte từ bộ đệm RFBUF vào bộ đệm rf_rx_buf tại vị trí rf_rx_index: 
 Rf_rx_buf[rf_rx_index] = RF_RECEIVE_BYTE(); 
 rf_rx_index ++; 
Byte đầu tiên của bộ đệm chương trình rf_rx_buf[0] lưu độ dài gói tin. Việc 
nhận dữ liệu kết thúc khi rf_tx_index bằng giá trị độ dài gói tin, nghĩa là: 
 rf_rx_index = rf_rx_buf[0]; 
Sau khi toàn bộ gói tin đã được nhận, chương trình sẽ phân tích gói tin, lọc ra 
các dữ liệu cần thiết. Nếu là nút Master, nó sẽ truyền dữ liệu nhận được về máy 
tính qua cổng RS232. Nếu là Slave, nó sẽ thực hiện việc cảm nhận, tính toán rồi 
truyền dữ liệu về Master. 
 Truyền dữ liệu RF: được thực hiện bởi các hàm/macro trong thư viện 
HAL của Chipcon như sau: 
halRFSetRxTxOff(RF_TX, &RF_SETTINGS, &RF_CALDATA); 
 // turn on TX 
 RF_START_TX(); //bắt đầu truyền 
halRFSendPacket(PREAMBLE_BYTE_COUNT, &txDataBuffer[0], 4); 
 //truyền dữ liệu tại txDataBuffer với độ dài là 4 
halRFSetRxTxOff(RF_TX, &RF_SETTINGS, &RF_CALDATA); 
 //turn on RX 
 RF_START_RX(); //bắt đầu chế độ nhận 
 58 
 INT_SETFLAG(INUM_RF, INT_CLR);//xoá cờ ngắt RF 
INT_ENABLE(INUM_RF, INT_ON); //cho phép ngắt RF 
3.3. Chƣơng trình khảo sát quan hệ áp suất - độ cao cột nƣớc. 
Module sensor áp suất được ghép với nút mạng sử dụng vi điều khiển với 
CC1010 và với phần mềm nhúng thích hợp sẽ tạo thành một điểm đo độc lập, tự động 
đo áp suất, xử lý dữ liệu thu được và truyền không dây định kỳ số liệu đo này về một 
nút mạng CC1010 khác nối với máy tính xách tay hoặc máy tính để bàn. Sơ đồ khảo 
sát thực nghiệm như hình 3.1 và các dụng cụa thí nghiệm như hình 3.2. 
Hình 3.1: Sơ đồ ghép nối đầu đo với nút mạng. 
 59 
Hình 3.2: Đầu đo và các nút mạng cảm nhận. 
Độ lớn giá trị tần số để CC1010 cung cấp để cảm biến áp suất thực hiện biến đổi 
ADC, độ lớn gía trị tần số nhịp đồng bộ quá trình truyền và nhận giữa hai vi mạch này, 
cùng các giá trị địa chỉ dữ liệu, việc xử lý các dữ liệu đọc được đều do phần mềm 
nhúng trong CC1010 thực hiện. Phần mềm này còn thực hiện chức năng truyền nhận 
dữ liệu không dây giữa hai CC1010 và truyền về máy tính. Giải thuật của chương trình 
nhúng như sau: 
Khởi tạo các tham số: 
- khởi tạo RF, ADC, TIMER 
- khởi tạo sensor cảm biến 
Đọc ba kênh ADC 
truyền dữ liệu không dây 
nhận dữ liệu không dây 
truyền thông tin về máy tính 
Đọc dữ liệu cảm biến áp suất 
 60 
Hình 3.3: giải thuật phần mềm nhúng trong CC1010 của nút Master. 
Ý nghĩa của các bƣớc trong sơ đồ thuật toán: 
Khởi tạo RF: 
- Mã hoá dữ liệu Manchester. 
- Tốc độ truyền dữ liệu 2.4kbps. 
Khởi tạo ADC: 
- Điện áp tham chiếu 3.5V internal. 
- 10 bit single. 
Khởi tạo timer: 
Sử dụng Timer2 ở chế độ điều chế độ rông xung, tần số 29kHz, dạng xung vuông 
đối xứng, xung này dùng làm Master Clock (MCLK) cho cảm biến áp suất. 
Khởi tạo sensor cảm biến: 
- Đưa các chân lối vào và chân đồng bộ quá trình đọc ghi cho cảm biến về 
trạng thái 0. 
- Đọc các hệ số lưu trong cảm biến áp suất. 
Đọc ba kênh ADC: 
- Chọn kênh cần đọc. 
- Phát lệnh chuyển đổi ADC. 
- Chờ cho đến khi chuyển đổi ADC kết thúc. 
- Đọc giá trị ADC từ hai thanh ghi ADCDATH và ADCDATL. 
Đọc dữ liệu cảm biến áp suất: 
- Reset cảm biến. 
- Gửi lệnh cho cảm biến để chọn tham số cần đọc: nhiệt độ hay áp suất. 
- Đọc dữ liệu trả lời từ cảm biến. 
Chờ nhận lệnh từ máy tính: 
 61 
Nếu có lệnh yêu cầu gửi dữ liệu về trung tâm, Slave sẽ đọc các tham số áp suất 
rồi truyền về trung tâm. 
Chương trình nhúng cụ thể: 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
// Water-height packet: 
#define TBC_NODE_ID_LENGTH 2 // word 
#define TBC_NODE_NAME_LENGTH 20 
#define TBC_TEMP_OFFSET (TBC_NODE_ID_LENGTH + 
 TBC_NODE_NAME_LENGTH) 
#define TBC_TEMP_LENGTH 2 
#define TBC_TEMP0_OFFSET (TBC_TEMP_OFFSET + 
 TBC_TEMP_LENGTH) 
#define TBC_TEMP0_LENGTH 2 
#define TBC_DATA_LEN (TBC_TEMP0_OFFSET + 
 TBC_TEMP0_LENGTH) 
// Radio related: 
#define TBC_MY_SPP_ADDRESS 3 
 62 
#define TBC_RX_INTERVAL 50 
#define TBC_PREAMBLE_COUNT 4 
// Node registration 
#define TBC_INVALID_NODE_INDEX 255 
#define TBC_UNUSED_NODE_ID 0x0000 
// Speed related 
byte xdata waitMultiplier; 
// The height "table": 
#define TBC_MAX_NODE_COUNT 16 
word xdata nodeIDs[TBC_MAX_NODE_COUNT]; 
byte xdata 
nodeNames[TBC_MAX_NODE_COUNT][TBC_NODE_NAME_LENGTH]; 
word xdata nodeTemps[TBC_MAX_NODE_COUNT]; 
word xdata nodeLastT[TBC_MAX_NODE_COUNT]; 
// SPP variables 
SPP_SETTINGS xdata sppSettings; 
SPP_RX_INFO xdata RXI; 
SPP_TX_INFO xdata TXI; 
byte xdata rxDataBuffer[TBC_DATA_LEN]; 
byte xdata txDataBuffer[TBC_DATA_LEN]; 
// Function prototypes 
void tbcWaitRandom (void); 
 63 
void tbcTransmit (void); 
void tbcReceive (void); 
void tbcPrintTable (void); 
// Unit name, stored in Flash 
byte code flashUnitName[TBC_NODE_NAME_LENGTH]; 
// RAM buffer for Flash copy 
byte xdata ramBufNonAligned[128]; 
//---------------------------------------------------------------------------- 
// MAIN PROGRAM 
//---------------------------------------------------------------------------- 
void main (void) { 
 byte xdata n; 
 byte xdata m; 
#ifdef FREQ868 
// X-tal frequency: 14.745600 MHz 
// RF frequency A: 868.277200 MHz Rx 
// RF frequency B: 868.277200 MHz Tx 
// RX Mode: Low side LO 
// Frequency separation: 64 kHz 
// Data rate: 19.2 kBaud 
// Data Format: NRZ 
// RF output power: 4 dBm 
// IF/RSSI: RSSI Enabled 
 64 
RF_RXTXPAIR_SETTINGS code RF_SETTINGS = { 
 0xA3, 0x2F, 0x15, // Modem 0, 1 and 2 
 0x75, 0xA0, 0x00, // Freq A 
 0x58, 0x32, 0x8D, // Freq B 
 0x01, 0xAB, // FSEP 1 and 0 
 0x40, // PLL_RX 
 0x30, // PLL_TX 
 0x6C, // CURRENT_RX 
 0xF3, // CURRENT_TX 
 0x32, // FREND 
 0xFF, // PA_POW 
 0x00, // MATCH 
 0x00, // PRESCALER 
 }; 
#endif 
#ifdef FREQ915 
// X-tal frequency: 14.745600 MHz 
// RF frequency A: 915.027455 MHz Rx 
// RF frequency B: 915.027455 MHz Tx 
// RX Mode: Low side LO 
// Frequency separation: 64 kHz 
// Data rate: 19.2 kBaud 
// Data Format: NRZ 
// RF output power: 4 dBm 
// IF/RSSI: RSSI Enabled 
 65 
RF_RXTXPAIR_SETTINGS code RF_SETTINGS = { 
 0xA3, 0x2F, 0x15, // Modem 0, 1 and 2 
 0xAA, 0x80, 0x00, // Freq A 
 0x5C, 0xF4, 0x02, // Freq B 
 0x01, 0xAB, // FSEP 1 and 0 
 0x58, // PLL_RX 
 0x30, // PLL_TX 
 0x6C, // CURRENT_RX 
 0xF3, // CURRENT_TX 
 0x32, // FREND 
 0xFF, // PA_POW 
 0x00, // MATCH 
 0x00, // PRESCALER 
 }; 
#endif 
#ifdef FREQ433 
// X-tal frequency: 14.745600 MHz 
// RF frequency A: 433.302000 MHz Rx 
// RF frequency B: 433.302000 MHz Tx 
// RX Mode: Low side LO 
// Frequency separation: 64 kHz 
 66 
// Data rate: 19.2 kBaud 
// Data Format: NRZ 
// RF output power: 10 dBm 
// IF/RSSI: RSSI Enabled 
RF_RXTXPAIR_SETTINGS code RF_SETTINGS = { 
 0xA3, 0x2F, 0x0E, // Modem 0, 1 and 2 
 0x58, 0x00, 0x00, // Freq A 
 0x41, 0xFC, 0x9C, // Freq B 
 0x02, 0x80, // FSEP 1 and 0 
 0x60, // PLL_RX 
 0x48, // PLL_TX 
 0x44, // CURRENT_RX 
 0x81, // CURRENT_TX 
 0x0A, // FREND 
 0xFF, // PA_POW 
 0xC0, // MATCH 
 0x00, // PRESCALER 
 }; 
#endif 
 // Calibration data 
 RF_RXTXPAIR_CALDATA xdata RF_CALDATA; 
 // Initialize peripherals 
 WDT_ENABLE(FALSE); 
 RLED_OE(TRUE); 
 67 
 YLED_OE(TRUE); 
 GLED_OE(TRUE); 
 BLED_OE(TRUE); 
 // Startup macros for speed and low power consumption 
 MEM_NO_WAIT_STATES(); 
 FLASH_SET_POWER_MODE(FLASH_STANDBY_BETWEEN_READS); 
 // Seed the random generator: 
 halRandomNumberGen(&n, 1); 
 halRandomNumberGen(&m, 1); 
 srand((n << 8) + m); 
 waitMultiplier = 1; 
 // ADC setup 
 halConfigADC(ADC_MODE_SINGLE | 
 ADC_REFERENCE_INTERNAL_1_25, CC1010EB_CLKFREQ, 0); 
 ADC_SELECT_INPUT(ADC_INPUT_AD0); 
 ADC_POWER(TRUE); 
 // RF/SPP setup 
 sppSetupRF(&RF_SETTINGS, &RF_CALDATA, TRUE); 
 sppSettings.myAddress = TBC_MY_SPP_ADDRESS; 
 sppSettings.rxTimeout = TBC_RX_INTERVAL; 
 sppSettings.txAckTimeout = TBC_PREAMBLE_COUNT; 
 sppSettings.txPreambleByteCount = TBC_PREAMBLE_COUNT; 
 68 
 RXI.maxDataLen = TBC_DATA_LEN; 
 RXI.pDataBuffer = rxDataBuffer; 
 TXI.destination = SPP_BROADCAST; 
 TXI.flags = 0x00; 
 TXI.pDataBuffer = txDataBuffer; 
 TXI.dataLen = TBC_DATA_LEN; 
 // Initialize the SPP timer 
 sppStartTimer(CC1010EB_CLKFREQ); 
 SPP_INIT_TIMEOUTS(); 
 // Reset the node IDs 
 for (n = 0; n < TBC_MAX_NODE_COUNT; n++) { 
 nodeIDs[n] = TBC_UNUSED_NODE_ID; 
 } 
 // Reset our name buffer 
 for (n = 0; n < TBC_NODE_NAME_LENGTH; n++) { 
 nodeNames[0][n] = 0x00; 
 } 
 // Setup UART0 for polled I/O 
 UART0_SETUP(57600, CC1010EB_CLKFREQ, UART_NO_PARITY | 
UART_RX_TX | UART_POLLED); 
 // Get our name 
 VT100_CLEAR_SCREEN(); 
 69 
 VT100_GO_TOP_LEFT(); 
 // Removed so that CC1010EM can operate stand-alone 
/* printf("\nEnter node name (use up to 20 characters):"); 
 scanf("%s", &nodeNames[0][0]);*/ 
 // Load name from Flash 
memcpy(&nodeNames[0][0],flashUnitName,TBC_NODE_NAME_LENGTH); 
 // Get our ID from CRC16(our name) 
 nodeIDs[0] = culFastCRC16Block(&nodeNames[0][0], 
TBC_NODE_NAME_LENGTH, CRC16_INIT); 
 // Prepare the id+name part of the packet 
 txDataBuffer[0] = (nodeIDs[0] >> 8) & 0xFF; 
 txDataBuffer[1] = nodeIDs[0] & 0xFF; 
 for (n = 0; n < TBC_NODE_NAME_LENGTH; n++) { 
 txDataBuffer[n + TBC_NODE_ID_LENGTH] = nodeNames[0][n]; 
 } 
 // Loop forever 
 while (TRUE) { 
 tbcTransmit(); 
 tbcPrintTable(); 
 tbcWaitRandom(); 
 70 
 tbcReceive(); 
 tbcWaitRandom(); 
 } 
} // main 
//---------------------------------------------------------------------------- 
// void tbcWaitRandom (void) 
// Description: 
// Wait for a random number of msecs (0 to 255*8=2040) 
// Note: The function uses busy waiting 
//---------------------------------------------------------------------------- 
void tbcWaitRandom (void) { 
 byte xdata time; 
 byte xdata n; 
 time = rand(); 
 for (n = 0; n < waitMultiplier; n++) { 
 halWait (time, CC1010EB_CLKFREQ); 
 } 
} // tbcWaitRandom 
//---------------------------------------------------------------------------- 
// void tbcTransmit (void) 
// 
// Description: 
// Update our temperature value (ADC) and transmit together with our node 
// ID and node name. 
//---------------------------------------------------------------------------- 
 71 
void tbcTransmit (void) { 
 word xdata temp; 
 // Indicate transmission 
 RLED = LED_ON; 
 YLED = LED_ON; 
 // Power up the ADC and sample the water-height 
 ADC_SELECT_INPUT(ADC_INPUT_AD0); 
 ADC_POWER(TRUE); 
 ADC_SAMPLE_SINGLE(); 
 temp = ADC_GET_SAMPLE_10BIT(); 
 // Update the TX buffer and the table with the new water-height 
 txDataBuffer[TBC_TEMP_OFFSET] = (temp >> 8) & 0xFF; 
 txDataBuffer[TBC_TEMP_OFFSET + 1] = temp & 0xFF; 
 nodeTemps[0] = temp; 
 nodeLastT[0] = (int) sppGetTime(); 
 YLED = LED_OFF; 
 // Transmit the water-height 
 sppSend(&TXI); 
 do { /*nothing*/ } while (sppStatus() != SPP_IDLE_MODE); 
 RLED = LED_OFF; 
} // tbcTransmit 
//---------------------------------------------------------------------------- 
// void tbcReceive (void) 
 72 
// Description: 
// Receive a water-height broadcast packet and register it in the table 
// Heights older than 30 secs get thrown out 
//---------------------------------------------------------------------------- 
void tbcReceive (void) { 
 byte xdata n,m,o; 
 byte xdata nodeIndex; 
 word xdata nodeID; 
 // Throw out "old" nodes (no updates during the last 30 seconds) 
 for (n = 0; n < TBC_MAX_NODE_COUNT; n++) { 
 if (((int) sppGetTime() - nodeLastT[n]) > 3000) { 
 // Re-organize the list (by moving the remaining nodes up one index) 
 for (m = n; m < (TBC_MAX_NODE_COUNT - 1); m++) { 
 nodeIDs[m] = nodeIDs[m + 1]; 
 for (o = 0; o < TBC_NODE_NAME_LENGTH; o++) { 
 nodeNames[m][o] = nodeNames[m + 1][o]; 
 } 
 nodeTemps[m] = nodeTemps[m + 1]; 
 nodeLastT[m] = nodeLastT[m + 1]; 
 } 
 } 
 } 
 // Receive the packet (if any) 
 YLED = LED_ON; 
 sppReceive(&RXI); 
 73 
 do { /*nothing*/ } while (sppStatus() != SPP_IDLE_MODE); 
 YLED = LED_OFF; 
 // Process the packet 
 if (RXI.status == SPP_RX_FINISHED) { 
 GLED = LED_ON; 
 // Get the node ID 
 nodeID = (rxDataBuffer[0] << 8) + rxDataBuffer[1]; 
 // Get the node's index in the water-height table 
 for (n = 0; n < TBC_MAX_NODE_COUNT; n++) { 
 if (nodeIDs[n] == nodeID) { 
 nodeIndex = n; 
 break; 
 } else if (nodeIDs[n] == TBC_UNUSED_NODE_ID) { 
 nodeIndex = n; 
 break; 
 } else { 
 nodeIndex = TBC_INVALID_NODE_INDEX; 
 } 
 } 
 // Update the table 
 if (nodeIndex != TBC_INVALID_NODE_INDEX) { 
 nodeIDs[nodeIndex] = nodeID; 
 for (n = 0; n < TBC_NODE_NAME_LENGTH; n++) { 
 74 
 nodeNames[nodeIndex][n] = rxDataBuffer[n + 
 TBC_NODE_ID_LENGTH]; 
 } 
 nodeTemps[nodeIndex] = (rxDataBuffer[TBC_TEMP_OFFSET] << 8) +
 rxDataBuffer[TBC_TEMP_OFFSET + 1]; 
 nodeLastT[nodeIndex] = (int) sppGetTime(); 
 } 
 } else { 
 GLED = LED_OFF; 
 } 
} // tbcReceive 
//---------------------------------------------------------------------------- 
// void tbcPrintTable (void) 
// 
// Description: 
// Executes keyboard commands (change of the waiting multiplier) 
// Prints the water-height table to the terminal window 
//---------------------------------------------------------------------------- 
void tbcPrintTable (void) { 
 int xdata n,m; 
 float xdata fTemp; 
 word xdata timeDiff; 
 // Receive key strokes 
 if (RI_0) { 
 RI_0 = 0; 
 75 
 if (isdigit(UART0_RECEIVE())) { 
 waitMultiplier = toint(UART0_RECEIVE()); 
 } else if (UART0_RECEIVE() == 'd') { 
 for (n = 1; n < TBC_MAX_NODE_COUNT; n++) { 
 nodeIDs[n] = TBC_UNUSED_NODE_ID; 
 } 
 } 
 else if (UART0_RECEIVE() == 'n') { 
 memset(&nodeNames[0][0],0,TBC_NODE_NAME_LENGTH); 
 printf("\nEnter node name (use up to 20 characters):"); 
 scanf("%s", &nodeNames[0][0]); 
 // Write new name into Flash 
halCopy2Flash(flashUnitName,&nodeNames[0][0],TBC_NODE_NAME_LENGTH, 
 ramBufNonAligned, CC1010EB_CLKFREQ); 
 // Get our ID from CRC16(our name) 
 nodeIDs[0] = culFastCRC16Block(&nodeNames[0][0], 
TBC_NODE_NAME_LENGTH, CRC16_INIT); 
 // Prepare the id+name part of the packet 
 txDataBuffer[0] = (nodeIDs[0] >> 8) & 0xFF; 
 txDataBuffer[1] = nodeIDs[0] & 0xFF; 
 for (n = 0; n < TBC_NODE_NAME_LENGTH; n++) { 
 txDataBuffer[n + TBC_NODE_ID_LENGTH] = nodeNames[0][n]; 
 76 
 } 
 } 
 } 
 // Header: 
 VT100_GO_TOP_LEFT(); 
 // Items: 
 printf("DO SAU CUA NUOC:"); 
 for (n = 0; n < TBC_MAX_NODE_COUNT; n++) { 
 if (nodeIDs[n] == TBC_UNUSED_NODE_ID) { 
 continue; 
 } 
 // Node number and ID: 
 printf("\n%01X. (0x%X) ", n, nodeIDs[n]); 
 // Node name: 
 for (m = 0; m < TBC_NODE_NAME_LENGTH; m++) { 
 UART0_WAIT_AND_SEND(nodeNames[n][m]); 
 } 
 // mức nước: 
 fTemp = nodeTemps[n]; 
 printf(" - ADC: %d", nodeTemps[n]); 
 fTemp -= 122; 
 fTemp /= 1.5625; 
 printf(" - AD0: %3.2f", fTemp); 
 77 
 // Time after the last update 
 timeDiff = abs((int) sppGetTime() - nodeLastT[n]) * 10; 
 printf(" - AGE (msecs): %d", timeDiff); 
 VT100_CLEAR_LINE_RIGHT(); 
 } 
 // Available keyboard input options 
 VT100_INSERT_BLANK_LINE(); 
 printf("\nPress '0'-'9' to change the waiting multiplier"); 
 VT100_CLEAR_LINE_RIGHT(); 
 printf("\nPress 'd' to empty the table"); 
 VT100_CLEAR_LINE_RIGHT(); 
 printf("\nPress 'n' to give the unit a new name"); 
 VT100_CLEAR_LINE_RIGHT(); 
 VT100_CLEAR_SCREEN_DOWN(); 
} // tbcPrintTable 
// Flash interrupt handler (do nothing) 
// We need to handle the interrupt even though we do not do anything. 
// If not, the program will not run correctly except under the debugger, 
// which has its own Flash interrupt handler 
void FlashIntrHandler(void) interrupt INUM_FLASH { 
 INT_SETFLAG(INUM_FLASH, INT_CLR); 
 78 
 return; 
} 
3.4. Kết luận. 
Ở chương 3 này tôi đã giới thiệu tổng quan về chương trình nhúng cũng như các 
bước xây dựng một chương trình nhúng. Từ đó đưa ra một chương trình nhúng cụ thể 
cho việc ghép nối đầu đo áp suất - mức nước với nút mạng cảm nhân không dây sử 
dụng vi điều khiển CC1010. 
Việc thử nghiệm với nút mạng được tiến hành từ mạng gồm hai nút mạng đến 
nhiều nút mạng để khảo sát quan hệ áp suất - mức nước. Kết quả thực nghiệm cho thấy 
vi điều khiển CC1010 tiêu thụ mức năng lượng thấp, một tiêu chí quan trọng của mạng 
cảm nhận không dây; đồng thời cũng cho thấy việc truyền nhận dữ liệu ổn định và tin 
cậy, không xảy ra xung đột. 
PHẦN KẾT LUẬN 
Bản luận văn đã giới thiệu về bộ cảm biến cũng như một số đặc trưng cơ bản của 
nó như: hàm truyền, độ lớn tín hiệu vào, sai số và độ chính xác. Từ đó giới thiệu về 
một loại cảm biến áp suất sử dụng công nghệ MEMS. Các loại vi cảm biến có rất 
nhiều ứng dụng trong khoa học cũng như trong thực tế. Trong khoá luận này, chúng tôi 
khảo sát một ứng dụng của vi cảm biến áp suất mang lại rất nhiều lợi ích cho đời sống 
con người, đó là đầu đo áp suất - mức nước. Nhu cầu đo mực nước trong các ngành 
kinh tế quốc dân rất lớn, điển hình là các lĩnh vực như cấp nước đô thị, thuỷ lợi và 
phòng chống thiên tai. Thiết bị này có thể được sử dụng để đo mực nước ở các đô thị, 
các nhà máy nước, các cơ quan xử lý nước thải, và đặc biệt là nhu cầu đo mực nước 
của hệ thống tưới tiêu sông ngòi, hồ ao… nhằm quản lý tốt hơn nguồn nước quốc gia. 
Hiện nay, mỗi công trình thuỷ nông đều cần hàng chục đầu đo, thiết bị đo mực nước từ 
 79 
xa để phục vụ quy trình vận hành trạm bơm, đảm bảo đủ nước tưới tiêu cho vùng công 
tác rộng mà vẫn đảm bảo tiết kiệm điện, không lãng phí nước. 
Loại đầu đo áp suất chúng tôi sử dụng thuộc loại vi cảm biến kiểu áp trở có độ 
nhạy và độ ổn định cao, với các đặc tính nổi bật là: dòng tiêu thụ nhỏ hơn 200mA, dải 
nhiệt độ làm việc từ -40 đến 125 độ C, dải tín hiệu lối ra của sensor bình thường có độ 
rộng từ 0.5 đến 4.5V, sensor có thể kết nối trực tiếp với bộ chuyển đổi tương tự - số 
hoặc có thể kết nối trực tiếp với vi điều khiển, có thể dễ dàng ghép nối với bộ chuyển 
đổi áp – dòng (với dải 0.4 đến 20mA) dùng cho mạch xử lý tín hiệu số. 
Kết quả thực nghiệm đo điện thế lối ra của đầu đo khi tăng/giảm độ cao của cột 
nước cho thấy quan hệ giữa điện thế - mức nước là rất tuyến tính với độ phân giải của 
đầu đo là 1cm, độ nhạy cỡ 2mV/cm. Hệ thống làm việc chính xác và khá ổn định. 
Để xử lý dữ liệu từ đầu đo, chúng tôi thực hiện việc truyền/nhận không dây qua 
hệ thống mạng cảm nhận không dây WSN. Trong bản luận văn này tôi cũng đã giới 
thiệu về WSN với một số ứng dụng điển hình của nó là: thu thập dữ liệu môi trường, 
giám sát an ninh và theo dõi đối tượng. Từ đó đưa ra các chỉ tiêu đánh giá hệ thống 
mạng cũng như đánh giá các nút mạng. Bên cạnh đó bản luận văn cũng giới thiệu vi 
điều khiển CC1010 của hãng Chipcon dùng để làm nút mạng cảm nhận không dây đáp 
ứng được các tiêu chí của nút mạng cảm nhận như: năng lượng tiêu thụ thấp, tính mềm 
dẻo, sức mạnh của nút mạng, tính bảo mật, tính truyền thông, khả năng tính toán và 
kích thước của nút mạng. Đây là vi điều khiển tương thích họ 8051 thông dụng, sử 
dụng ngôn ngữ lập trình C và chương trình biên dịch Keil uVision2. 
Từ việc nghiên cứu về hệ thống mạng WSN sử dụng CC1010 đó chúng tôi đã 
tiến hành thực nghiệm ghép nối đầu đo áp suất - mức nước với nút mạng, xây dựng 
các bước để giao tiếp giữa vi điều khiển và vi cảm biến tương tự - đầu đo áp suất. Việc 
ghép nối giữa cảm biến tương tự và vi điều khiển CC1010 được thực hiện qua ba lối 
vào tương tự của CC1010, đó là các chân AD0, AD1 và AD2. 
Bản luận văn cũng đã giới thiệu vể phần mềm nhúng cùng các yêu cầu, các bước 
để xây dựng một phần mềm nhúng cho nút mạng. Phần mềm nhúng cho vi điều khiển 
CC1010 sử dụng chương trình biên dịch Keil uVision2 – môi trường phát triển tích 
hơp IDE cho phép người sử dụng có thể soạn thảo chương trình, dịch và gỡ lỗi trên 
cùng một môi trường, và sử dụng bộ thư viện do hãng Chipcon cung cấp nhằm hỗ trợ 
cho việc xây dựng phần mềm được dễ dàng và nhanh chóng hơn. Bộ thư viện đó bao 
 80 
gồm: thư viện tiện ích chipcon CUL, thư viện phần cứng HAL, các file định nghĩa 
phần cứng HDF. 
Việc thử nghiêm ghép nối đầu đo áp suất với nút mạng cảm nhận không dây 
được thực hiện từ một hệ thống mạng gồm hai nút mạng và mở rộng ra nhiều nút 
mạng. Kết quả thực nghiệm cho thấy nút mạng cảm nhận sử dụng vi điều khiển 
CC1010 đạt được một số tiêu chí cho nút mạng đã đề ra, đó là tiêu thụ mức năng lượng 
thấp, việc truyền nhận dữ liệu ổn định và tin cậy, không bị xung đột. Cũng từ kết quả 
trên cho thấy việc xây dựng một mạng cảm nhận không dây WSN bước đầu đã đạt 
được một số kết quả mang tính cơ bản, cho phép tiếp tục phát triển và đi sâu theo 
hướng đã xác lập. Việc theo dõi thông số môi trường trở nên dễ dàng và tiện lợi, người 
sử dụng chỉ cần ngồi tại một chỗ cũng có thể giám sát các thông số đó nhằm phục vụ 
cho công việc của mình cũng như cho đời sống con người. 
PHỤ LỤC 
Phụ lục 01: Điện thế lối ra của đầu đo khi hạ từng cm nước: 
Trong đó: (1): mức nước (cm) 
 (2): điên thế lối ra (mV) 
(1) (2) (1) (2) (1) (2) 
150 448 99 338 49 234 
149 445 98 335 48 232 
148 443 97 333 47 230 
147 440 96 331 46 228 
146 438 95 329 45 226 
145 436 94 326 44 224 
 81 
144 433 93 325 43 221 
143 431 92 323 42 219 
142 429 91 320 41 217 
141 427 90 318 40 215 
140 425 89 316 39 213 
139 422 88 314 38 211 
138 420 87 312 37 209 
137 418 86 310 36 207 
136 416 85 308 35 205 
135 414 84 306 34 203 
134 412 83 304 33 201 
133 410 82 302 32 199 
132 408 81 299 31 197 
131 405 80 298 30 194 
130 404 79 295 29 193 
129 401 78 293 28 191 
128 399 77 291 27 189 
127 397 76 289 26 187 
126 394 75 287 25 185 
125 392 74 285 24 183 
124 390 73 283 23 181 
123 388 72 281 22 179 
122 386 71 279 21 177 
121 384 70 277 20 175 
120 382 69 274 19 173 
119 380 68 272 18 171 
118 377 67 270 17 169 
117 376 66 268 16 167 
116 373 65 267 15 165 
115 371 64 264 14 163 
114 369 63 263 13 161 
113 367 62 261 12 160 
112 365 61 259 11 158 
111 363 60 257 10 156 
110 361 59 254 9 154 
109 358 58 252 8 152 
108 356 57 250 7 150 
107 355 56 248 6 148 
106 352 55 246 5 147 
105 350 54 244 4 144 
104 348 53 242 3 143 
103 346 52 240 2 142 
102 344 51 238 1 141 
101 342 50 236 0 140 
 82 
Phụ lục 02: Điện thế lối ra của đầu đo theo mức nước khi sử dụng mạch khuếch đại 
ngoài và hạ dần mức nước. 
(1) (2) (1) (2) (1) (2) 
142 1197 97 934 45 637 
141 1192 95 922 43 626 
139 1182 93 909 41 614 
137 1169 91 897 39 604 
135 1157 89 886 37 593 
133 1148 87 876 35 582 
131 1135 85 864 33 570 
129 1124 83 852 31 559 
127 1112 81 842 29 549 
125 1100 79 830 27 539 
123 1087 77 819 25 529 
121 1074 75 807 23 518 
119 1064 73 795 21 508 
117 1051 71 784 19 499 
115 1039 69 772 17 488 
113 1027 67 761 15 479 
111 1016 65 749 13 470 
109 1004 63 737 11 463 
107 991 61 726 9 453 
105 980 59 716 7 445 
103 968 57 704 5 438 
101 956 55 692 3 430 
99 945 53 683 1 425 
 51 671 
Phụ lục 03: Điện thế lối ra của đầu đo theo mức nước khi sử dụng mạch khuếch đại 
ngoài và tăng dần mức nước: 
(1) (2) (1) (2) (1) (2) 
0 408 68 751 116 1025 
6 428 69 758 117 1030 
7 433 70.5 765 118 1036 
11 452 73 778 119 1042 
13 459 75 791 120 1048 
14 463 77 804 121 1054 
15 468 79.5 817 122 1059 
17 478 81.5 827 123 1065 
21 497 83.5 839 124 1070 
23 507 84.5 847 125 1076 
 83 
24.5 515 87 857 126 1082 
26.5 525 88.5 868 127 1087 
28 533 90.5 878 128 1093 
30 543 92 889 129 1098 
31.5 550 94 899 130 1104 
34 563 96 910 131 1110 
36 574 97.5 920 132 1116 
38 584 99 928 133 1121 
39.4 594 100 934 134 1126 
41 603 101 939 135 1132 
44 617 102 945 136 1143 
45.5 627 103 951 138 1149 
47.5 637 104 958 139 1154 
49 645 105 962 140 1160 
50 651 106 968 141 1166 
51 658 107 975 142 1173 
52.5 666 108 979 143 1178 
54.5 675 109 985 144 1183 
56.5 687 110 990 145 1190 
58 697 111 997 146 1194 
60 706 112 1002 147 1200 
62 717 113 1008 148 1205 
64 728 114 1014 149 1212 
65.5 738 115 1019 150 1219 
TÀI LIỆU THAM KHẢO 
Tài liệu tiếng Việt: 
[1] Khảo sát đặc trưng và khả năng ứng dụng của cảm biến gia tốc MEMS, 
[2] Vương Đạo Vy, Nguyễn Thế Sơn, Phùng Công Phi Khanh, Hoà Quang Dự, 
Xây dựng hệ tự động đo khí áp sử dụng cảm biến áp suất MEMS và các thí nghiệm 
kiểm tra, Tóm tắt các báo cáo Hội thảo Quốc gia lần thứ VIII, Hải Phòng 25-
27/08/2005, Một số vấn đề chọn lọc của công nghệ thông tin và truyền thông, Chủ 
đề Mã nguồn mở, Hải Phòng 08/2005. 
 84 
[3] Vương Đạo Vy, Nguyễn Thế Sơn, Thiết kế chế tạo, vận hành và đo thử nghiệm 
mạng cảm nhận không dây (wireless sensor network) trên cơ sở sử dụng chip vi 
điều khiển có mật độ tích hợp cao làm nút mạng và xây dựng phần mềm nhúng nạp 
trong các vi điều khiển này, tr.5-15. 
Tài liệu tiếng Anh: 
[4] Chipcon, CC1010 Datasheet, www.chipcon.com 
[5] Chipcon, CC1010IDE Manual, www.chipcon.com 
[6] Jason Lester Hill, A System Architecture for Wireless Sensor Networks, 
University of California, Berkeley, 2000. 
[7] XFPM,XHPM Datasheet, www.servoflo.com 
            Các file đính kèm theo tài liệu này:
 Ghép nối đầu đo áp suất cho nút mạng cảm nhận không dây với phần mềm nhúng.pdf Ghép nối đầu đo áp suất cho nút mạng cảm nhận không dây với phần mềm nhúng.pdf