Nghiên cứu và chế tạo máy dò kim loại

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

doc73 trang | Chia sẻ: banmai | Ngày: 27/02/2013 | Lượt xem: 251 | Lượt tải: 0download
Tóm tắt tài liệu Nghiên cứu và chế tạo máy dò kim loại, để tải tài liệu về máy 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:

  • doc1005.doc
Tài liệu liên quan