Bài viết 18 thuộc series STM32F103C8T6 tập trung theo hướng “học để làm được việc”. Với chủ đề Điều khiển động cơ DC bằng STM32F103C8T6, PWM và L298N, 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.
Điều khiển động cơ là bài học quan trọng để kết nối kiến thức điện tử công suất với firmware nhúng. Bài này tập trung vào điều tốc và đảo chiều an toàn, phù hợp cho robot mini hoặc băng tải mô hình.
1. Mục tiêu bài học
Bạn sẽ xây module motor driver có API rõ ràng, dễ tích hợp vào project lớn và sẵn sàng nâng cấp PID vòng kín.
- Hiểu nguyên lý driver cầu H L298N và giới hạn thực tế.
- Điều khiển tốc độ bằng PWM và chiều quay bằng chân số.
- Giảm giật khi đổi chiều động cơ.
- Chuẩn bị nền tảng nâng cấp vòng kín bằng encoder.
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.
- Mối quan hệ duty cycle và tốc độ động cơ.
- Sụt áp trên L298N và ảnh hưởng mô-men.
- Nhiễu ngược từ motor và biện pháp lọc.
- Nguyên tắc cấp nguồn tách MCU và tải công suất.
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
Kiến trúc điều khiển motor an toàn
Hệ điều khiển tối thiểu gồm hai lớp: lớp công suất (L298N + nguồn + bảo vệ) và lớp logic (PWM + direction + state). Tách lớp rõ ràng giúp tránh lỗi logic làm hỏng phần cứng.
- Trạng thái motor: stop, forward, reverse, brake.
- Giới hạn duty tối đa theo nhiệt độ driver.
- Cấm đảo chiều trực tiếp ở duty cao.
PWM và độ mượt điều tốc
Điều tốc mượt cần kết hợp tần số PWM phù hợp và ramp duty. Nếu thay duty đột ngột, dòng khởi động lớn có thể làm sụt áp, reset MCU hoặc gây rung cơ học.
- Áp dụng ramp tăng/giảm duty theo bước nhỏ.
- Đo dòng khởi động để đặt giới hạn an toàn.
- Dùng dead-time ngắn khi đảo chiều.
Chuẩn bị cho vòng kín
Dù bài này là vòng hở, bạn nên thiết kế API mở để gắn feedback từ encoder sau này. Cách chuẩn hóa ngay từ đầu giúp chuyển sang PID dễ dàng mà không phải viết lại driver.
- Tách hàm set_speed_target và set_pwm_raw.
- Lưu telemetry: duty, direction, trạng thái lỗi.
- Chuẩn hóa unit tốc độ cho bước nâng cấp.
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
An toàn nguồn và chống nhiễu phải được xử lý song song với code điều khiển.
- Kết nối L298N với STM32: ENA (PWM), IN1/IN2 (direction).
- Kiểm tra nguồn motor và nguồn logic tách biệt.
- Khởi tạo PWM timer và API set duty.
- Viết state machine điều khiển chiều quay có dead-time.
- Thêm ramp duty để khởi động êm.
- Đo nhiệt độ driver và độ ổn định nguồn khi tải thật.
Ở 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ụ API điều khiển chiều và tốc độ
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.
void Motor_Set(int16_t speed_percent)
{
if (speed_percent > 100) speed_percent = 100;
if (speed_percent < -100) speed_percent = -100;
if (speed_percent >= 0) {
HAL_GPIO_WritePin(GPIOB, IN1_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, IN2_Pin, GPIO_PIN_RESET);
PWM_SetDuty((uint8_t)speed_percent);
} else {
HAL_GPIO_WritePin(GPIOB, IN1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, IN2_Pin, GPIO_PIN_SET);
PWM_SetDuty((uint8_t)(-speed_percent));
}
}
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õ.
- Đảo chiều trực tiếp khi duty cao gây sốc dòng.
- Không tách nguồn motor/MCU gây reset ngẫu nhiên.
- Bỏ qua sụt áp L298N dẫn đến đánh giá sai tốc độ.
- Không có giới hạn duty hoặc cơ chế stop khẩn.
- Thiếu lọc nhiễu đường nguồn gần driver.
Luôn thiết kế trạng thái fail-safe: khi lỗi, động cơ phải về stop an toàn.
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ế.
- Thêm chế độ ramp tốc độ 0->80% trong 2 giây.
- Tạo lệnh UART điều khiển motor và phản hồi trạng thái.
- Thiết kế fail-safe: mất lệnh 2 giây thì tự stop.
- Chuẩn bị module đọc encoder để nâng cấp vòng kín.
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.