直流电机基础与驱动原理

做电机控制这么多年,我始终觉得——搞懂直流电机的工作原理,是入门电机控制的第一道坎。说白了,你连电机怎么转起来的都不清楚,后面调PID、调速度、调位置,全是空中楼阁。

这一章,咱们就扎扎实实地把直流电机的底裤扒干净。从工作原理,到H桥怎么搭,再到PWM调速的细节,一步到位。

2.1 直流电机工作原理

直流电机为什么能转?核心就一句话:通电导体在磁场中受力。这是初中物理就讲过的左手定则,但真正用到工程里,你会发现没那么简单。

我简单画个图,帮你理解内部结构:

直流电机工作原理示意图 N极 S极 电枢绕组(转子) 通入直流电 换向器 电刷 电刷 受力方向 核心原理:通电导体在磁场中受力 → 产生转矩 → 转子旋转

你看,定子(N/S极)产生固定磁场,转子(电枢绕组)通入直流电后,在磁场中受力产生转矩。换向器的作用就是保证转子转到一定角度后,电流方向自动切换,让转矩方向始终一致——这样电机才能持续转下去。

关键点:直流电机的转速与电枢电压成正比,转矩与电枢电流成正比。这两个关系,是后面PID调速的基础。

我在项目里遇到过一个问题:电机低速时抖动厉害。查了半天,发现是电刷磨损导致换向不良。嗯,这种机械问题在工业现场很常见,尤其是长时间运行的电机。

2.2 H桥驱动电路详解

直流电机要正反转,怎么办?你想想看,总不能手动换电源极性吧?H桥就是干这个的。

H桥的名字很形象——四个开关管搭成一个"H"形,电机在中间横杠上。通过控制四个管的通断组合,就能控制电机正转、反转、刹车、滑行。

H桥驱动电路结构图 VCC (电机电源) Q1 Q2 Q3 Q4 M 直流电机 GND IN1 IN2 IN3 IN4 Q1/Q4导通 → 电机正转;Q2/Q3导通 → 电机反转;Q1/Q2或Q3/Q4同时导通 → 刹车

H桥的四种工作状态,我整理成了一张表,你对照着看:

工作模式 Q1 Q2 Q3 Q4 电机状态
正转 导通 关断 关断 导通 电流从左到右,正转
反转 关断 导通 导通 关断 电流从右到左,反转
刹车 导通 导通 关断 关断 电机两端短路,急停
滑行 关断 关断 关断 关断 电机自由停止

⚠️ 致命陷阱:绝对不能让Q1和Q3同时导通,也不能让Q2和Q4同时导通!这叫"直通短路",瞬间就能烧掉MOS管。我曾经在调试时手抖了一下,代码里延时没写够,结果一缕青烟……从那以后,我写H桥驱动代码必加死区时间。

2.3 PWM调速原理

直流电机调速,最常用的方法就是PWM——脉冲宽度调制。说白了,就是给电机通一会电、断一会电,通过调整"通电时间占比"来控制平均电压,从而控制转速。

你想想看,如果一直通100%的电,电机全速跑。如果通一半时间、断一半时间,平均电压就是一半,转速也差不多一半。这就是PWM调速的本质。

PWM有三个关键参数:

  • 频率:每秒开关多少次,单位Hz。频率太低,电机会"咔咔"响,甚至抖动。频率太高,MOS管开关损耗增大。我一般选10kHz~20kHz,人耳听不到,效率也还行。
  • 占空比:高电平时间占整个周期的比例,0%~100%。占空比越大,平均电压越高,转速越快。
  • 幅值:高电平的电压值,一般等于电机额定电压。

平均电压的计算公式很简单:

V_avg = V_max × DutyCycle

举例:
V_max = 12V,占空比 = 60%
V_avg = 12 × 0.6 = 7.2V

💡 经验之谈:占空比不要低于10%。太低的话,电机可能根本转不起来——启动转矩不够。我在做AGV小车项目时,最低给到15%的占空比才能让轮子平稳起步。

用单片机产生PWM信号,通常有两种方式:

  1. 硬件PWM:用定时器的PWM输出通道,CPU不参与,精度高。首选方案。
  2. 软件模拟PWM:用GPIO+延时或定时中断,CPU被占用。实在没资源时才用。

下面是一个用STM32硬件PWM驱动直流电机的代码片段:

// STM32 TIM2 通道1 PWM初始化
void PWM_Init(void) {
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    TIM_OC_InitTypeDef sConfigOC = {0};
    
    // 使能时钟
    __HAL_RCC_TIM2_CLK_ENABLE();
    __HAL_RCC_GPIOA_CLK_ENABLE();
    
    // PA0 配置为TIM2_CH1
    GPIO_InitStruct.Pin = GPIO_PIN_0;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    
    // TIM2 配置:频率 = 72MHz / (72-1) / (100-1) = 10kHz
    htim2.Instance = TIM2;
    htim2.Init.Prescaler = 71;        // 预分频
    htim2.Init.Period = 99;           // 自动重装值
    htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
    HAL_TIM_PWM_Init(&htim2);
    
    // PWM通道配置
    sConfigOC.OCMode = TIM_OCMODE_PWM1;
    sConfigOC.Pulse = 50;             // 初始占空比50%
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1);
    
    // 启动PWM
    HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
}

// 设置占空比函数
void SetMotorSpeed(uint8_t duty) {
    // duty范围:0~100
    __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, duty);
}

这段代码里,我设定了PWM频率为10kHz。为什么选这个值?因为10kHz在大多数直流电机的工作范围内,既听不到明显噪声,MOS管发热也能接受。你如果做的是大功率电机,频率可以降到5kHz左右,减少开关损耗。

最后,我把这一章的核心知识点串成一张图,方便你复习:

第2章 知识体系总览 直流电机工作原理 通电导体在磁场中受力 转速 ∝ 电压,转矩 ∝ 电流 H桥驱动电路 4个开关管控制正反转 正转/反转/刹车/滑行 PWM调速原理 占空比控制平均电压 频率10kHz~20kHz 实战要点总结 ① 电机选型时注意额定电压和额定电流,匹配H桥的耐压和电流能力 ② H桥驱动必须加死区时间,防止直通短路烧MOS管 ③ PWM频率选择要平衡噪声和效率,10kHz是通用起点