Bài viết 8 thuộc series STM32F103C8T6 tập trung theo hướng “học để làm được việc”. Với chủ đề ADC trên STM32F103C8T6: đọc biến trở và cảm biến analog, bạn sẽ đi từ lý thuyết cốt lõi đến quy trình triển khai thực tế trong phòng lab. Nội dung được thiết kế để sinh viên, kỹ thuật viên bảo trì và người mới chuyển từ PLC sang Embedded đều có thể áp dụng ngay vào project mẫu.
ADC là cầu nối giữa thế giới analog và phần mềm điều khiển. Nếu đọc ADC thiếu ổn định, toàn bộ vòng điều khiển phía sau sẽ sai lệch, kể cả khi thuật toán đúng.
1. Mục tiêu bài học
Bài tập trung vào luồng từ phần cứng lấy mẫu đến xử lý số: cấu hình ADC, chuyển đổi ra điện áp, lọc tín hiệu và đánh giá sai số.
- Hiểu nguyên lý ADC 12-bit và dải đo điện áp.
- Cấu hình ADC single channel trên STM32F103C8T6.
- Quy đổi ADC raw sang điện áp và đại lượng vật lý.
- Giảm nhiễu đo bằng lọc trung bình và bố trí phần cứng hợp lý.
Sau khi hoàn thành, bạn nên tự trả lời được ba câu hỏi: hệ thống cần đo/điều khiển đại lượng gì, vòng đời xử lý dữ liệu chạy theo chu kỳ nào, và cơ chế bảo vệ lỗi nào cần có để hệ thống ổn định khi chạy liên tục ngoài hiện trường.
2. Kiến thức nền tảng
STM32F103C8T6 dùng lõi ARM Cortex-M3, phù hợp để học đồng thời kiến trúc MCU và phương pháp lập trình thời gian thực. Khi học theo lộ trình chuẩn, bạn nên nắm đồng thời phần cứng (clock, GPIO, bus, nguồn), firmware (HAL/LL, ngắt, timer), và phương pháp test (scope, logic analyzer, UART log). Việc kết hợp đủ ba lớp kiến thức giúp quá trình debug nhanh hơn nhiều so với chỉ học code thuần.
- Độ phân giải ADC và sai số lượng tử hóa.
- Sample time và ảnh hưởng trở kháng nguồn tín hiệu.
- Nhiễu nguồn, nhiễu đất và ảnh hưởng đến kết quả đo.
- Các kỹ thuật lọc số cơ bản cho tín hiệu analog.
Trong quá trình thực hành, bạn nên duy trì checklist kiểm thử ở từng vòng: xác nhận wiring, xác nhận xung clock, xác nhận trạng thái ngoại vi, sau đó mới kiểm tra thuật toán. Cách làm này giảm đáng kể lỗi dây chuyền và giúp nhóm dự án phối hợp hiệu quả giữa phần cứng và phần mềm.
3. Phân tích kỹ thuật
Cấu hình ADC 12-bit và sample time
Sample time quá ngắn với nguồn trở kháng cao sẽ làm tụ lấy mẫu chưa kịp nạp đầy, gây sai số. Vì vậy cần chọn sample time theo đặc tính cảm biến và mạch chia áp.
- Bắt đầu với sample time trung bình rồi tối ưu dần.
- Với cảm biến chậm, ưu tiên độ ổn định hơn tốc độ.
- Ghi chú rõ cấu hình sample time trong tài liệu dự án.
Quy đổi ADC sang điện áp và nhiệt độ
Giá trị ADC raw phải được quy đổi theo Vref thực tế, không nên giả định luôn 3.3 V tuyệt đối. Với LM35, cần thêm bước nhân hệ số 10 mV/°C để ra nhiệt độ.
- Đo Vref thực tế bằng đồng hồ khi cần độ chính xác cao.
- Dùng kiểu số thực hoặc fixed-point tùy tài nguyên.
- Hiệu chuẩn hệ số bằng 2 điểm đo chuẩn.
Lọc tín hiệu và ổn định hiển thị
Tín hiệu analog thường dao động nhẹ, vì vậy hiển thị trực tiếp raw ADC sẽ gây nhấp nháy. Lọc trung bình trượt hoặc EMA giúp kết quả mượt hơn mà vẫn giữ độ đáp ứng.
- Dùng cửa sổ trung bình 8-32 mẫu cho tín hiệu chậm.
- Kết hợp deadband để tránh cập nhật hiển thị quá dày.
- Tách tần suất lấy mẫu và tần suất hiển thị.
Từ góc nhìn hệ thống, chủ đề này không chỉ là “chạy được chức năng”, mà còn là bài toán tối ưu độ tin cậy, độ trễ xử lý, khả năng mở rộng khi thêm cảm biến hoặc thêm kênh truyền thông. Nếu ngay từ đầu bạn chuẩn hóa cấu trúc code theo module driver/app/service thì giai đoạn mở rộng về sau sẽ nhẹ hơn rất nhiều.
4. Các bước thực hiện
Đo điện áp thật bằng đồng hồ để đối chiếu với kết quả ADC trước khi tối ưu thuật toán.
- Kết nối biến trở vào kênh ADC và kiểm tra dải điện áp thực.
- Cấu hình ADC single conversion trong CubeMX.
- Đọc raw ADC bằng polling hoặc interrupt.
- Quy đổi về điện áp và in ra UART.
- Áp dụng lọc trung bình để ổn định kết quả.
- Đánh giá sai số bằng cách so sánh với đồng hồ số.
Ở mỗi bước, bạn nên lưu log kỹ thuật (ảnh wiring, ảnh cấu hình CubeMX, thông số timer/UART/ADC, snapshot kết quả đo). Bộ log này giúp giảng viên hoặc trưởng nhóm đánh giá tiến độ nhanh và giảm thời gian trao đổi khi cần hỗ trợ từ xa.
5. Ví dụ đọc ADC và quy đổi điện áp
Code dưới đây là mẫu rút gọn theo HAL Library, tập trung phần cốt lõi để bạn nhìn rõ luồng xử lý. Khi đưa vào dự án thực, hãy tách code thành các module rõ ràng, thêm kiểm tra lỗi trả về và timeout cho mọi giao tiếp ngoại vi.
uint16_t adc_raw = 0;
float vref = 3.3f;
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 10);
adc_raw = HAL_ADC_GetValue(&hadc1);
float voltage = (adc_raw * vref) / 4095.0f;
printf("ADC=%u, V=%.3f\r\n", adc_raw, voltage);
Nguyên tắc quan trọng: giữ hàm ngắt ngắn gọn, xử lý nặng chuyển về vòng lặp chính hoặc task nền; dùng biến trạng thái rõ ràng để tránh race condition; thêm timeout cho mọi thao tác có thể block. Đây là nền tảng để firmware ổn định khi chạy lâu dài.
6. Lỗi thường gặp
Phần lớn lỗi trong STM32F103C8T6 đến từ cấu hình chưa đồng bộ giữa clock, ngoại vi và wiring thực tế. Nếu bạn xử lý theo thứ tự “đọc triệu chứng -> khoanh vùng lớp lỗi -> test độc lập từng khối”, thời gian debug sẽ giảm rất rõ.
- Quên cấu hình chân ADC ở mode analog.
- Sample time quá ngắn với nguồn tín hiệu trở kháng cao.
- Không tách mass analog/digital trong mạch thực tế.
- Hiển thị trực tiếp raw ADC gây dao động khó đọc.
- Sai công thức quy đổi do nhầm độ phân giải.
Ưu tiên thiết kế nguồn tham chiếu sạch và nối mass đúng trước khi xử lý lọc số phức tạp.
7. Bài tập thực hành
Để chuyển từ mức “hiểu lý thuyết” sang “làm chủ kỹ năng”, bạn nên làm các bài tập sau theo đúng thứ tự từ dễ đến khó, sau mỗi bài đều ghi lại tiêu chí đạt/chưa đạt và thông số đo thực tế.
- Đọc LM35 và hiển thị nhiệt độ theo °C qua UART.
- So sánh 3 bộ lọc: trung bình, median, EMA.
- Thiết kế cảnh báo khi điện áp vượt ngưỡng đặt trước.
- Ghi log ADC 1000 mẫu để phân tích nhiễu bằng Excel.
Khuyến nghị chấm bài theo rubric: đúng chức năng (40%), độ ổn định 30 phút chạy liên tục (30%), chất lượng cấu trúc code (20%), tài liệu kỹ thuật và báo cáo đo kiểm (10%).
Tài liệu tham khảo
- STMicroelectronics, STM32F103x8/B Datasheet.
- STMicroelectronics, RM0008 Reference Manual: STM32F10xxx advanced ARM-based 32-bit MCUs.
- STMicroelectronics, UM1850 STM32CubeMX user manual và tài liệu STM32Cube liên quan.
- ARM, Cortex-M3 Technical Reference Manual.
- STMicroelectronics Application Notes về GPIO, ADC, Timer, UART, I2C, SPI, DMA và Watchdog.