Bối cảnh và vấn đề nghiên cứu

Trong các hệ thống kỹ thuật và quy trình công nghiệp, việc giám sát nhiệt độ tại các khu vực làm việc của máy móc, động cơ hay trong các môi trường độc hại đòi hỏi phải thu thập dữ liệu gián tiếp từ xa. Các thiết bị đo nhiệt độ truyền thống bộc lộ nhiều hạn chế khi không thể tự động lưu trữ dữ liệu theo thời gian thực hoặc thiếu khả năng kết nối điều khiển phản hồi hệ thống. Việc ứng dụng máy tính kết hợp với phần cứng thu thập dữ liệu giúp số hóa các đại lượng vật lý, hỗ trợ lưu trữ và xử lý thông tin chính xác.

Đồ án tốt nghiệp "Ứng dụng Visual Basic lập trình cho card giao tiếp máy tính dùng đo nhiệt độ" của sinh viên Hoàng Mạnh Long (ngành Điện - Điện tử, Trường Đại học Sư phạm Kỹ thuật TP. Hồ Chí Minh, năm 2001) tập trung giải quyết bài toán giao tiếp phần cứng và phát triển giao diện phần mềm giám sát.

Nhiệm vụ và mục tiêu nghiên cứu cụ thể bao gồm:

  1. Nghiên cứu nguyên lý hoạt động của card giao tiếp máy tính qua khe cắm mở rộng (Slot Card) sử dụng vi mạch ngoại vi khả trình 8255 và bộ chuyển đổi tương tự - số (ADC 0809).
  2. Xây dựng thư viện liên kết động Win32 Dynamic Link Library (8255.dll) bằng Microsoft Visual C++ 6.0 nhằm cung cấp các hàm giao tiếp cổng vào/ra (I/O Port) trực tiếp cho môi trường Windows.
  3. Thiết kế và lập trình giao diện người dùng bằng Microsoft Visual Basic 6.0 để cấu hình thông số đo, thu nhận tín hiệu, hiển thị biểu đồ điểm theo thời gian thực và lưu trữ dữ liệu đo đạc vào tập tin văn bản.

Phạm vi nghiên cứu được giới hạn trong việc thiết kế và thi công phần mềm điều khiển cho card giao tiếp máy tính đo nhiệt độ trong thời gian thực hiện 6 tuần.


Cơ sở lý thuyết và phương pháp nghiên cứu

Khung cơ sở lý thuyết

Đề tài vận dụng hai nhóm lý thuyết nền tảng:

  • Kiến trúc máy tính và giao tiếp vào/ra: Cấu trúc phần cứng máy tính gồm khối xử lý trung tâm (CPU), bộ nhớ (RAM/ROM), thiết bị nhập/xuất và hệ thống Bus (Bus dữ liệu, Bus địa chỉ, Bus điều khiển). Cơ chế định địa chỉ cổng I/O và nguyên lý hoạt động của vi mạch ghép nối 8255 PPI (Programmable Peripheral Interface).
  • Cơ sở cảm biến đo nhiệt độ:
    • Các thang đo nhiệt độ: Kelvin ($K$), Celsius ($^\circ\text{C}$) với quan hệ $T(^\circ\text{C}) = T(\text{K}) - 273$, và Fahrenheit ($^\circ\text{F}$) với quan hệ $T(^\circ\text{F}) = \frac{9}{5}T(^\circ\text{C}) + 32$.
    • Cảm biến nhiệt điện trở kim loại: Sử dụng các vật liệu Platin (Pt, dải đo $-200^\circ\text{C} \div 1000^\circ\text{C}$), Niken (Ni, đo dưới $250^\circ\text{C}$), Đồng (Cu, đo dưới $180^\circ\text{C}$), Vonfram (W). Biểu thức tuyến tính hóa: $R(T + \Delta T) = R(T)(1 + \alpha_0 \Delta T)$.
    • Nhiệt điện trở bán dẫn (Thermistor): Mối quan hệ điện trở - nhiệt độ $R(T) = R_\infty \exp(B/T)$ với hệ số $B$ trong khoảng $3000\text{K} \div 5000\text{K}$.
    • Cảm biến Silic: Hoạt động trong dải $-50^\circ\text{C} \div 120^\circ\text{C}$ với hệ số nhiệt điện trở dương xấp xỉ $+0,7%/^\circ\text{C}$.
    • Cặp nhiệt điện (Thermocouple): Dựa trên hiệu ứng nhiệt điện Seebeck, Peltier và Thomson (Đồng/Constantan, Sắt/Constantan...).
    • Chuyển tiếp p-n (Diode/Transistor): Sử dụng mạch cặp transistor triệt tiêu dòng ngược với điện áp vi phân $V_d = 86,56 \cdot T \cdot \ln(n)$, cho độ nhạy nhiệt $S = 86,56 \cdot \ln(n)\ (\mu\text{V/K})$ tuyến tính theo nhiệt độ.

Phương pháp nghiên cứu

  • Phương pháp thu thập dữ liệu tài liệu: Áp dụng kỹ thuật đọc loang rộng kết hợp ba mức độ đọc (đọc lướt, đọc kỹ, đọc từng đoạn) các tài liệu về cấu trúc máy tính, vi mạch số, cảm biến và kỹ thuật lập trình ghép nối trong Windows.
  • Phương pháp phân tích công trình liên hệ: Kế thừa và đánh giá đề tài "Thiết kế và thi công card giao tiếp máy tính với các đầu đo tương tự" của nhóm tác giả Trần Vĩnh An, Nguyễn Minh Anh và Nguyễn Tuấn Khanh. Công trình trước sử dụng ngôn ngữ Pascal trong môi trường DOS; đề tài này cải tiến sang giao diện đồ họa Windows với Visual Basic 6.0.
  • Phương pháp thực nghiệm và mô hình hóa: Xây dựng thuật toán đệm mảng bộ nhớ để khắc phục độ trễ hiển thị và lưu trữ dữ liệu nhị phân nhận được từ phần cứng.

Thiết kế và triển khai hệ thống

Kiến trúc phần cứng và bảng phân vùng địa chỉ

Hệ thống ghép nối phần cứng gồm các khối chức năng:

  • Khối đệm bus dữ liệu: IC 74245 (khuếch đại dòng điện giao tiếp giữa slot máy tính và card).
  • Khối giải mã địa chỉ: IC 7427, IC 7420 và IC 7404 (lọc và giải mã địa chỉ từ bus máy tính).
  • Khối nhập/xuất khả trình: IC 8255.
  • Khối biến đổi tín hiệu tương tự sang số: ADC 0809, mạch tạo xung clock và tầng khuếch đại thuật toán Op-amp 741 dịch mức điện áp.
Tên Port IC 8255 Địa chỉ Hex Địa chỉ Dec Chức năng quy ước trong hệ thống
Port A (PA) 300H 768 Nhận dữ liệu số 8-bit ($D_0 \div D_7$) từ đầu ra của ADC 0809
Port B (PB) 301H 769 Xuất tín hiệu điều khiển chọn kênh đo và kích xung chuyển đổi
Port C (PC) 302H 770 4-bit thấp ($PC_L$) đọc cờ trạng thái kết thúc biến đổi ($EOC$) tại chân $P_9$
Thanh ghi điều khiển 303H 771 Nạp từ điều khiển khởi tạo cấu hình cho các cổng của 8255

ADC 0809 sử dụng điện áp chuẩn $V_{ref} = 5\text{V}$, độ phân giải 8-bit ($2^8 - 1 = 255$ mức): $$\text{Độ phân giải} = \frac{V_{ref}}{255} = \frac{5}{255} \approx 19,6\text{ mV/bit}$$

Tín hiệu điện áp ngõ vào card giao tiếp biến thiên theo tỷ lệ $0,05\text{V}/1^\circ\text{C}$ ($50\text{mV}/^\circ\text{C}$). Công thức tính toán nhiệt độ từ giá trị số nhận được: $$\text{Nhietdo} = \frac{\text{Giatri} \times 19,6}{50} = \text{Giatri} \times 0,392\ (^\circ\text{C})$$

Xây dựng thư viện động DLL và tích hợp phần mềm

Visual Basic 6.0 chạy trên nền Windows không hỗ trợ trực tiếp các lệnh truy xuất cổng vào/ra phần cứng như DOS. Giải pháp triển khai là xây dựng thư viện Win32 DLL mang tên 8255.dll bằng Microsoft Visual C++ 6.0:

  • Tập tin định nghĩa 8255.def: Khai báo bảng xuất hàm Out8255 @1 và In8255 @2.
  • Tập tin mã nguồn 8255.cpp: Sử dụng hàm _inp() và _outp() của thư viện conio.h, ép kiểu dữ liệu short (16-bit) để tương thích kiểu Integer trong Visual Basic.
  • Thư viện 8255.dll sau khi biên dịch được đặt vào thư mục C:\WINDOWS của hệ điều hành.
// Trích xuất mã nguồn hàm xuất/nhập cổng trong 8255.cpp
#include <windows.h>
#include <conio.h>

short _stdcall Out8255(int PortAddress, int PortData) {
    short Dummy;
    Dummy = (short)(_outp(PortAddress, PortData));
    return (Dummy);
}

short _stdcall In8255(int PortAddress) {
    short PortData;
    PortData = (short)(_inp(PortAddress));
    return (PortData);
}

Trong Visual Basic 6.0, các hàm này được liên kết động thông qua khai báo API:

Private Declare Function Out8255 Lib "8255.dll" (ByVal PortAddress As Integer, ByVal PortData As Integer) As Integer
Private Declare Function In8255 Lib "8255.dll" (ByVal PortAddress As Integer) As Integer

Nội dung chính theo từng chương

Chương dẫn nhập

Chương dẫn nhập trình bày tính cấp thiết của việc kết hợp máy tính với thiết bị ngoại vi trong tự động hóa đo lường. Tác giả nêu rõ quy trình thực hiện đồ án trong 6 tuần qua ba giai đoạn: tiếp cận vấn đề, thu thập dữ kiện và xử lý dữ kiện.

Chương này phân tích chi tiết công trình card đo tín hiệu tương tự của nhóm sinh viên Trần Vĩnh An, Nguyễn Minh Anh, Nguyễn Tuấn Khanh. Hệ thống phần cứng trước đây sử dụng đầu dò thu nhận tín hiệu biên độ $1\text{V} \div 1000\text{V}_{p-p}$ (tần số cực đại $200\text{Hz}$), đi qua bộ suy giảm, khối ADC và card giao tiếp với máy vi tính chạy phần mềm Pascal. Nhược điểm chính của công trình cũ là phụ thuộc vào môi trường Pascal, không đo được khoảng cách xa và giao diện đơn giản. Đồ án hiện tại chọn hướng kế thừa phần cứng ghép nối và nâng cấp toàn bộ giải pháp phần mềm trên Windows.

Chương 1: Cơ sở lý luận

Chương 1 hệ thống hóa lý thuyết về cấu tạo máy vi tính và các nguyên lý đo lường nhiệt độ. Cấu trúc máy tính được mô tả qua sơ đồ liên kết giữa CPU, bộ nhớ RAM/ROM, thiết bị vào/ra và ba hệ thống bus (Address bus, Data bus, Control bus với tín hiệu đọc/ghi $\text{R}/\overline{\text{W}}$).

Phần cảm biến phân tích các thang đo vật lý và các kỹ thuật đo nhiệt độ trong lòng vật rắn (yêu cầu chiều sâu lỗ khoan $L \ge 10r$ và giảm trở kháng nhiệt tiếp xúc). Các loại cảm biến được khảo sát chi tiết gồm: điện trở kim loại Pt, Ni, Cu, W; nhiệt điện trở Oxyt bán dẫn ($R - T$); cảm biến nhiệt bán dẫn Silic; cặp nhiệt điện Seebeck dựa trên hiệu ứng Peltier và Thomson; cảm biến bán dẫn tiếp giáp p-n sử dụng cặp transistor vi sai triệt tiêu dòng ngược.

Chương 2: Nguyên lý làm việc chung của card giao tiếp dùng đo nhiệt độ từ xa

Chương này thuyết minh sơ đồ khối và nguyên lý hoạt động của card giao tiếp:

  1. Máy tính xuất dữ liệu cấu hình đến địa chỉ 303H (771) để khởi tạo 8255 ($PA$ và $PC_L$ làm ngõ vào; $PB$ và $PC_H$ làm ngõ xuất).
  2. Xuất dữ liệu đến địa chỉ 301H (769) để chọn kênh đo và gửi tín hiệu kích xung START cho ADC 0809.
  3. ADC 0809 chuyển đổi điện áp thành tín hiệu số 8-bit và xuất tín hiệu báo hoàn tất chuyển đổi ($EOC$) về bus $P_9$.
  4. Máy tính đọc địa chỉ 302H (770) để kiểm tra trạng thái $PC_L$; khi $EOC = 1$, máy tính gửi lệnh qua 301H kích tín hiệu cho phép xuất ngõ ra ($OE$) của ADC 0809.
  5. Máy tính đọc cổng 300H (768) lấy dữ liệu số từ Port A của 8255 và thực hiện tính toán chuyển đổi thành giá trị nhiệt độ.

Chương 3: Làm quen với Visual Basic

Chương 3 giới thiệu môi trường phát triển tích hợp (IDE) của Visual Basic 6.0:

  • Cấu hình cài đặt: Yêu cầu hệ điều hành Windows 95 trở lên hoặc Windows NT Workstation 4.0, vi xử lý tối thiểu 486DX/66MHz (khuyến nghị Pentium), tối thiểu 24MB RAM cho Windows 95 và 32MB RAM cho Windows NT.
  • Thành phần IDE: Giới thiệu thanh thực đơn, thanh công cụ, cửa sổ biểu mẫu (Form), cửa sổ soạn thảo mã lệnh (Code Editor), cửa sổ quản lý dự án (Project Explorer), cửa sổ thiết lập thuộc tính (Properties Window) và cửa sổ bố trí biểu mẫu (Form Layout).

Chương 4: Hướng dẫn sử dụng chương trình đo nhiệt độ

Chương này hướng dẫn chi tiết giao diện người dùng và chức năng các thành phần điều khiển:

  • Thanh Menu chính:
    • Menu File: Các lệnh New, Open, Close, Save, Save As, Exit.
    • Menu Set: Custom (cấu hình tham số kênh, màu sắc, chu kỳ) và Default (nạp tham số mặc định).
    • Menu Help: Mục How to use... liên kết gọi tập tin trợ giúp .doc/.txt.
  • Cửa sổ giám sát Measure: Chứa nút Start (bắt đầu đo), Stop (dừng đo), vùng hiển thị đồ thị điểm theo tỷ lệ, bảng danh sách số liệu và các đèn chỉ báo ngưỡng cực trị ($0^\circ\text{C}$ và $100^\circ\text{C}$).
  • Cửa sổ cấu hình Custom:
    • Hộp chọn SelectInput: Cho phép chọn kênh đo từ Input1 đến Input8.
    • Hộp chọn SelectColour: Chọn màu hiển thị điểm đo qua bảng màu CommonDialog hoặc tạo màu tùy biến (Add to Custom Colors).
    • Hộp chọn SelectSteptime: Thiết lập chu kỳ lấy mẫu (1sec, 30sec, 60sec, 5min, 10min, 30min, 60min).

Chương 5: Tạo tập tin hỗ trợ cho Visual Basic 6.0 truy xuất card giao tiếp

Trình bày quy trình 5 bước phát triển thư viện Win32 Dynamic Link Library trên Microsoft Visual C++ 6.0:

  1. Soạn thảo mã nguồn tập tin định nghĩa 8255.def và tập tin mã nguồn C++ 8255.cpp.
  2. Tạo dự án mới kiểu Win32 Dynamic Link Library với tên 8255.
  3. Thêm hai tập tin 8255.cpp và 8255.def vào thư mục mã nguồn của dự án (Add Files to Project).
  4. Biên dịch mã nguồn bằng menu Build / Build 8255.dll.
  5. Đưa tập tin 8255.dll vào thư mục hệ thống C:\WINDOWS và khai báo cấu trúc hàm trong Visual Basic.

Chương 6: Lập trình cho chương trình đo nhiệt độ

Chương 6 trình bày toàn bộ kiến trúc lập trình của ứng dụng:

  • Thiết lập thuộc tính các biểu mẫu (Frmmain, Frmcustom, Frmmeasure) và các nút điều khiển (Cmdstart, Cmdstop, Cmdset, Lstgiatri, PictureBox...).
  • Xây dựng lưu đồ thuật toán chi tiết: Lưu đồ tổng quát toàn chương trình, lưu đồ cửa sổ Main, lưu đồ cửa sổ Custom (chu trình một lần đo) và lưu đồ cửa sổ Measure (thuật toán vẽ điểm đồ thị).
  • Cơ chế quản lý bộ đệm mảng: Sử dụng mảng cấu trúc tĩnh 3600 phần tử (mang(3600)), chia đôi làm hai mảng con (từ 0 đến 1799 và từ 1800 đến 3599). Khi nạp đầy mảng con thứ nhất và gặp ký hiệu kết thúc EOF1, dữ liệu được ghi đồng loạt vào tập tin tạm (filetam.txt thông qua đối tượng FileSystemObject), mảng con được làm sạch về ký tự #, sau đó tiến trình tiếp tục chuyển sang mảng con thứ hai nhằm chống nghẽn và mất dữ liệu trong quá trình hiển thị.
  • Trình bày chi tiết toàn bộ mã nguồn chương trình tại các Form và Module.

Chương kết luận

Tổng kết việc hoàn thành đề tài sau 6 tuần nghiên cứu, đánh giá kết quả đạt được về mặt lý thuyết và thi công thực nghiệm phần mềm giao tiếp phần cứng. Nêu rõ nhược điểm phụ thuộc vào cấu hình cài đặt Visual Basic 6 và đề xuất các định hướng nâng cấp hệ thống.


Kết quả và đóng góp

Kết quả đạt được

  • Xây dựng thành công thư viện liên kết động trung gian 8255.dll giải quyết triệt để rào cản truy xuất cổng phần cứng trong môi trường Windows 32-bit cho Visual Basic 6.0.
  • Hoàn thiện phần mềm giao diện đồ họa hỗ trợ giám sát nhiệt độ với đầy đủ các tính năng:
    • Lựa chọn độc lập 8 kênh đầu đo ngõ vào (Input1 đến Input8).
    • Tùy biến chu kỳ lấy mẫu từ 1 giây đến 60 phút.
    • Hiển thị trực quan dữ liệu dưới dạng đồ thị điểm và bảng số liệu số.
    • Tự động lưu trữ và xuất dữ liệu ra tập tin văn bản.
  • Triển khai thuật toán phân đoạn bộ đệm mảng cố định kết hợp tập tin tạm giúp xử lý đồng thời quá trình đọc dữ liệu từ card và vẽ đồ thị mà không làm treo giao diện.

Đóng góp kỹ thuật

So với công trình đo tín hiệu tương tự bằng Turbo Pascal trên nền DOS trước đó, đề tài đã:

  1. Chuyển đổi toàn bộ nền tảng giám sát sang môi trường Windows với giao diện đồ họa trực quan, dễ thao tác.
  2. Cung cấp phương pháp mẫu về việc sử dụng Visual C++ viết DLL can thiệp thanh ghi cổng I/O để nhúng vào các ngôn ngữ lập trình cấp cao.

Hạn chế và hướng nghiên cứu tiếp

Hạn chế

  • Phần mềm phụ thuộc vào môi trường cài đặt Visual Basic 6.0 và các tập tin thư viện liên kết động hệ thống; máy tính cần cài đặt Windows 98/Windows 95 với cấu hình phần cứng tương thích.
  • Giao diện đồ thị mới chỉ hỗ trợ vẽ đồ thị dạng điểm rời rạc và hiển thị một kênh đo tại một thời điểm vận hành.
  • Chưa tích hợp tính năng tự động phát tín hiệu điều khiển phản hồi ngược từ máy tính về card để đóng/ngắt các thiết bị ngoại vi khi nhiệt độ vượt ngưỡng.

Hướng nghiên cứu tiếp

  • Bổ sung các chế độ hiển thị đồ thị đa dạng hơn như dạng đường nối liên tục (line chart), dạng sóng.
  • Nâng cấp phần mềm để quét và hiển thị đồng thời cả 8 kênh đầu đo trên cùng một màn hình đồ thị.
  • Lập trình chức năng điều khiển tự động: xuất tín hiệu tác động ngược lại card giao tiếp để đóng cắt rơ-le hoặc điều khiển công suất thiết bị gia nhiệt.
  • Mở rộng phạm vi ứng dụng của card giao tiếp để đo lường các đại lượng vật lý khác như áp suất, điện áp, độ ẩm.

Giá trị tham khảo

Đồ án là tài liệu tham khảo phù hợp cho:

  • Sinh viên ngành Kỹ thuật Điện - Điện tử, Kỹ thuật Điều khiển và Tự động hóa, Công nghệ Kỹ thuật Máy tính làm đồ án tốt nghiệp hoặc môn học về ghép nối máy tính và thu thập dữ liệu (DAQ).
  • Người lập trình cần giải pháp can thiệp cổng vào/ra (Port I/O) trên hệ điều hành Windows bằng cách xây dựng DLL trung gian C/C++ kết hợp giao diện Visual Basic.
  • Tài liệu tham khảo hữu ích cho các nội dung tính toán đặc tính cảm biến nhiệt độ (Pt, Ni, Thermistor, Thermocouple, Transistor) và kỹ thuật phân phối địa chỉ bus cho vi mạch ghép nối 8255 và ADC 0809.

Câu hỏi thường gặp

1. Tại sao đề tài phải sử dụng Microsoft Visual C++ 6.0 để viết thư viện 8255.dll thay vì lập trình hoàn toàn trên Visual Basic 6.0?
Visual Basic 6.0 trên nền tảng Win32 không có các hàm truy xuất trực tiếp mức thanh ghi của cổng I/O. Do đó, tác giả sử dụng Visual C++ gọi các hàm nội tại _inp() và _outp() trong conio.h để đóng gói thành tập tin thư viện 8255.dll, sau đó khai báo hàm API để Visual Basic gọi trực tiếp.

2. Địa chỉ cổng I/O của card giao tiếp được cấu hình như thế nào trong đồ án?
Hệ thống sử dụng không gian địa chỉ từ 300H đến 303H (hệ thập phân từ 768 đến 771):

  • Port A (300H / 768): Nhận dữ liệu số từ ADC.
  • Port B (301H / 769): Xuất tín hiệu chọn kênh và kích xung bắt đầu đổi tín hiệu.
  • Port C (302H / 770): Đọc cờ báo kết thúc chuyển đổi $EOC$.
  • Thanh ghi điều khiển (303H / 771): Nạp từ điều khiển khởi tạo hoạt động cho 8255.

3. Công thức chuyển đổi giá trị số từ ADC 0809 sang nhiệt độ hiển thị được tính như thế nào?
Với $V_{ref} = 5\text{V}$, độ phân giải của ADC 0809 8-bit là $19,6\text{mV/bit}$. Tín hiệu cảm biến sau tầng khuếch đại có độ nhạy $0,05\text{V}/1^\circ\text{C}$ ($50\text{mV}/^\circ\text{C}$). Công thức tính nhiệt độ là: $$\text{Nhietdo} = \frac{\text{Giatri} \times 19,6}{50} = \text{Giatri} \times 0,392$$ Kết quả sau đó được làm tròn thành số nguyên thông qua hàm Round().

4. Tác giả đã giải quyết vấn đề nghẽn dữ liệu giữa tiến trình đọc từ card và tiến trình hiển thị trên giao diện như thế nào?
Tác giả thiết lập một mảng bộ đệm tĩnh gồm 3600 phần tử chia làm hai nửa (0 đến 1799 và 1800 đến 3599). Các vị trí chưa có dữ liệu được gán ký tự #. Khi tiến trình vẽ gặp mốc EOF1 hoặc EOF2, toàn bộ dữ liệu của phân đoạn mảng đó lập tức được ghi vào tập tin lưu trữ tạm (filetam.txt), mảng con được thiết lập lại về #, và việc thu thập dữ liệu chuyển sang phân đoạn còn lại mà không làm gián đoạn hiển thị.


Kết luận

Đồ án tốt nghiệp của sinh viên Hoàng Mạnh Long đã hoàn thành việc thiết kế và xây dựng phần mềm đo nhiệt độ từ xa qua card giao tiếp máy tính bằng Visual Basic 6.0 kết hợp thư viện C++ DLL. Hệ thống thực hiện việc thu thập dữ liệu 8 kênh ngõ vào qua vi mạch 8255 và ADC 0809, hiển thị kết quả trực quan trên đồ thị và lưu trữ dữ liệu có cấu trúc. Đây là công trình kỹ thuật kết hợp giữa phần cứng số hóa và phần mềm ứng dụng Windows, cung cấp tài liệu tham khảo cho các bài toán ghép nối máy tính và đo lường điều khiển.