2. 直流电机方向控制与H桥驱动逻辑实现

直流电机方向控制与H桥驱动逻辑实现 学习卡片

H桥驱动逻辑与死区时间验证

H桥由四个开关管组成,对角导通决定电机转向,同侧导通即发生桥臂直通。以常见的L298N双H桥驱动芯片为例,其输入逻辑如下:

ENAIN1IN2电机状态
PWM10正转(OUT1→OUT2)
PWM01反转(OUT2→OUT1)
PWM00滑行停止(惯性)
PWM11刹车(短接绕组)
IN1与IN2同时为高时,L298N内部逻辑会强制关断输出,但若使用分立MOSFET搭建H桥,必须由MCU软件插入死区时间,否则上下桥臂直通将瞬间烧毁开关管。
H桥四象限驱动拓扑与电流路径 +Vmot GND Q1 Q2 Q3 Q4 M 正转:Q1+Q4 导通 死区时间 t_dead:Q1关断后延迟 t_dead 再开通Q2,防止上下桥臂直通 t_dead

方向控制与刹车逻辑实现

以下代码基于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。

两象限方向切换测试步骤

  1. 将电机轴伸端标记,便于观察转向。
  2. 下载程序,上电后电机应先正转2秒,刹车0.5秒,再反转2秒,循环执行。
  3. 用示波器CH1接Q1栅极,CH2接Q2栅极,触发方式设为CH1下降沿,观察死区时间内两路波形是否同时为低。
  4. 用电流探头监测母线电流,正反转切换瞬间若出现超过额定值3倍以上的尖峰,说明死区不足或换向逻辑有误。
  5. 记录正转和反转时电机转向是否相反,刹车时电机是否迅速停转(而非惯性滑行)。
验证通过条件:正反转方向正确且对称;刹车时电机在0.5秒内停转;示波器上、下管栅极无交叠;母线电流无异常尖峰。