2. 直流电机方向控制与H桥驱动逻辑实现
H桥驱动逻辑与死区时间验证
H桥由四个开关管组成,对角导通决定电机转向,同侧导通即发生桥臂直通。以常见的L298N双H桥驱动芯片为例,其输入逻辑如下:
| ENA | IN1 | IN2 | 电机状态 |
|---|---|---|---|
| PWM | 1 | 0 | 正转(OUT1→OUT2) |
| PWM | 0 | 1 | 反转(OUT2→OUT1) |
| PWM | 0 | 0 | 滑行停止(惯性) |
| PWM | 1 | 1 | 刹车(短接绕组) |
IN1与IN2同时为高时,L298N内部逻辑会强制关断输出,但若使用分立MOSFET搭建H桥,必须由MCU软件插入死区时间,否则上下桥臂直通将瞬间烧毁开关管。
方向控制与刹车逻辑实现
以下代码基于STM32 HAL库,使用TIM1的CH1/CH2输出PWM,GPIO控制IN1/IN2方向引脚,实现正转、反转、滑行停止和刹车四种状态,并在换向时插入死区延时。
#include "stm32f1xx_hal.h"
/* 方向引脚定义 */
#define IN1_PIN GPIO_PIN_0
#define IN2_PIN GPIO_PIN_1
#define IN_PORT GPIOA
/* 死区时间:根据MOSFET开关速度设定,此处取5us */
#define DEAD_TIME_US 5
typedef enum {
MOTOR_FORWARD = 0,
MOTOR_REVERSE,
MOTOR_COAST,
MOTOR_BRAKE
} MotorState_t;
/* 设置电机状态 */
void Motor_SetState(MotorState_t state)
{
switch (state) {
case MOTOR_FORWARD:
/* 先关断PWM,再切换方向,避免换向瞬间直通 */
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 0);
HAL_Delay(DEAD_TIME_US / 1000 + 1);
HAL_GPIO_WritePin(IN_PORT, IN1_PIN, GPIO_PIN_SET);
HAL_GPIO_WritePin(IN_PORT, IN2_PIN, GPIO_PIN_RESET);
break;
case MOTOR_REVERSE:
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 0);
HAL_Delay(DEAD_TIME_US / 1000 + 1);
HAL_GPIO_WritePin(IN_PORT, IN1_PIN, GPIO_PIN_RESET);
HAL_GPIO_WritePin(IN_PORT, IN2_PIN, GPIO_PIN_SET);
break;
case MOTOR_COAST:
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 0);
HAL_GPIO_WritePin(IN_PORT, IN1_PIN, GPIO_PIN_RESET);
HAL_GPIO_WritePin(IN_PORT, IN2_PIN, GPIO_PIN_RESET);
break;
case MOTOR_BRAKE:
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 0);
HAL_GPIO_WritePin(IN_PORT, IN1_PIN, GPIO_PIN_SET);
HAL_GPIO_WritePin(IN_PORT, IN2_PIN, GPIO_PIN_SET);
break;
}
}
/* 设置PWM占空比(0~100) */
void Motor_SetDuty(uint8_t duty)
{
if (duty > 100) duty = 100;
uint32_t arr = __HAL_TIM_GET_AUTORELOAD(&htim1);
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, arr * duty / 100);
}
/* 主循环:正转→刹车→反转→刹车 两象限切换测试 */
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM1_Init();
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
while (1) {
Motor_SetState(MOTOR_FORWARD);
Motor_SetDuty(60);
HAL_Delay(2000);
Motor_SetState(MOTOR_BRAKE);
HAL_Delay(500);
Motor_SetState(MOTOR_REVERSE);
Motor_SetDuty(60);
HAL_Delay(2000);
Motor_SetState(MOTOR_BRAKE);
HAL_Delay(500);
}
}
死区时间对桥臂直通的影响验证
使用示波器双通道同时观测H桥上下桥臂的栅极驱动信号,验证死区时间是否足够。测试条件:PWM频率10kHz,死区时间分别设为0us、2us、5us,观察上下管栅极波形是否存在交叠。
| 死区时间 | 栅极波形交叠 | 桥臂电流尖峰 | 结论 |
|---|---|---|---|
| 0 us | 有交叠 | 明显尖峰(>5A) | 直通风险高,禁止使用 |
| 2 us | 无交叠 | 轻微尖峰(<1A) | 可用,但余量偏小 |
| 5 us | 无交叠 | 无明显尖峰 | 推荐值,安全余量充足 |
死区时间并非越大越好:过大的死区会导致输出波形畸变,降低有效占空比,尤其在低速时造成转矩脉动。一般取开关管关断时间加裕量,MOSFET通常1~5us,IGBT需5~10us。
两象限方向切换测试步骤
- 将电机轴伸端标记,便于观察转向。
- 下载程序,上电后电机应先正转2秒,刹车0.5秒,再反转2秒,循环执行。
- 用示波器CH1接Q1栅极,CH2接Q2栅极,触发方式设为CH1下降沿,观察死区时间内两路波形是否同时为低。
- 用电流探头监测母线电流,正反转切换瞬间若出现超过额定值3倍以上的尖峰,说明死区不足或换向逻辑有误。
- 记录正转和反转时电机转向是否相反,刹车时电机是否迅速停转(而非惯性滑行)。
验证通过条件:正反转方向正确且对称;刹车时电机在0.5秒内停转;示波器上、下管栅极无交叠;母线电流无异常尖峰。