MỤC LỤC
LỜI MỞ ĐẦU 1
CHƯƠNG 1: CẢM BIẾN ĐO TỪ TRƯỜNG HMC1053 3
I. Cảm biến đo từ trường 3
1.Cảm biến từ trường 3
2.Phân loai cảm biến từ trường 4
3.Cảm biến từ trở không đẳng hướng 5
4.Cảm biến đo từ trường HMC1053 6
5.Cảm biến đo từ trường HMC2003 10
II.Nguyên li nhận biết kim loại sắt từ của cảm biến HMC1053 12
1.Từ trường trái đất 12
2.Nguyên li nhận biết kim loại sắt từ của cảm biến HMC1053
CHƯƠNG 2: THIẾT KẾ THIẾT BỊ 18
I. Nguyên lí làm việc của thiết bị 18
II. Thiết kế thiết bị 20
1.Chức năng -- yêu cầu của thiết bị 20
2. Lựa chọn linh kiện 20
3.Thiết kế sơ đồ khối 26
a. Sơ đồ đầu dò Far Sensor 26
b. Sơ đồ đầu thu Near sensor 27
4.Sơ đồ nguyên lý của thiết bị 28
CHƯƠNG 3: KẾT QUẢ THỰC NGHIỆM 33
I. Thiết kế phần cứng 33
1. PCB đầu dò Far Sensor 33
2. PCB đầu thu Near Sensor 34
II.Thiết kế phần mềm 34
1.Thiết kế vi điều khiển PSoC 34
1.1. Xác lập cấu trúc phần cứng cho PSoC 34
1.2. Lưu đồ thuật toán phần mềm cho PSoC 45
2.Truyền thông máy tính 47
III.Kết quả đo thực nghiệm 48
KẾT LUẬN 50
TÀI LIỆU THAM KHẢO 51
PHỤ LỤC 52
73 trang |
Chia sẻ: banmai | Lượt xem: 2341 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Nghiên cứu và chế tạo máy dò kim loại, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
có từ tính: cặp dây offset và cặp dây set/reset. Các cặp dây này được Honeywell thiết kế để điều chỉnh các từ trường nhiễu ngẫu nhiên và thay thế cho cho các cuộn trường bên ngoài và cung cấp các chế độ hoạt động khác nhau.
Honeywell tạo ra các dây offset tích hợp (Xoff+ và Xoff-…) có thể dùng để đưa các từ trường cục bộ vào cầu để xử lí hay chỉnh một trường ứng dụng nào đó. Kĩ thuật này có thể dùng để huỷ bỏ các từ trường không mong muốn xung quanh. Dây offset về danh nghĩa là cung cấp từ trường 1 Gauss dọc theo trục nhạy với 48mA của dòng offset qua mỗi dây.
Dây offset điều chỉnh các chế độ hoạt động khi có dòng trực tiếp đi qua. Các chế độ đó là: 1) loại trừ các từ trường nhiễu bên ngoài 2) bỏ điện áp offset của cầu
3) bỏ từ trường mạch kín 4) tự động căn chỉnh cầu.
Hầu hết các ứng dụng không dùng đến chân offset. Khi đó, ta có thể để hở một hay cả hai đầu Off+ và Off- hay nối đất một trong 2 chân. Chú ý không được nối 2 chân vào nhau để tránh làm ngắn mạch từ.
Dây set/reset là dây kim loại xoắn, có giá trị trở kháng nhỏ, vào khoảng 3 đến 6 Ω với giá trị dòng đỉnh tối thiểu qua dây là 0,4A để tạo xung Set và Reset. Thông thường, dây Set/Reset phải được dùng theo chu kì nhất định để điều hoà lại các miền từ của dây từ trở, đảm bảo hoạt động tin cậy và ổn định.
Dây set/reset có thể nhận xung dòng cao để thực hiện: 1) cho phép sensor thực hiện các ứng dụng đo đòi hỏi độ nhạy cao 2) đảo cực điện áp cầu ra 3) nạp xung theo chu kì để tăng độ tuyến tính, giảm tác động của nhiệt.
Thông thường thì một xung Reset được gửi đi trước, tiếp đến là xung Set sau đó vài mili giây. Bằng cách đẩy các miền từ về hai hướng hoàn toàn ngược nhau, bất cứ nhiễu từ dư nào đều bị xoá hoàn toàn bằng cặp xung trên.
Sensor khi chịu tác động của từ trường cường độ cao có thể dẫn đến đo sai, giảm độ nhạy, hay điện áp đầu ra của sensor không biến đổi (kẹt sensor). Cho tới khi nhận được tác động của xung Set/Reset, sensor mới có thể trở về hoạt động bình thường
Mạch điều khiển Set/Reset có tác dụng tạo dòng xung giải phóng từ trường khỏi cầu sensor, để tránh làm giảm đặc tính hoạt động của sensor sau khi chịu từ trường cao bất thường (từ trường vượt quá ±10 Gauss). Từ trường cao có thể gây ra bởi nam châm vĩnh cửu, động cơ điện, và các dây cáp mang dòng lớn. Bằng cách gửi theo chu kì các xung có độ lớn dòng thích hợp, phần từ dư trong film Permalloy sẽ bị xoá. Quá trình này tương tự như xoá nội dung của một băng từ, chúng có điểm chung là cùng chứa các film Permalloy.
Sơ đồ mạch Set/Reset dùng IRF7509N.
5. Cảm biến đo từ trường HMC2003 (Honeywell)
Các tín hiệu ra từ cảm biến HMC1053 cần phải đưa qua một khuyếch đại thuật toán Op-Amp để có thể đi vào bộ chuyển đổi tương tự-số ADC. Với mục đích cung cấp sự tiện lợi cho người sử dụng cũng như đáp ứng khả năng sử dụng linh hoạt cho các ứng dụng khác nhau, Honeywell cũng đã đưa ra thị trường cảm biến HMC2003 là bộ cảm biến tích hợp cảm biến từ HMC1053 và ba bộ khuyếch đại tín hiệu. Tín hiệu điện áp đầu ra Xout, Yout và Zout nằm trong dải điện áp 0 – 5V sẵn sàng để đi vào chuyển đổi tương tự - số ADC, giúp người sử dụng không cần phải lắp thêm bộ khuyếch đại bên ngoài.
Các chân Xout, Yout, Zout là các tín hiệu điện áp đầu ra của cầu, đã đi qua bộ khuyếch đại với hệ số khuyếch đại thích hợp để tạo ra dải điện áp 0 – 5V. Ngoài ra, hãng Honeywell cũng đưa ra các chân Xtrim, Ytrim, Ztrim là tín hiệu điện áp đầu ra của cầu chưa đi qua bộ khuyếch đại để người sử dụng có thể tự lựa chọn bộ khuyếch đại với hệ số thích hợp cho ứng dụng của riêng mình. Các giá trị điện áp Xtrim, Ytrim, Ztrim là các điện áp tương tự đầu ra của cầu so với đất GND, tương ứng với giá trị điện áp giữa hai chân Xout+ / Xout-, Yout+ / Yout- và Zout+ / Zout- của cảm biến HMC1053.
Một ưu điểm nữa của HMC2003 là có tích hợp một nguồn dòng kích thích trong và các giá trị điện trở offset, trở khuyếch đại do các kĩ thuật viên của Honeywell tính toán, thiết kế và kiểm tra, giúp làm giảm sai số do nhiệt và độ trôi offset. Ba bộ khuyếch đại đo lường chính xác, nhiễu thấp với các bộ lọc thông thấp 1kHz giúp đảm bảo việc đo lường chính xác khi đã loại bỏ các nhiễu không mong muốn.
- Đóng vỏ IC DIP20
- Khả năng đo chính xác 3 trục vecto từ trường (X,Y,Z)
- Đầu ra tương tự có căn chỉnh
-Vref= +2,5 V Onboard
- Điện áp hoạt động: +6 đến +15VDC
- Chứa vật liệu từ thấp
- Dải thông 1kHz
- Nhiệt độ hoạt động: -40ºC đến 85ºC
Cảm biến HMC2003
Sơ đồ chân cảm biến HMC2003:
Do khối trọng tâm bên trong là cảm biến HMC1053 nên nguyên lí hoạt động nói chung cũng như khả năng nhận biết kim loại sắt từ nói riêng của HMC2003 cũng tương tự như HMC1053. Hiểu biết về hoạt động của cảm biến HMC1053, ta có thể thiết kế các sơ đồ mạch nhận biết kim loại sắt từ sử dụng cả hai loại cảm biến này.
II. Nguyên lí nhận biết kim loại sắt từ của cảm biến từ HMC1053
1. Từ trường trái đất
Trái đất tạo ra một từ trường có giá trị cố định không đổi trên một diện tích rộng (khoảng vài km2). Từ trường trái đất mà la bàn thu được có cường độ khoảng 0,5 đến 0,6 Gauss, và có thể coi gần bằng từ trường tạo ra từ một nam châm lưỡng cực như hình dưới đây.
Điều này tương tự như đặt 1 thanh dài nam châm từ hoá dọc theo trục đi qua tâm trái đất. Các cực của thanh nam châm này lệch khoảng 11,5˚ so với cực địa lí trái đất. Cực nam của nam châm ứng với cực bắc trái đất.
Từ trường trái đất coi như một từ trường đều có cường độ 0,5-0,6 Gauss xuyên qua mọi vật giữa 2 cực từ bắc-nam. Như vậy, ta dùng một cảm biến từ trường cường độ nhỏ như HMC1053 để đo tín hiệu từ trường này của trái đất, đồng thời đo từ trường nhiễu mà các vật thể bằng sắt ở gần đó tạo ra. Hình dưới đây mô tả một ví dụ về các đường sức từ của trái đất ở điều kiện bình thường, và nhiễu từ khi xung quanh có một vật bằng sắt xuất hiện.
vật thể chứa sắt + từ trường không đổi của trái đất = nhiễu từ
Khi các đường sức từ bị kéo tập trung lại hay tản ra, một cảm biến đặt gần đó cũng sẽ chịu ảnh hưởng của từ trường do vật sắt tạo ra tác động lên từ trường trái đất. Như vậy, dựa vào sự thay đổi độ lớn của cường độ từ trường đo được, cảm biến có thể nhận biết được sự xuất hiện của các vật thể bằng sắt trong khoảng không gian giới hạn xung quanh.
Hình sau chỉ rõ một vật làm bằng sắt , trường hợp này là một ôtô có thể tạo ra một nhiễu cục bộ trong từ trường này khi nó đang đứng yên hay di chuyển. Cảm biến HMC1053 có thể phát hiện ra các thay đổi trong từ trường này của trái đất do chiếc ôtô gây ra, từ đó có thể tạo ra các ứng dụng khác nhau.
2. Nguyên lí nhận biết kim loại sắt từ của cảm biến từ HMC1053
Từ trường trái đất tạo ra có giá trị cố định không đổi trên một diện tích rộng khoảng vài km2. Đặt trong môi trường bình thường, dưới tác dụng của từ trường trái đất, giá trị các dây từ trở cảm biến thay đổi và tạo ra một chênh áp ở đầu ra của cầu. Đầu ra cảm biến HMC1053 tạo ra giá trị điện áp V1.
Khi trong môi trường xung quanh cảm biến xuất hiện một vật liệu sắt từ, ví dụ một xe ôtô. Khối lượng sắt trong xe làm biến đổi giá trị của từ trường xung quanh vị trí xe xuất hiện. Từ trường này tác động vào cảm biến, làm biến đổi giá trị từ trở của các dây film Permalloy, từ đó thay đổi điện áp đầu ra của cầu. Lúc này xuất hiện giá trị điện áp V2 ở đầu ra cảm biến HMC1053.
Các giá trị điện áp V1 và V2 này được đưa qua một bộ khuyếch đại với hệ số khuyếch đại thích hợp và được đưa vào vi điều khiển. Vi điều khiển sẽ tính toán và hiển thị được giá trị cường độ từ trường H1 bình thường của môi trường trái đất cũng như giá trị từ trường H2 khi có vật liệu sắt từ, lúc này là một xe ôtô, xuất hiện. Đồng thời, qua giá trị ∆H = H1 - H2 , vi điều khiển sẽ xử lí và nhận biết được sự xuất hiện của khối vật liệu sắt từ.
Cảm biến đo từ trường HMC1053 đưa ra 3 đầu ra tín hiệu điện áp qua bộ khuyếch đại trở thành 3 tín hiệu tương tự trong dải 0-5V. Ba tín hiệu tương tự này sau đó đi qua 1 bộ dồn kênh vào chuyển đổi ADC để có thể đưa vào vi xử lí tính toán.
Sơ đồ nguyên lí
Cảm biến đo từ trường HMC1053 đưa ra 3 đầu ra tín hiệu điện áp qua bộ khuyếch đại trở thành 3 tín hiệu tương tự trong dải 0-5V, đòi hỏi vi điều khiển tiếp nhận và xử lí. Ba tín hiệu tương tự này cần đi qua 1 bộ dồn kênh vào chuyển đổi ADC để có thể đưa vào bộ xử lí CPU. Như vậy, nếu sử dụng các loại vi điều khiển thông thường, ta sẽ cần sử dụng thêm một bộ dồn kênh MUX bên ngoài và một bộ chuyển đổi ADC để chuyển đổi chuẩn hóa trước khi đưa tín hiệu vào vi điều khiển. Điều này có hạn chế là làm tăng kích thước mạch điện cũng như giá thành thiết bị.
Vì vậy, em đã sử dụng vi điều khiển PSoC, nhằm giải quyết được những hạn chế này. Là một trong những loại vi điều khiển hàng đầu sử dụng công nghệ System-on-chip, PSoC là giải pháp mới thích hợp cho các ứng dụng đo lường, điều khiển. PSoC (Programmable System on Chip) nghĩa là hệ thống khả trình trên một chip. Các chip chế tạo theo công nghệ PSoC cho phép thay đổi được cấu hình đơn giản bằng cách gán chức năng cho các khối tài nguyên có sẵn trên chip. Hơn nữa nó còn có thể kết nối tương đối mềm dẻo các khối chức năng với nhau hoặc giữa các khối chức năng với các cổng vào ra. Chính vì vậy mà PSoC có thể thay thế cho rất nhiều chức năng nền của một số hệ thống cơ bản chỉ bằng một đơn chip. Bản thân trong chip PSoC đã tích hợp các bộ dồn kênh tương tự và các bộ ADC có độ phân giải cao, rất phù hợp với yêu cầu của ứng dụng, góp phần làm giảm kích thước mạch điện cũng như giảm chi phí của thiết bị.
CHƯƠNG 2: THIẾT KẾ THIẾT BỊ
I. Nguyên lí làm việc của thiết bị
Thiết bị gồm một đầu dò và một đầu thu, đặt cách nhau 1,2 đến 1,5m. Hai đầu dò và thu được đặt song song, cách nhau 1,2 – 1,5m nên các trục vectơ Hx, Hy, Hz song song với nhau từng đôi một. Một đầu dò H1 di chuyển sát mặt đất để đo cường độ từ trường nhiễu gây bởi vật liệu sắt từ (nếu có) tại vị trí gần mặt đất, đầu thu H2 ở độ cao cách mặt đất 1,2 – 1,5m không bị ảnh hưởng của nhiễu từ do vật liệu sắt từ gây ra, cường độ từ trường H2 đầu thu đo được chính là cường độ từ trường tự nhiên, không đổi của môi trường xung quanh.
H1 2 = Hx12 +Hy12 + Hz12
H2 2 = Hx22 +Hy22 + Hz22
Vì đầu dò và đầu thu được đặt song song, nếu có một khối vật liệu sắt từ lớn nào đó ở môi trường xung quanh tác động vào thì ảnh hưởng của nó đến cường độ từ trường hai đầu thu được là như nhau, dẫn đến có thể loại trừ sai số do tác động bên ngoài của môi trường, không ảnh hưởng đến biến đổi từ trường gây bởi vật liệu sắt từ dưới đất cần phát hiện.
Trong trường hợp khoảng không dưới mặt đất tại vị trí của đầu dò H1 không có vật liệu sắt từ, lúc này Hx1 ≈ Hx2, Hy1 ≈ Hy2, Hz1 ≈ Hz2, từ đó dẫn đến H1 ≈ H2, màn hình LCD hiển thị ∆Hx ≈ ∆Hy ≈ ∆Hz ≈ ∆H ≈ 0 máy không phát tín hiệu.
Khi dưới mặt đất tại vị trí đầu dò H1 xuất hiện vật liệu sắt từ nằm trong vùng cảm nhận từ của đầu dò H1, đầu dò H1 sẽ thu được giá trị vectơ từ trường biến đổi Hx1, Hy1, Hz1 do vật liệu sắt từ gây ra. Trong khi đó, khoảng cách giữa vật liệu sắt từ dưới đất và đầu thu H2 lớn hơn 1m nên cảm biến của đầu thu H2 không thu được giá trị từ trường biến đổi do vật liệu sắt từ gây ra. Từ trường mà đầu thu H2 thu được là từ trường không đổi của trái đất. Trường hợp này Hx1 ≠ Hx2, Hy1 ≠ Hy2, Hz1 ≠ Hz2 , ta có H1 ≠ H2 Người sử dụng đọc được trên màn hình LCD ∆Hx ≠ ∆Hy ≠ ∆Hz ≠ 0 và giá trị ∆H ≠ 0. Dựa vào độ lớn của giá trị ∆H tại vị trí đầu dò H1 hiện tại và biến đổi ∆H khi đưa đầu dò sang các vị trí lân cận, người sử dụng có thể khoanh vùng được vị trí hẹp của vật liệu sắt từ bên dưới mặt đất. Khi giá trị ∆H tiến đến một độ lớn cụ thể đã định trước (ví dụ 500 mGauss _ là độ biến thiên từ trường ∆H gây bởi một vật liệu sắt từ khối lượng 0.7 kg, mức ngưỡng của vật thể cần tìm), đầu thu H2 sẽ báo tín hiệu âm thanh Beep, đồng thời đèn Led trên thiết bị sẽ nháy sáng để gây chú ý cho người sử dụng.
Trên thiết bị có gắn cổng RS232 để truyền giá trị Hx1, Hy1, Hz1 và độ lớn H1 về máy tính để xử lí, lưu giữ và vẽ đồ thị biến đổi Hx1, Hy1, Hz1. Dựa vào đồ thị biểu diễn cường độ từ trường H1 người sử dụng cũng có thể xác định được vị trí của vật thể sắt từ.
Hình sau minh họa đồ thị biến thiên Hx1, Hy1, Hz1 và H1 khi đầu dò H1 quét qua một vật thể sắt từ.
Nhìn đồ thị ta có thể nhận thấy trong khoảng thời gian từ giây thứ 1 – 51 và 101 – 151, khoảng không gian bên dưới xung quanh đầu dò không có vật thể sắt từ, giá trị vectơ từ trường đo được trên cả 3 trục X, Y,Z không biến đổi, biểu hiện bằng đường thẳng tương đối trong tọa độ thời gian 1 – 51 và 101 – 151. Còn trong khoảng tọa độ thời gian 51 – 101, giá trị từ trường trên cả 3 trục biến đổi dẫn đến biến thiên về độ lớn của từ trường H1 từ giá trị 580 mGauss lên đến khoảng 800 mGauss. Người sử dụng có thể kết luận tại vị trí đầu dò quét qua trong khoảng thời gian 51 – 101 đó, có một vật thể sắt từ nằm dưới đất.
Từ trường của 3 trục biến đổi có thể chỉ ra sự xuất hiện của vật liệu sắt từ tại vị trí đầu dò 1. Đặc biệt là từ trường của trục z, giá trị Hz đạt max khi vật liệu sắt từ nằm trực tiếp trên cùng một đường với trục z của sensor.
II. THIẾT KẾ THIẾT BỊ
1.Chức năng -- yêu cầu của thiết bị
-Thiết bị đo và hiển thị lên máy tính giá trị của ba vectơ cường độ từ trường của môi trường xung quanh theo 3 trục X, Y, Z và độ lớn cường độ từ trường trái đất H tại vị trí đang xét.
- Thiết bị cũng dò tìm và nhận biết sự xuất hiện của vật thể sắt từ bằng cách xác định và tính toán giá trị biến thiên từ trường giữa từ trường tại vị trí cần kiểm tra và từ trường trái đất. Giá trị biến thiên này được hiển thị trên màn hình LCD đặt trên thiết bị, đồng thời truyền thông hiển thị giá trị và vẽ sơ đồ giá trị từ trường biến thiên trên máy tính.
- Khi giá trị từ trường biến thiên đạt đến giá trị ngưỡng ΔH định trước, thiết bị phát tiếng kêu Beep và đèn Led nháy sáng báo hiệu cho người sử dụng.
2. Lựa chọn linh kiện
2.1. Cảm biến:
Thiết bị sử dụng các cảm biến từ trường HMC1053 và HMC2003, là các cảm biến được xây dựng trên công nghệ cảm biến từ trở không đẳng hướng (AMR sensor) của Honeywell, có độ nhạy cao, độ tin cậy lớn và chi phí thấp.
Cảm biến HMC1053…
… và cảm biến HMC2003
Do điều kiện thực tế hiện có 1 cảm biến HMC1053 và 1 cảm biến HMC2003, nên em đã sử dụng cảm biến HMC2003 cho đầu dò Far Sensor, và cảm biến HMC1053 cho đầu thu Near Sensor.
2.2. Bộ khuyếch đại:
Sử dụng IC khuyếch đại thuật toán LM324 (National Semiconductor)
2.3. Bộ dồn kênh, ADC và vi xử lí:
Thiết bị sử dụng vi điều khiển PSoC CY8C29466 để tận dụng tính vượt trội về khả năng tích hợp các khối tương tự và số, tích hợp bộ dồn kênh tương tự AMUX, ADC 12-bit trong một vi điều khiển đơn chip giúp giảm diện tích mạch, hạ giá thành, đồng thời khả năng tự cấu hình phần cứng giúp nâng cao độ bảo mật cho hệ thống.
Lựa chọn các bộ dồn kênh và ADC trong PSoC
- Bộ chọn 4 đầu vào tương tự (4 to 1 Analog Multiplexer)
Có thể lập trình lựa chọn đầu vào bằng phần mềm:
AMUX4_InputSelect(AMUX4_Port0_1);
- Bộ khuyếch đại không đảo PGA _ Programmable Gain Amplifier
-Độ khuyếch đại có thể lập trình với 33 cấp, độ khuyếch đại tối đa là 48
-Một đầu ra đơn với điện áp tham chiếu có thể lựa chọn
-Trở kháng đầu vào cao
Ở đây ta sử dụng PGA làm bộ đệm giữa AMUX và ADC. Do thiết đặt phần cứng về vị trí của AMUX và ADC, tín hiệu điện áp do AMUX chọn sẽ đi qua PGA vào ADC.
- Bộ chuyển đổi tương tự - số ADC
ADC sẽ xử lí tín hiệu tương tự và đưa ra giá trị số tương ứng để CPU xử lí
2.4. LCD
Giá trị từ trường biến thiên được hiển thị lên màn hình LCD gắn trên thiết bị.
Thiết bị sử dụng LCD 1602,sử dụng giao thức theo tiêu chuẩn công nghiệp của HITACHI HD44780
LCD 1602A LCD thể hiện trong PSoC Designer
Bảng kết nối chân của LCD với chân của PSoC:
2.5.Truyền thông
Thiết bị truyền thông lên máy tính theo chuẩn RS232, sử dụng IC MAX232 để trao đổi thông tin giữa máy tính và thiết bị.
Khối UART bên trong chip PSoC thực hiện nhiệm vụ truyền dữ liệu giữa máy tính và vi điều khiển.
3.Thiết kế sơ đồ khối
Thiết bị gồm 2 phần: đầu dò Far Sensor đo từ trường tại vị trí cần xét và đầu thu Near Sensor nhận tín hiệu, tính toán và truyền thông hiển thị.
3.1. Sơ đồ đầu dò Far Sensor:
PSoC CY8C29466
CPU
RAM
FLASH
RS232
Near
Sensor
Nguồn
Cảm
biến
Phím
Cảm biến HMC2003 đưa ra 3 đường tín hiệu điện áp tương tự X, Y, Z có dải điện áp trong khoảng 0 – 5V đưa vào vi điều khiển. Khối dồn kênh AMUX lần lượt đưa 3 tín hiệu này vào ADC để tạo ra giá trị số đưa vào CPU. CPU tính toán, xử lí và truyền dữ liệu H1 lên đầu thu Near Sensor thông qua cổng RS232.
Cảm biến
HMC
2003
MAX
232
Near
Sensor
PSoC CY8C29466
Dồn kênh
MUX
ADC
12 bit
CPU
3.2. Sơ đồ đầu thu Near sensor:
PSoC CY8C29466
Tính
CPU
RAM
FLASH
RS232
Máy tính
Nguồn
Cảm
biến
RS232
LM324
Far
Sensor
LCD
Một mặt, đầu thu Near Sensor cũng có tích hợp một cảm biến từ trường HMC1053. Cảm biến HMC1053 này đưa ra 3 đường tín hiệu x y, z dưới dạng điện áp tương tự nhỏ (mV). Các tín hiệu này đi qua bộ khuyếch đại thuật toán với hệ số khuyếch đại K= 200 trở thành 3 tín hiệu điện áp tương tự X, Y, Z có dải điện áp trong khoảng 0 – 5V đưa vào vi điều khiển. Khối dồn kênh AMUX lần lượt đưa 3 tín hiệu này vào ADC để tạo ra giá trị số hạng hex đưa vào CPU. CPU lưu giữ giá trị cường độ từ trường H2.
Mặt khác, đầu thu Near Sensor nhận dữ liệu cường độ từ trường H1 từ đầu dò Far Sensor. CPU thu thập, xử lí hai giá trị từ trường này, tính toán giá trị cường độ từ trường biến thiên ΔH, so sánh với giá trị ΔH ngưỡng và đưa ra kết luận về sự xuất hiện của vật sắt. Các số liệu tính toán được hiển thị lên LCD và truyền thông để hiển thị và vẽ đồ thị trên máy tính.
Far
Sensor
Khuyếch
đại
LM324
MAX
232
LCD
Máy
tính
PSoC CY8C29466
Dồn
kênh
MUX
ADC
12 bit
CPU
MAX
232
HMC
1053
4. Sơ đồ nguyên lý của thiết bị
4.1. Khối nguồn
4.2. Bộ nạp
4.3. Cảm biến
HMC1053 HMC2003
4.4. Khâu khuyếch đại
4.5. Khối Set/Reset
Khối Set/Reset để khử từ trường dư của HMC1053, đảm bảo cảm biến hoạt động ổn định và chính xác
4.6. Sơ đồ chân của vi điều khiển PSoC của đầu dò Far sensor
4.7. Đầu dò Far sensor truyền tín hiệu lên đầu thu Near Sensor:
4.8. Sơ đồ nối chân LCD
4.9. Đầu thu Near sensor nhận tín hiệu từ đầu dò và truyền dữ liệu lên máy tính:
4.10. Loa, Led báo hiệu và mạch Set/Reset của Near sensor
4.11. Sơ đồ chân vi điều khiển PSoC của đầu thu Near sensor
CHƯƠNG 3: KẾT QUẢ THỰC NGHIỆM
I. Thiết kế phần cứng:
Sơ đồ mạch phần cứng PCB được thiết kế từ sơ đồ nguyên lí, sử dụng chương trình Protel DXP.
PCB đầu dò Far Sensor:
2. PCB đầu thu Near Sensor:
II.Thiết kế phần mềm
1.Thiết kế vi điều khiển PSoC:
1.1. Xác lập cấu trúc phần cứng cho PSoC:
Bản thân vi điều khiển PSoC ban đầu là một chip trắng. Khác với các dòng vi điều khiển trước, chíp PSoC trắng ban đầu chưa có cấu hình phần cứng xác định. Khi chưa được cấu hình chip PSoC không thể thực hiện được bất kỳ một chức năng nào. Người sử dụng có thể và cần phải thiết đặt cấu hình phần cứng bên trong cho PSoC phù hợp với yêu cầu hệ thống của mình. Điều này cho thấy tính linh hoạt của vi điều khiển PSoC so với các vi điều khiển thông thường khác.
Để hỗ trợ việc thiết đặt cấu hình phần cứng bên trong PSoC được đơn giản và dễ dàng, hãng Cypress đã thiết kế chương trình phần mềm PSoC Designer, sử dụng phương pháp lập trình kéo - thả để người dùng có thể thiết đặt cấu hình phần cứng của PSoC được tiện lợi.
Cấu trúc bên trong của chip PSoC “trắng”thể hiện trên PSoC Designer
Để thiết lập cấu trúc phần cứng cho chip PSoC thực hiện công việc của thiết kế, ta cần thực hiện các bước như sau, với công cụ PSoC Designer.
B1.Tạo lập 1 project mới
Ta chạy chương trình PSoC Designer, giao diện của chương trình như hình sau:
- Đưa con trỏ về danh mục File trong menu của PSoC Designer, tìm tới danh mục New Project -> ấn Create New. Hộp thoại New Project hiển thị như hình sau:
- Lựa chọn thư mục lưu trữ và tên project, sau đó ấn nút Next, hộp thoại PSoC Designer hiển thị như hình vẽ:
- Ấn nút Yes, hộp thoại Create New Project như hình sau:
Tiếp theo ta cần chọn họ chip, loại chíp bao nhiêu chân, ngôn ngữ sử dụng trong project mà mình sử dụng, ở đây lựa chọn họ CY8C29xxx và dòng 28 chân CY8C29466, ngôn ngữ sử dụng trong tệp main là C. Ấn nút Finish để hoàn tất quá trình tạo 1 project mới.
Như vậy, sau khi hoàn thành các bước ở trên, ta đã tạo ra được 1 project mới có tên DO_AN_TN_FarSensor trong thư mục C:\Documents and Settings\Thuy Giang\My Documents\DO_AN_TN_FarSensor, lập trình cho họ chíp CY8C29466 với loại chíp 28 chân, ngôn ngữ sử dụng trong tệp main.c là ngôn ngữ C.
B2. Lựa chọn thiết bị sử dụng trong phần cứng
Ta chọn mục Device Editor, màn hình giao diện của chương trình với người sử dụng như hình sau:
- Để lựa chọn thiết bị sử dụng, ta đưa con trỏ tới các danh mục bên trái của màn hình giao diện, kích vào các danh mục, các thiết bị tương ứng trong nhóm sẽ hiển thị. Trong bài thí dụ này, ta cần 1 LCD, 1 Counter 8 bit, 1 AMUX, 1 ADCINCVR, 1 PGA, 1 LED.
- Chọn LCD, ta kích hoạt tới danh mục Misc Digital. Trong danh mục này ta kích chuột chọn LCD
Biểu tượng LCD sẽ hiển thị trong màn hình Selected User Modules như hình sau:
- Nhấp phải chuột vào biểu tượng của LCD, 1 menu hiển thị như hình trên với các chức năng như:
Delete: Xóa bỏ thiết bị đã lựa chọn
Rename: Thay đổi tên theo yêu cầu của người sử dụng.
Block Diagram: Sơ đồ khối của thiết bị
Data sheet: thông tin xem trực tiếp về thiết bị với đầy đủ thông tin như phần cứng, thí dụ lập trình cho thiết bị…
Properties: đặc tính của thiết bị
Hình sau là sơ đồ khối của LCD:
Từ sơ đồ khối này, người sử dụng sẽ biết các chân trên thiết bị LCD, để từ đó phối ghép phần cứng bên ngoài cho phù hợp.
- Lựa chọn ADCINCVR trong danh mục ADCs, và lựa chọn PGA trong danh mục Amplifiers.
Tương tự, ta sẽ chọn được Counter8, AMUX, ADCINCVR, LED trong cửa sổ Seleted User Modules như hình sau:
- Sau khi đã chọn được các thiết bị phần cứng cần thiết, trở về màn hình Interconnect View bằng việc ấn nút Interconnect View trên thanh điều khiển hoặc trong danh mục Config -> Interconnect. Giao diện của chương trình với người sử dụng.
- Đặt các thông tin cho các phần tử đã chọn
LCD:
Counter8 và ADCINCVR:
Counter8 và ADCINCVR:
PGA
Ở đây, ta đặt bộ khuyếch đại PGA có hệ số khuyếch đại =1, độ phân giải của bộ chuyển đổi ADC là 13 bit, xung đầu vào của bộ đếm là
VC1 = ( CPU_clock = 12 Mhz (SysClk/2))/12 = 1000Khz
Các thông tin trong Global Resource và chân ra của chíp PSoC, chọn như sau:
- Sau khi đã hoàn tất các bước ở trên, đưa con trỏ về danh mục Config -> Generate Application để tạo các tệp tương ứng của thiết bị vào trong project. Lúc này ta có thể trở về màn hình soạn thảo bằng cách ấn nút Application Editor hoặc vào danh mục Config -> ấn chức năng Application Editor để lập trình thao tác trên thiết bị đã chọn sử dụng.
Trong tệp của project có các tệp lcd. asm, lcd.h, lcd.inc, dac9.h, dac9.asm, dac9.inc counter8.asm. counter8.inc, counter8.h, adcincvr.h, adcincvr.inc, adcincvr. asm …do bước Generate Application tạo ra:
B3. Lập trình cho ứng dụng
Mở tệp main.c ta thấy như sau:
Lúc này ta có thể sử dụng các hàm cơ bản có sẵn của LCD, COUNTER, ADC, PDA để tạo lập ứng dụng riêng cho mình. Các hàm này có tên trong tệp *.h, để biết rõ thông tin về các hàm, cần đọc kỹ trong data sheet.
Sau khi đã lập trình xong những yêu cầu cần thiết, đưa con trỏ tới danh mục Build -> Rebuild All.
Trong cửa sổ Output của trình biên dịch hiển thị như hình trên có nghĩa project không mắc lỗi cú pháp khi lập trình.
1.2. Lưu đồ thuật toán phần mềm cho PSoC:
Lưu đồ thuật toán đầu dò Far Sensor
Khởi tạo các module ADC, AMUX, LCD, PGA, COUNTER, UART
AMUX lần lượt chọn tín hiệu đầu vào X, Y, Z đưa qua PGA vào ADC
Tính giá trị X, Y, Z và cường độ từ trường H1
Đợi lệnh từ đầu thu và Truyền dữ liệu đến Đầu thu Near Sensor
Start
ADC finish
?
+
-
Reset
Khởi tạo các module ADC, AMUX, LCD, PGA, Counter, UART
AMUX lần lượt chọn tín hiệu đầu vào X, Y, Z đưa qua PGA vào ADC
Tính giá trị X, Y, Z và cường độ từ trường H2
Ra lệnh và nhận dữ liệu H1 từ Đầu dò Far Sensor
Đầu dò Far Sensor
Tính giá trị ∆H= H1 - H2
Reset
Hiển thị LCD và truyền lên máy tính
Start
ADC finish
?
+
-
∆H > ∆Hngưỡng
Phát loa, nháy led báo hiệu
Yes
No
Chương trình phần mềm viết cho PSoC ở Phụ lục 1.1
2.Truyền thông máy tính:
Chương trình trên máy tính
Start
Đợi chỉ thị lệnh
Đọc số liệu
Hiển thị
Thiết kế chương trình trên máy tính dùng VB
Lưu đồ thuật toán.
III. Kết quả đo thực nghiệm
Bảng giá trị biến thiên ∆H đo được khi đưa một vật sắt từ khối lượng 300g lại gần và ra xa cảm biến ở các độ cao khác nhau:
Khoảng cách h
∆H (mGauss)
h = 10 cm
55 56 53 70 73 87 101 197 218 220 232 311 386 444 471 661 756 569 500 502 224 229 173 152 76 58 66
h = 20 cm
34 37 41 67 71 75 84 86 92
113 191 224 275 298 312 336 545 456 436 412 394 195 151 92 44 36 24
t
h = 10 cm
h = 20 cm
500
∆H
1000
Bảng giá trị biến thiên ∆H đo được khi đưa một vật sắt từ khối lượng 950g lại gần và ra xa cảm biến ở các độ cao khác nhau:
Khoảng cách h
∆H
h = 10 cm
112 114 148 158 1083 1786 2517 3608 3516 3386 3431 3427 3128 2875 1706 1557 1375 887 804 172
h = 20 cm
66 101 456 569 756 1091 1198 1202 1207 1218 1275 1899 2199 2122 2202 1793 1687 1486 1245 1186 637 507 499 125
t
∆H
h = 10 cm
h = 20 cm
1000
2000
3000
0
4000
Hình ảnh trang bên minh họa giá trị ∆H hiển thị trên LCD khi không có vật sắt, và khi có vật sắt xuất hiện.
- Không có vật: ∆H = 12, đèn Led báo hiệu không sáng, loa không kêu
- Có vật xuất hiện: ∆H = 2763, đèn Led báo hiện nhấp nháy, loa kêu báo cho người sử dụng
KẾT LUẬN
Đề tài ‘‘Nghiên cứu và chế tạo máy dò kim loại’’ là một đề tài mang tính thực tiễn rất lớn. Đề tài được ứng dụng công nghệ cảm biến từ trở không đẳng hướng, đây là một công nghệ mới, nhất là ở Việt Nam hiện nay. Do vậy việc tiếp cận, đặc biệt là ứng dụng công nghệ mới này đòi hỏi cần phải có thời gian nghiên cứu thỏa đáng. Thời gian làm đồ án tốt nghiệp có hạn, nên những kết quả em thu được còn nhiều hạn chế, nhưng quá trình làm đồ án đã giúp em thu lượm được rất nhiều kiến thức quý báu, giúp em tăng khả năng nghiên cứu công nghệ mới và ứng dụng những kiến thức đã được học vào thực tế.
Một lần nữa em xin gửi lời cảm ơn chân thành nhất tới những người đã đóng góp cho em những ý kiến và sự giúp đỡ quý báu. Em xin cảm ơn sự hướng dẫn tận tình của thầy giáo TS Nguyễn Quốc Cường. Em xin cảm ơn gia đình và bạn bè đã động viên, giúp đỡ em trong suốt quá trình làm đồ án.
Hà nội tháng 5 năm 2007
Sinh viên
Nguyễn Thùy Giang
TÀI LIỆU THAM KHẢO
1.Honeywell www.honeywell.com
Honeywell SSEC - Magnetic Sensors Data Sheets:
HMC105x_ 1, 2 and 3 Axis Magnetic Sensors
AN202_ magnetic sensor hybrid application circuit.pdf
AN218_ Vehicle Detection Using AMR Sensor.pdf
AN211_applications of magnetic position sensors
AN213 _ set/reset function for magnetic sensors
2.Cypress MicroSystem
DataSheet_Cy8C29x66
Technical Reference Manual
3. www.dientuvietnam.net
4. www.psocdeveloper.com
5. Kỹ năng lập trình Visual Basic – Nguyễn Tiến, Đăng xuân Hường, Ngyễn văn Hoài, Trương ngọc Vân.
PHỤ LỤC
Chương trình viết cho vi điều khiển PSoC
//FAR SENSOR
#include // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
#include
#include
int x,y,z,ref,mGx, mGy, mGz, mGref, mGH;
long H;
float Vx, Vy, Vz, Vref, VH;
char *strx, *stry,*strz,*strref, *strH;
//-----delay------------
void delay10us(void){
BYTE s;
for(s=0;s<120;s++){
asm("nop");
}
}
void delay05s(void){ int l;
for(l=0;l<500;l++){
delay10us();
}
}
//-----main----------------
void main()
{
AMUX4_1_Start();
//UART_1_CmdReset();
UART_1_EnableInt();
UART_1_Start(UART_PARITY_NONE); // Enable UART
UART_1_CPutString("Example ADC_UART_LCD"); // Example string
UART_1_PutCRLF();
PGA_3_Start(PGA_3_MEDPOWER); // Turn on PGA power
ADCINCVR_1_Start(ADCINCVR_1_MEDPOWER); // Turn on ADC power
ADCINCVR_1_GetSamples(0); // Sample forever
//,LCD_1_Start(); // Init the LCD
M8C_EnableGInt; // Enable Global interrupts
//-----while----------
while (1)// Main loop
{
//1----Vref------mGauss=0-------
AMUX4_1_InputSelect(AMUX4_1_PORT0_7);
delay05s();
if (ADCINCVR_1_fIsDataAvailable() != 0) // If ADC sample is ready...
{
ref= ADCINCVR_1_iGetData() + 2048;
ADCINCVR_1_ClearFlag();
UART_1_CPutString("PORT0_7 Vref"); // Example string
UART_1_PutCRLF();
UART_1_PutSHexInt(ref); // Print result to UART
UART_1_PutCRLF(); // Tack on a CR and LF
}
//---hien thi LCD gia tri mGauss cus Vref--------
Vref=(float)(ref + 94)*5/4184;
//mGref= (int)((Vref - 2.5)*1000);
strref= ftoa(Vref,0);
//------------------------------------------
//2-Hz------mGauss= z -------
AMUX4_1_InputSelect(AMUX4_1_PORT0_5);
delay05s();
if (ADCINCVR_1_fIsDataAvailable() != 0) // If ADC sample is ready...
{
z = ADCINCVR_1_iGetData() + 2048;
ADCINCVR_1_ClearFlag();
UART_1_CPutString("PORT0_5 Hz"); // Example string
UART_1_PutCRLF();
UART_1_PutSHexInt(z); // Print result to UART
UART_1_PutCRLF(); // Tack on a CR and LF
}
//---hien thi LCD gia tri mGauss cus Zout--------
Vz=(float)(z + 94)*5/4184;
mGz= (int)((Vz - 2.5)*1000);
strz= ftoa(mGz,0);
UART_1_PutString(strz); // Example string
UART_1_PutCRLF();
//------------------------------------------
//3-Hy------mGauss= y -------
AMUX4_1_InputSelect(AMUX4_1_PORT0_3);
delay05s();
if (ADCINCVR_1_fIsDataAvailable() != 0) // If ADC sample is ready...
{
y = ADCINCVR_1_iGetData() + 2048;
ADCINCVR_1_ClearFlag();
UART_1_CPutString("PORT0_3 Hy"); // Example string
UART_1_PutCRLF();
UART_1_PutSHexInt(y); // Print result to UART
UART_1_PutCRLF(); // Tack on a CR and LF
}
//---hien thi LCD gia tri mGauss cus Zout--------
Vy=(float)(y + 94)*5/4184;
mGy= (int)((Vy - 2.5)*1000);
stry= ftoa(mGy,0);
UART_1_PutString(stry); // Example string
UART_1_PutCRLF();
//------------------------------------------
//4-Hx------mGauss= x -------
AMUX4_1_InputSelect(AMUX4_1_PORT0_1);
delay05s();
if (ADCINCVR_1_fIsDataAvailable() != 0) // If ADC sample is ready...
{
x = ADCINCVR_1_iGetData() + 2048;
ADCINCVR_1_ClearFlag();
UART_1_CPutString("PORT0_1 Hx"); // Example string
UART_1_PutCRLF();
UART_1_PutSHexInt(x); // Print result to UART
UART_1_PutCRLF(); // Tack on a CR and LF
}
//---hien thi LCD gia tri mGauss cus Zout--------
Vx=(float)(x + 94)*5/4184;
mGx= (int)((Vx - 2.5)*1000);
strx= ftoa(mGx,0);
UART_1_PutString(strx); // Example string
UART_1_PutCRLF();
//------------------------------------------
//-5-----H---------tinh H chua dung, fai xem lai-
//VH= (mGx*mGx + mGy*mGy+ mGz*mGz);
//VH= (abs(mGx)*abs(mGx) + abs(mGy)*abs(mGy)+ abs(mGz)*abs(mGz));
//VH=sqrt(VH);
//---hien thi LCD gia tri mGauss cus Vref--------
// VH=(float)(H + 94)*5/4184;
//mGH= (int)((VH - Vref)*1000);
// strH= ftoa(VH,0);
// LCD_1_Position(1,8);
// LCD_1_PrCString("H");
// LCD_1_Position(1,9);
// LCD_1_PrString(strH);
//------------------------------------------
}
}
//NEAR SENSOR
#include // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
#include
#include
int x,y,z,ref,mGx, mGy, mGz, mGref, mGH,dx,dy,dz;
int x1,y1,z1;
int i;
long H,H2;
float Vx, Vy, Vz, Vref, VH, dH, dHm;
char *strx, *stry,*strz,*strref, *strH;
//-----delay------------
void delay10us(void){
BYTE s;
for(s=0;s<120;s++){
asm("nop");
}
}
void delay05s(void){ int l;
for(l=0;l<500;l++){
delay10us();
}
}
//-Buzzer-----
void buzzer(void){
i=10;
LED_1_Switch(1);//turn on
delay05s();
while(i>0)
{ LED_1_Invert();
delay05s();
i--;
}
LED_1_Switch(1);
}
//-Reset--------
void Reset(void){
LED_2_Switch(1);//On
delay10us();
LED_2_Invert();//Off 500ms
delay05s();
LED_2_Invert();//On 500ms
delay05s();
} //end Reset
void Tinh_dH(void){
x=y=z=3;
x1=y1=z1=1;
dx = x - x1; //x,y,z deu gia tri int cua ADC ra
dy = y - y1;
dz = z - z1;
strx= ftoa(dx,0);
LCD_1_Position(0,0);
LCD_1_PrCString("dx");
LCD_1_Position(0,2);
LCD_1_PrString(strx);
H2= dx*dx + dy*dy + dz*dz; //Binh phuong dH
stry= ftoa(H2,0);
LCD_1_Position(0,4);
LCD_1_PrCString("H2");
LCD_1_Position(0,5);
LCD_1_PrString(stry);
dH= sqrt(H2);
strz= ftoa(dH,0);
LCD_1_Position(1,0);
LCD_1_PrCString("dH");
LCD_1_Position(1,2);
LCD_1_PrString(strz);
} //end Tinh_dH
void ADC(void){// Main loop
//2-Hz------mGauss= z -------
AMUX4_1_InputSelect(AMUX4_1_PORT0_5);
delay05s();
if (ADCINCVR_1_fIsDataAvailable() != 0) // If ADC sample is ready...
{
z = ADCINCVR_1_iGetData() + 2048;
ADCINCVR_1_ClearFlag();
UART_1_CPutString("PORT0_5 Hz"); // Example string
UART_1_PutCRLF();
UART_1_PutSHexInt(z); // Print result to UART
UART_1_PutCRLF(); // Tack on a CR and LF
}
//---hien thi LCD gia tri mGauss cus Zout--------
Vz=(float)(z + 94)*5/4184;
mGz= (int)((Vz - 2.5)*1000);
strz= ftoa(mGz,0);
LCD_1_Position(1,0);
LCD_1_PrCString("Z");
LCD_1_Position(1,1);
LCD_1_PrString(strz);
UART_1_PutString(strz); // Example string
UART_1_PutCRLF();
//------------------------------------------
//3-Hy------mGauss= y -------
AMUX4_1_InputSelect(AMUX4_1_PORT0_3);
delay05s();
if (ADCINCVR_1_fIsDataAvailable() != 0) // If ADC sample is ready...
{
y = ADCINCVR_1_iGetData() + 2048;
ADCINCVR_1_ClearFlag();
UART_1_CPutString("PORT0_3 Hy"); // Example string
UART_1_PutCRLF();
UART_1_PutSHexInt(y); // Print result to UART
UART_1_PutCRLF(); // Tack on a CR and LF
}
//---hien thi LCD gia tri mGauss cus Zout--------
Vy=(float)(y + 94)*5/4184;
mGy= (int)((Vy - 2.5)*1000);
stry= ftoa(mGy,0);
LCD_1_Position(0,8);
LCD_1_PrCString("Y");
LCD_1_Position(0,9);
LCD_1_PrString(stry);
UART_1_PutString(stry); // Example string
UART_1_PutCRLF();
//------------------------------------------
//4-Hx------mGauss= x -------
AMUX4_1_InputSelect(AMUX4_1_PORT0_1);
delay05s();
if (ADCINCVR_1_fIsDataAvailable() != 0) // If ADC sample is ready...
{
x = ADCINCVR_1_iGetData() + 2048;
ADCINCVR_1_ClearFlag();
UART_1_CPutString("PORT0_1 Hx"); // Example string
UART_1_PutCRLF();
UART_1_PutSHexInt(x); // Print result to UART
UART_1_PutCRLF(); // Tack on a CR and LF
}
//---hien thi LCD gia tri mGauss cus Zout--------
Vx=(float)(x + 94)*5/4184;
mGx= (int)((Vx - 2.5)*1000);
strx= ftoa(mGx,0);
LCD_1_Position(0,0);
LCD_1_PrCString("X");
LCD_1_Position(0,1);
LCD_1_PrString(strx);
UART_1_PutString(strx); // Example string
UART_1_PutCRLF();
} //end ADC
//-----main----------------
void main(){
//-Init Hardware--------
LED_1_Start();
AMUX4_1_Start();
UART_1_Start(UART_PARITY_NONE); // Enable UART
UART_1_CPutString("Example ADC_UART_LCD"); // Example string
UART_1_PutCRLF();
PGA_3_Start(PGA_3_MEDPOWER); // Turn on PGA power
ADCINCVR_1_Start(ADCINCVR_1_MEDPOWER); // Turn on ADC power
ADCINCVR_1_GetSamples(0); // Sample forever
LCD_1_Start(); // Init the LCD
M8C_EnableGInt; // Enable Global interrupts
//-----while----------
while(1){
LED_1_Switch(0);//off loa-led
ADC();
UART();
Tinh_dH();
If dH > dHm then
{
buzzer();
delay05s();
}
Reset();
}
}
Chương trình viết trên máy tính dùng ngôn ngữ Visual Basic
Dim ttve
Dim xp
Dim yp
Dim tmp
Dim value(1 To 5) As String
Private Sub Cmddung_Click()
Static a
If a = 0 Then
Cmddung.Caption = "Tiep tuc"
a = 1
Timer1.Enabled = False
Timer2.Enabled = False
Pic.Cls
ttve = 0
Else
Cmddung.Caption = "Dung"
a = 0
Timer1.Enabled = True
Timer2.Enabled = True
ttve = 1
End If
End Sub
Private Sub Cmdthoat_Click()
End
End Sub
Private Sub Com2_OnComm()
Static Buff
Buff = Buff & Com2.Input
'If len(nhan)=4 then //kiem tra do dai
'kiem tra dau cuoi
If UCase(Left(Buff, 1) = ";") And UCase(Right(Buff, 1) = "!") Then
tmp = Buff
Label6.Caption = tmp
Buff = ""
'Com2.InBufferCount = 0
If tmp "" Then
value(1) = Trim(Mid(tmp, 2, 3))
value(2) = Trim(Mid(tmp, 5, 3))
value(3) = Trim(Mid(tmp, 8, 4))
value(4) = Trim(Mid(tmp, 12, 4))
value(5) = Trim(Mid(tmp, 16, 4))
End If
End If
End Sub
Private Sub Form_Load()
Com2.Settings = "9600,n,8,1"
Com2.PortOpen = True
Timer2.Enabled = True
Timer1.Enabled = True
'NumLED5.value = 50 //
End Sub
Private Sub NumLED5_Click()
'NumLED5.value = NumLED5.value + 1
End Sub
Private Sub Timer1_Timer()
Dim value
Times = CInt(Format(Now, "ss"))
value = NumLED5.value
If ttve = 0 Then
xp = Times * 120
yp = Pic.ScaleHeight - value * 60
ttve = 1
Else
Pic.Line (xp, yp)-(Times * 120, Pic.ScaleHeight - value * 60), vbRed
xp = Pic.CurrentX
yp = Pic.CurrentY
If Times = 59 Then
Pic.Cls
ttve = 0
End If
End If
End Sub
Private Sub Timer2_Timer()
On Error Resume Next
NumLED1.value = CSng(value1)
NumLED2.value = CSng(value2)
NumLED3.value = CSng(value3)
NumLED4.value = CSng(value4)
NumLED5.value = CSng(value5)
End Sub
Private Sub Timer3_Timer()
Lbltime = Format(Now)
Lbltime.ForeColor = RGB(Rnd * 100, Rnd * 100, Rnd * 255)
End Sub
Frm Data
Option Explicit
Dim myRS As DAO.Recordset
Dim myDB As DAO.Database
Dim rstg As DAO.Recordset
Dim RS3 As DAO.Recordset
Dim RS2 As DAO.Recordset
Dim j As Integer
Dim k As Integer
Dim i As Integer
Sub xoatongquat()
If List1.Enabled = True Then
RS2.MoveFirst
Do Until RS2.EOF
If RS2.Fields("Phut") = List1.List(List1.ListIndex) Then
RS2.Delete
RS2.MoveLast
List1.RemoveItem List1.ListIndex
Else
RS2.MoveNext
End If
Loop
Else
Timer1.Enabled = False
RS3.MoveFirst
Do Until RS3.EOF
If RS3.Fields("Nguoikiemtra") = List2.List(List2.ListIndex) Then
RS3.Delete
RS3.MoveLast
List2.RemoveItem List2.ListIndex
List1.Clear
Exit Sub
Else
RS3.MoveNext
End If
Loop
End If
End Sub
Public Sub searchten(Txtsearch As String)
Set rstg = myDB.OpenRecordset("SELECT * from Nguoikiemtra WHERE [Nguoikiemtra] like '" & Txtsearch & "*" & "' ")
If rstg.RecordCount 0 Then
rstg.MoveFirst
List2.Clear
Do Until rstg.EOF
List2.AddItem rstg.Fields("Nguoikiemtra")
List2.Visible = True
List1.Enabled = False
rstg.MoveNext
Loop
Cmdxoa.Enabled = True
Else
'Txtsearch.Text = ""
MsgBox "Khong co du lieu nao"
End If
End Sub
Sub searchph1()
Set rstg = myDB.OpenRecordset("select* from tumoitruong where H1=cint('" & Txtsearch & "')")
End Sub
Sub searchph2()
Set rstg = myDB.OpenRecordset("select* from tumoitruong where H2=cint('" & Txtsearch & "')")
End Sub
Sub searchdo1()
Set rstg = myDB.OpenRecordset("select* from tumoitruong where Do1=cint('" & Txtsearch & "')")
End Sub
Sub searchdoduc2()
Set rstg = myDB.OpenRecordset("select* from moitruong where Do2=cint('" & Txtsearch & "')")
End Sub
Sub searchdoduc3()
Set rstg = myDB.OpenRecordset("select* from tumoitruong where Do3=cint('" & Txtsearch & "')")
End Sub
Sub searchall()
If IsNumeric(Txtsearch.Text) Then
Set rstg = myDB.OpenRecordset("select* from tumoitruong where H1=cint('" & Txtsearch & "') or H2=cint('" & Txtsearch & "') or Doduc1=cint('" & Txtsearch & "') or Doduc2=cint('" & Txtsearch & "') or Do3=cint('" & Txtsearch & "')")
Else
Set rstg = myDB.OpenRecordset("select* from tumoitruong where Nguoikiemtra like '" & Txtsearch.Text & "*" & "'")
End If
End Sub
Public Sub Displaygrid()
Dim i
If rstg.RecordCount = 0 Then
MsgBox "Khong co du lieu nao"
Else
i = 1
rstg.MoveFirst
Do Until rstg.EOF
Frmgrid.Grid1.Rows = Frmgrid.Grid1.Rows + 1
With rstg
Frmgrid.Grid1.TextMatrix(i, 0) = i
Frmgrid.Grid1.TextMatrix(i, 1) = .Fields("STT")
Frmgrid.Grid1.TextMatrix(i, 2) = .Fields("Phut")
Frmgrid.Grid1.TextMatrix(i, 3) = .Fields("Giay")
Frmgrid.Grid1.TextMatrix(i, 4) = .Fields("H1")
Frmgrid.Grid1.TextMatrix(i, 5) = .Fields("H2")
Frmgrid.Grid1.TextMatrix(i, 6) = .Fields("Do1")
Frmgrid.Grid1.TextMatrix(i, 7) = .Fields("Do2")
Frmgrid.Grid1.TextMatrix(i, 8) = .Fields("Do3")
Frmgrid.Grid1.TextMatrix(i, 9) = .Fields("Nguoikiemtra")
End With
i = i + 1
rstg.MoveNext
Loop
End If
Txtsearch.Text = ""
End Sub
Sub Displaylist()
If RS2.EOF = False Then
While Not RS2.EOF
List1.AddItem RS2.Fields("Phut")
RS2.MoveNext
Wend
End If
End Sub
Public Sub THdong(List1 As ListBox, rstg As DAO.Recordset)
Dim str
str = List1.List(List1.ListIndex)
Set rstg = myDB.OpenRecordset("select * from moitruong where [Phut] = '" & str & "'")
End Sub
Function tinhmax(fld As DAO.Field)
Dim max
rstg.MoveFirst
Do Until rstg.EOF
If fld.value > max Then
max = fld.value
End If
rstg.MoveNext
Loop
tinhmax = CStr(max)
End Function
Function tinhmin(fld As DAO.Field)
Dim min
rstg.MoveFirst
min = 100
Do Until rstg.EOF
If fld.value < min Then
min = fld.value
End If
rstg.MoveNext
Loop
tinhmin = CStr(min)
End Function
Public Function tinhtb(fld As DAO.Field)
Dim tong
Dim tb As Single
Dim count
rstg.MoveFirst
Do Until rstg.EOF
tong = tong + fld.value
count = count + 1
rstg.MoveNext
Loop
If count 0 Then
tb = CSng(CSng(tong) / CSng(count))
tinhtb = CStr(tb)
End If
End Function
Private Sub displaytb()
If rstg.RecordCount 0 Then
With rstg
Txtph1tb = tinhtb(.Fields("H1"))
Txtph2tb = tinhtb(.Fields("H2"))
Txtdd1tb = tinhtb(.Fields("Do1"))
Txtdd2tb = tinhtb(.Fields("Do2"))
Txtdd3tb = tinhtb(.Fields("Do3"))
Txtph1max = tinhmax(.Fields("H1"))
Txtph2max = tinhmax(.Fields("H2"))
Txtdd1max = tinhmax(.Fields("Do1"))
Txtdd2max = tinhmax(.Fields("Do2"))
Txtdd3max = tinhmax(.Fields("Do3"))
Txtph1min = tinhmin(.Fields("H1"))
Txtph2min = tinhmin(.Fields("H2"))
Txtdd1min = tinhmin(.Fields("Do1"))
Txtdd2min = tinhmin(.Fields("Do2"))
Txtdd3min = tinhmin(.Fields("Dod3"))
End With
Txtphut.Text = List1.List(List1.ListIndex)
rstg.MoveFirst
Txtname.Text = rstg.Fields("[Nguoikiemtra]")
Else
MsgBox "Khong co du lieu nao"
End If
End Sub
Private Sub Cmdback_Click()
FrmData.Visible = False
MDIFrm.mnupass.Enabled = False
End Sub
Private Sub Cmdchitiet_Click()
Call THdong(List1, rstg)
Displaygrid
End Sub
Private Sub Cmddothi_Click()
frmfigure2.Visible = True
End Sub
Private Sub Cmdlist_Click()
List1.Enabled = True
List2.Visible = False
If RS2.RecordCount 0 Then
RS2.MoveLast
Displaylist
Timer1.Enabled = True
List1.Clear
Set RS2 = myDB.OpenRecordset("select * from theophut")
RS2.MoveFirst
End If
End Sub
Private Sub Cmdsua_Click()
Static tt
If tt = 0 Then
'Neu sua chua
Cmdsua.Caption = "Luu"
Txtname.Locked = False
Setcontrol (False)
If List1.Enabled = False Then
Txtname.Text = List2.List(List2.ListIndex)
End If
tt = 1
Else
'Luu
RS2.MoveFirst
If List1.Enabled = False Then 'Neu dang la listname
Dim rs1 As DAO.Recordset
Dim rs4 As DAO.Recordset
Set rs1 = myDB.OpenRecordset("select* from Nguoikiemtra where Nguoikiemtra='" & List2.List(List2.ListIndex) & "'")
Set rs4 = myDB.OpenRecordset("select* from Nguoikiemtra where Nguoikiemtra='" & Txtname.Text & "'")
If rs1.RecordCount 0 Then
If rs4.RecordCount = 0 Then
With rs1
.Edit
.Fields("Nguoikiemtra") = Txtname.Text
.Update
List2.List(List2.ListIndex) = Txtname.Text
End With
Else
Set rs4 = myDB.OpenRecordset("select* from theophut where Nguoikiemtra='" & List2.List(List2.ListIndex) & "'")
With rs4
.Edit
.Fields("Nguoikiemtra") = Txtname.Text
.Update
End With
Set rs4 = myDB.OpenRecordset("select* from tumoitruong where Nguoikiemtra='" & List2.List(List2.ListIndex) & "'")
With rs4
.Edit
.Fields("Nguoikiemtra") = Txtname.Text
.Update
End With
List2.RemoveItem List2.ListIndex
End If
Setcontrol (True)
End If
Else 'Neu sua theo ngay thang
Dim rs As DAO.Recordset
Dim rss As DAO.Recordset
Set rstg = myDB.OpenRecordset("select Nguoikiemtra from Nguoikiemtra where Nguoikiemtra='" & Txtname & "'")
Set rs = myDB.OpenRecordset("select* from tumoitruong where Phut='" & List1.List(List1.ListIndex) & "'")
Set rss = myDB.OpenRecordset("select* from theophut where Phut='" & List1.List(List1.ListIndex) & "'")
If rstg.RecordCount 0 Then 'neu ten sua co trong bang Nguoikiemtra
With rss
.Edit
.Fields("Nguoikiemtra") = Txtname.Text
.Fields("Phut") = List1.List(List1.ListIndex)
.Update
End With
Call editmtrphut(rs)
Else 'neu ten sua chua co trong bang Nguoikiemtra
With rss
RS3.MoveLast
RS3.AddNew
RS3.Fields("Nguoikiemtra") = Txtname.Text
RS3.Update
.Edit
.Fields("Nguoikiemtra") = Txtname.Text
.Update
Call editmtrphut(rs)
End With
End If
Setcontrol (True)
End If
tt = 0
Cmdsua.Caption = "Sua chua"
Txtname.Locked = True
Set rstg = myDB.OpenRecordset("select* from tumoitruong where Phut='" & List1.List(List1.ListIndex) & "'")
End If
End Sub
Sub Setcontrol(b As Boolean)
Txtphut.Enabled = b
Txtph1tb.Enabled = b
Txtph1max.Enabled = b
Txtph1min.Enabled = b
Txtph2max.Enabled = b
Txtph2min.Enabled = b
Txtph2tb.Enabled = b
Txtdd1tb.Enabled = b
Txtdd1max.Enabled = b
Txtdd1min.Enabled = b
Txtdd2tb.Enabled = b
Txtdd2max.Enabled = b
Txtdd2min.Enabled = b
Txtdd3tb.Enabled = b
Txtdd3max.Enabled = b
Txtdd3min.Enabled = b
End Sub
Sub Tttext()
Txtphut.Text = ""
Txtph1tb.Text = ""
Txtph1max.Text = ""
Txtph1min.Text = ""
Txtph2max.Text = ""
Txtph2min.Text = ""
Txtph2tb.Text = ""
Txtdd1tb.Text = ""
Txtdd1max.Text = ""
Txtdd1min.Text = ""
Txtdd2tb.Text = ""
Txtdd2max.Text = ""
Txtdd2min.Text = ""
Txtdd3tb.Text = ""
Txtdd3max.Text = ""
Txtdd3min.Text = ""
End Sub
Private Sub Cmdtim_Click()
Tttext
Txtname.Text = ""
If Optname = True Then
Call searchten(Txtsearch.Text)
End If
If Optph1 = True Then
searchph1
Displaygrid
If rstg.RecordCount 0 Then
Frmgrid.Visible = True
End If
End If
If Optph2 = True Then
searchph2
Displaygrid
If rstg.RecordCount 0 Then
Frmgrid.Visible = True
End If
End If
If Optdd1 = True Then
searchdoduc1
Displaygrid
If rstg.RecordCount 0 Then
Frmgrid.Visible = True
End If
End If
If Optdd2 = True Then
searchdoduc2
Displaygrid
If rstg.RecordCount 0 Then
Frmgrid.Visible = True
End If
End If
If Optdd3 = True Then
searchdoduc3
Displaygrid
If rstg.RecordCount 0 Then
Frmgrid.Visible = True
End If
End If
If Optall = True Then
searchall
Displaygrid
If rstg.RecordCount 0 Then
Frmgrid.Visible = True
End If
End If
End Sub
Private Sub Cmdxoa_Click()
Dim value
value = MsgBox("Ban co thuc su muon xoa du lieu nay?", vbQuestion + vbYesNo)
Select Case value
Case vbYes
xoatongquat
Txtsearch.Text = ""
Txtsearch.SetFocus
Case vbNo
Exit Sub
End Select
End Sub
Private Sub Form_Load()
Set myDB = OpenDatabase(App.Path & "/doan.mdb")
Set myRS = myDB.OpenRecordset("select* from tumoitruong")
Set RS2 = myDB.OpenRecordset("select* from theophut")
Set RS3 = myDB.OpenRecordset("select* from Nguoikiemtra")
Cmdchitiet.Enabled = False
Cmddothi.Enabled = False
Cmdxoa.Enabled = False
Cmdsua.Enabled = False
List2.Visible = False
Optname = True
If RS2.RecordCount 0 Then
RS2.MoveFirst
Displaylist
End If
MDIFrm.mnupass.Enabled = True
End Sub
Sub setcontrolphut()
Cmdchitiet.Enabled = True
Cmddothi.Enabled = True
Cmdxoa.Enabled = True
Cmdsua.Enabled = True
End Sub
Private Sub Form_Unload(Cancel As Integer)
MDIFrm.mnupass.Enabled = False
End Sub
Private Sub List1_Click()
setcontrolphut
Lbllist.Caption = List1.List(List1.ListIndex)
Call THdong(List1, rstg)
setcontrolphut
displaytb
End Sub
Private Sub List2_Click()
setcontrolphut
End Sub
Private Sub List2_DblClick()
Set rstg = myDB.OpenRecordset("select Phut from theophut where Nguoikiemtra='" & List2.List(List2.ListIndex) & "'")
List1.Enabled = True
List2.Visible = False
If rstg.RecordCount 0 Then
rstg.MoveFirst
List1.Clear
Timer1.Enabled = False
Do Until rstg.EOF
List1.AddItem rstg.Fields("Phut")
rstg.MoveNext
Loop
Else
MsgBox "Khong co du lieu nao"
Timer1.Enabled = False
End If
End Sub
Private Sub Timer1_Timer()
Displaylist
End Sub
Private Sub Txtname_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then
Cmdsua_Click
End If
End Sub
Private Sub txtsearch_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then
Cmdtim_Click
End If
End Sub
Sub editmtrphut(rs As DAO.Recordset)
If rs.RecordCount 0 Then
rs.MoveFirst
Do Until rs.EOF
rs.Edit
rs.Fields("Nguoikiemtra") = Txtname.Text
rs.Update
rs.MoveNext
Loop
End If
End Sub
Private Sub Txtsearch_KeyUp(KeyCode As Integer, Shift As Integer)
Set rstg = myDB.OpenRecordset("SELECT * from Nguoikiemtra WHERE [Nguoikiemtra] like '" & Txtsearch & "*" & "' ")
If rstg.RecordCount 0 Then
rstg.MoveFirst
List2.Clear
Do Until rstg.EOF
List2.AddItem rstg.Fields("Nguoikiemtra")
List2.Visible = True
List1.Enabled = False
rstg.MoveNext
Loop
Cmdxoa.Enabled = True
Else
MsgBox "Khong co du lieu nao"
End If
End Sub
MỤC LỤC
Trang
LỜI MỞ ĐẦU 1
CHƯƠNG 1: CẢM BIẾN ĐO TỪ TRƯỜNG HMC1053 3
I. Cảm biến đo từ trường 3
1.Cảm biến từ trường 3
2.Phân loai cảm biến từ trường 4
3.Cảm biến từ trở không đẳng hướng 5
4.Cảm biến đo từ trường HMC1053 6
5.Cảm biến đo từ trường HMC2003 10
II.Nguyên li nhận biết kim loại sắt từ của cảm biến HMC1053 12
1.Từ trường trái đất 12
2.Nguyên li nhận biết kim loại sắt từ của cảm biến 14
HMC1053
CHƯƠNG 2: THIẾT KẾ THIẾT BỊ 18
I. Nguyên lí làm việc của thiết bị 18
II. Thiết kế thiết bị 20
1.Chức năng -- yêu cầu của thiết bị 20
2. Lựa chọn linh kiện 20
3.Thiết kế sơ đồ khối 26
a. Sơ đồ đầu dò Far Sensor 26
b. Sơ đồ đầu thu Near sensor 27
4.Sơ đồ nguyên lý của thiết bị 28
CHƯƠNG 3: KẾT QUẢ THỰC NGHIỆM 33
I. Thiết kế phần cứng 33
1. PCB đầu dò Far Sensor 33
2. PCB đầu thu Near Sensor 34
II.Thiết kế phần mềm 34
1.Thiết kế vi điều khiển PSoC 34
1.1. Xác lập cấu trúc phần cứng cho PSoC 34
1.2. Lưu đồ thuật toán phần mềm cho PSoC 45
2.Truyền thông máy tính 47
III.Kết quả đo thực nghiệm 48
KẾT LUẬN 50
TÀI LIỆU THAM KHẢO 51
PHỤ LỤC 52
Các file đính kèm theo tài liệu này:
- 1005.doc