Hiện tượng rung lắc hoặc phản hồi sai lệch khi điều khiển động cơ qua driver TB6612 thường bắt nguồn từ các sai sót nhỏ trong quá trình cấu hình bộ định thời. Ngay cả khi sử dụng công cụ sinh mã tự động, việc bỏ qua một số tham số hệ thống vẫn có thể gây suy giảm chất lượng tín hiệu điều chế độ rộng xung. Dưới đây là những khía cạnh then chốt cần kiểm tra để đảm bảo hệ thống vận hành trơn tru.
1. Độ chính xác của nguồn clock và hệ số chia tần
Nhiều người phát triển thường chỉ quan tâm đến việc đạt được tần số xử lý danh định mà bỏ qua ảnh hưởng của nguồn gốc dao động đối với độ ổn định của PWM. Khi dùng nguồn nội bộ, sai lệch tần số đầu ra có thể lên tới 1.5% so với tính toán lý thuyết, ngay cả khi các tham số bộ chia và giá trị đếm được thiết lập giống nhau.
| Loại nguồn clock | Tần số danh định | Giá trị đo thực tế | Độ biến thiên |
|---|---|---|---|
| HSI nội bộ | 8 MHz | ~72.1 MHz | ±0.8% |
| Crystal ngoài 8 MHz | 8 MHz | 72.00 MHz | ±0.05% |
| Crystal ngoài 12 MHz | 12 MHz | 72.00 MHz | ±0.03% |
Lưu ý: Khi dùng crystal ngoài, cần bật tùy chọn HSE Bypass phù hợp trong cấu hình clock để đảm bảo bộ dao động khóa đúng pha.
Hệ số chia Prescaler không chỉ quyết định tần số đầu ra mà còn ảnh hưởng trực tiếp đến độ phân giải và tải xử lý của CPU:
- Độ phân giải: Tăng giá trị bộ đếm tối đa sẽ cải thiện độ mịn của tín hiệu nhưng đồng thời giảm tần số cực đại có thể đạt được.
- Tải ngắt: Giá trị chia quá nhỏ làm tăng tần suất ngắt bộ định thời, dễ gây quá tải CPU trong hệ thống đa tác vụ.
- Thời gian chết: Ứng dụng tần số cao yêu cầu kiểm soát dead-time chặt chẽ, phụ thuộc trực tiếp vào bước đếm cơ bản.
// Cấu hình tham số bộ định thời TIM4
TIM_HandleTypeDef hTimMotor;
hTimMotor.Instance = TIM4;
hTimMotor.Init.Prescaler = 71; // Chia 72 lần
hTimMotor.Init.CounterMode = TIM_COUNTERMODE_UP;
hTimMotor.Init.Period = 999; // Giá trị đếm tối đa
hTimMotor.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
hTimMotor.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
HAL_TIM_PWM_Init(&hTimMotor);
2. Trình tự khởi tạo và cập nhật tham số an toàn
Trong thư viện HAL, thứ tự gọi hàm đóng vai trò then chốt. Việc kích hoạt kênh PWM trước khi bộ định thời được cấu hình đầy đủ sẽ dẫn đến lỗi HardFault hoặc tín hiệu đầu ra vô định.
Trình tự chuẩn nên tuân theo:
- Khoi tao clock hệ thống
- Khoi tao chân GPIO (Alternate Function, Push-Pull)
- Khoi tao tham so bo dinh thoi
- Cau hinh ke nh PWM
- Kich hoat dau ra PWM
// Sai: Kich hoat PWM truoc khi khoi tao
HAL_TIM_PWM_Start(&hTimMotor, TIM_CHANNEL_1); // Nguy co gay loi
MX_TIM4_Config();
Đối với các ứng dụng cần thay đổi tham số PWM trong lúc vận hành, cần tuân thủ quy trình dừng-tạm dừng-cập nhật-kích hoạt lại để tránh xung nhiễu:
// Quy cap nhat tham so an toan
HAL_TIM_PWM_Stop(&hTimMotor, TIM_CHANNEL_1);
__HAL_TIM_SET_AUTORELOAD(&hTimMotor, gia_tri_ar_moi);
__HAL_TIM_SET_COMPARE(&hTimMotor, TIM_CHANNEL_1, gia_tri_cr_moi);
HAL_TIM_PWM_Start(&hTimMotor, TIM_CHANNEL_1);
- Khi thay đổi chu kỳ, nên tắt cơ chế nạp trước nếu muốn thay đổi áp dụng ngay lập tức.
- Việc thay đổi mode PWM bắt buộc phải gọi lại hàm cấu hình kênh để cập nhật thanh ghi điều khiển.
- Nên dùng macro `__HAL_TIM_SET_COMPARE` thay vì ghi trực tiếp thanh ghi so sánh để đảm bảo đồng bộ.
3. Trạng thái điều khiển động cơ và xử lý quá độ
Driver TB6612 hỗ trợ 4 chế độ hoạt động dựa trên tổ hợp tín hiệu IN1 và IN2. Việc bỏ qua chế độ hãm hoặc trượt tự do thường dẫn đến dòng điện ngược tăng cao khi đảo chiều đột ngột.
| IN1 | IN2 | Tín hiệu PWM | Chế độ | Trạng thái MOSFET |
|---|---|---|---|---|
| Mức cao | Mức thấp | Đang chạy | Quay thuận | Top-Left & Bottom-Right mở |
| Mức thấp | Mức cao | Đang chạy | Quay nghịch | Top-Right & Bottom-Left mở |
| Mức thấp | Mức thấp | Bất kỳ | Tự do trượt | Tất cả ngắt |
| Mức cao | Mức cao | 0% hoặc đang chạy | Hãm ngắn mạch | Form mạch dòng điện hồi tiếp |
// Hàm xử lý trạng thái động cơ nâng cao
typedef enum {
DIR_FORWARD,
DIR_REVERSE,
MODE_BRAKE,
MODE_COAST
} MotorCmd_t;
void CapNhatTrangThai(MotorCmd_t lenh, uint16_t dodai_xung)
{
switch(lenh) {
case DIR_FORWARD:
HAL_GPIO_WritePin(Port_IN1, Pin_IN1, GPIO_PIN_SET);
HAL_GPIO_WritePin(Port_IN2, Pin_IN2, GPIO_PIN_RESET);
break;
case DIR_REVERSE:
HAL_GPIO_WritePin(Port_IN1, Pin_IN1, GPIO_PIN_RESET);
HAL_GPIO_WritePin(Port_IN2, Pin_IN2, GPIO_PIN_SET);
break;
case MODE_BRAKE:
HAL_GPIO_WritePin(Port_IN1, Pin_IN1, GPIO_PIN_SET);
HAL_GPIO_WritePin(Port_IN2, Pin_IN2, GPIO_PIN_SET);
__HAL_TIM_SET_COMPARE(&hTimMotor, TIM_CHANNEL_1, 0);
return;
case MODE_COAST:
HAL_GPIO_WritePin(Port_IN1, Pin_IN1, GPIO_PIN_RESET);
HAL_GPIO_WritePin(Port_IN2, Pin_IN2, GPIO_PIN_RESET);
__HAL_TIM_SET_COMPARE(&hTimMotor, TIM_CHANNEL_1, 0);
return;
}
__HAL_TIM_SET_COMPARE(&hTimMotor, TIM_CHANNEL_1, dodai_xung);
}
Khi chuyển hướng quay ở tốc độ cao, sức phản điện động sinh ra có thể gây quá áp. Giải pháp an toàn là giảm tải về mức thấp, kích hoạt hãm ngắn mạch tạm thời, sau đó mới chuyển hướng:
// Hàm đảo chiều an toàn
void DaoChieuAnToan(uint16_t dodai_moi)
{
uint16_t dodai_hien_tai = __HAL_TIM_GET_COMPARE(&hTimMotor, TIM_CHANNEL_1);
// Giảm dần xung về ngưỡng an toàn
for(uint16_t x = dodai_hien_tai; x > 30; x -= 5) {
__HAL_TIM_SET_COMPARE(&hTimMotor, TIM_CHANNEL_1, x);
HAL_Delay(2);
}
// Kích hoạt hãm để triệt tiêu dòng điện dư
CapNhatTrangThai(MODE_BRAKE, 0);
HAL_Delay(10);
// Thực thi lệnh quay ngược
CapNhatTrangThai(DIR_REVERSE, dodai_moi);
}
4. Gỡ lỗi tín hiệu PWM bằng máy phân tích logic
Việc đo điện áp trung bình bằng đồng hồ vạn năng không đủ để phát hiện các lỗi vi mô trong chuỗi xung. Máy phân tích logic giúp quan sát trực tiếp hình dạng sóng và trích xuất các thông số định thời.
- Xung bị mất: Thường do ưu tiên ngắt bị chiếm dụng hoặc hàm xử lý ngắt chạy quá lâu. Cần giảm độ phức tạp trong ISR hoặc điều chỉnh độ ưu tiên IRQ.
- Độ rộng xung dao động: Gây ra bởi nhiễu nguồn hoặc bố trí mạch in chưa tối ưu. Nên dùng bộ lọc nguồn kết hợp tụ 100μF và 0.1μF, đồng thời tách đường tín hiệu điều khiển khỏi mạch công suất.
- Độ trễ khởi động: Thời gian từ lệnh kích hoạt đến xung đầu tiên quá dài. Cần kiểm tra vị trí gọi hàm start và xem xét dùng chế độ Single Pulse Mode nếu ứng dụng cho phép.
Khi thiết lập trình đo, nên cấu hình kích theo cạnh lên/xuống, kích hoạt trình giải mã giao diện PWM và bật chế độ thống kê tần suất. Đối với tần số trên 20 kHz, tốc độ lấy mẫu tối thiểu phải gấp 5 lần tín hiệu, khuyến nghị dùng thiết bị có băng thông trên 100 MHz để đảm bảo độ trung thực của cạnh xung.