第一章 电机驱动基础:直流有刷电机与无刷电机原理、H桥电路、PWM调速原理、电流采样

各位同学好,我是老张。做窗帘电机调试这些年,我踩过的坑比你们见过的电机型号还多。今天咱们就从最基础的电机驱动讲起。别小看这些基础,我见过太多工程师在H桥上烧管子,在PWM频率上翻车。说白了,基础不牢,后面调试起来真要命。

1.1 直流有刷电机 vs 无刷电机

先说说这两种电机。窗帘电机里,有刷电机和无刷电机都有应用。我个人习惯,小功率、成本敏感的项目用有刷,要求寿命长、噪音低的项目用无刷。

直流有刷电机,结构简单。里面有个换向器,靠电刷接触来换向。优点就是控制简单,给电就转,换向就反转。缺点嘛,电刷会磨损,有火花,噪音大。我在一个酒店窗帘项目里遇到过,有刷电机用了半年,电刷磨出来的碳粉把电路板都污染了,导致控制失灵。嗯,从那以后我对有刷电机的寿命格外关注。

直流无刷电机,没有电刷,靠电子换向器控制。转子是永磁体,定子是线圈。需要检测转子位置,通常是霍尔传感器或者反电动势检测。无刷电机效率高、寿命长、噪音低,但控制复杂,需要专门的驱动芯片或者MCU加MOS管。

我给你们列个对比表,方便选型时参考:

特性 有刷电机 无刷电机
控制复杂度 简单,直接调电压 复杂,需要换相逻辑
寿命 短(电刷磨损) 长(无磨损部件)
噪音 较大(电刷摩擦) 小(运行平稳)
效率 低(约70-80%) 高(约85-95%)
成本
典型应用 低成本窗帘、玩具 智能窗帘、电动百叶
我的经验: 如果你做的是家用智能窗帘,建议直接上无刷电机。虽然成本高一点,但客户体验好,售后少。我有个项目为了省5块钱用了有刷,结果噪音投诉不断,最后全换无刷,亏大了。

1.2 H桥电路——电机正反转的核心

H桥,说白了就是四个开关管组成的电路,形状像字母H。两个上管,两个下管。控制电机正转、反转、停止、刹车。

为什么叫H桥?你看电路图,电机在中间,四个开关在四角,连线就像H。我刚开始学的时候,总觉得这名字起得挺形象。

H桥的基本工作模式:

  • 正转: Q1和Q4导通,电流从左到右流过电机
  • 反转: Q2和Q3导通,电流从右到左流过电机
  • 停止: 所有开关断开,电机自由停止
  • 刹车: 两个下管导通(或两个上管导通),电机线圈短路,快速制动

这里有个大坑——直通。什么叫直通?就是同一侧的上管和下管同时导通了。比如Q1和Q2同时打开,电源直接短路,瞬间大电流,管子秒烧。我曾经在调试一个窗帘电机时,软件里延时没设好,上下管切换时重叠了,啪的一声,MOS管冒烟了。从那以后,我写代码必加死区时间。

警告: H桥驱动一定要加死区时间!上下管切换时,先关断一个,等几微秒再打开另一个。我建议死区时间至少1-2微秒,具体看MOS管的关断延迟。

实际项目中,我们很少用分立元件搭H桥,太容易出问题。一般用集成驱动芯片,比如L298N、DRV8833、TB6612等。这些芯片内部集成了死区控制、过流保护,省心很多。

1.3 PWM调速原理

电机调速,最常用的就是PWM——脉宽调制。说白了,就是给电机一个方波信号,通过调节占空比来控制平均电压,从而控制转速。

占空比 = 高电平时间 / 周期时间 × 100%

平均电压 = 电源电压 × 占空比

举个例子,12V电源,占空比50%,平均电压就是6V。电机转速大概就是全速的一半。

PWM频率怎么选?这是个学问。频率太低,电机会抖动,噪音大。频率太高,MOS管开关损耗大,发热严重。我一般这样选:

  • 有刷电机:1kHz - 20kHz。低于1kHz能听到明显的嗡嗡声,高于20kHz人耳听不到,但要注意MOS管发热
  • 无刷电机:10kHz - 50kHz。无刷电机需要更高的PWM频率来保证电流波形平滑

我个人习惯,窗帘电机用16kHz左右。为什么?因为16kHz刚好超过人耳听觉上限,听不到噪音,同时MOS管损耗也能接受。你想想看,如果客户晚上睡觉时听到窗帘电机嗡嗡响,那体验得多差。

PWM调速的代码实现,以STM32为例:

// 初始化定时器为PWM模式
void PWM_Init(void) {
    // 配置TIM2,输出PWM到PA0
    RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;
    RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;
    
    // GPIO配置为复用功能
    GPIOA->MODER |= GPIO_MODER_MODER0_1;  // 复用模式
    GPIOA->AFR[0] |= 0x01;                // AF1 = TIM2_CH1
    
    // 定时器配置
    TIM2->PSC = 83;       // 预分频,84MHz / 84 = 1MHz
    TIM2->ARR = 62;       // 自动重装,1MHz / 63 ≈ 16kHz
    TIM2->CCR1 = 31;      // 占空比50%
    TIM2->CCMR1 |= TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2;  // PWM模式1
    TIM2->CCER |= TIM_CCER_CC1E;         // 使能输出
    TIM2->CR1 |= TIM_CR1_CEN;            // 启动定时器
}

// 设置占空比,speed范围0-100
void PWM_SetDuty(uint8_t speed) {
    if(speed > 100) speed = 100;
    TIM2->CCR1 = (uint16_t)(TIM2->ARR * speed / 100);
}
关键点: 占空比不要从0直接跳到100,也不要从100直接跳到0。我建议做软启动和软停止,每次加减速步进小一点,比如每次改变5%,延时10ms。这样电机运行平稳,不会产生冲击电流。

1.4 电流采样——保护电机的眼睛

电流采样,说白了就是监测电机吃了多少电。为什么要采样?两个原因:一是过流保护,防止堵转烧电机;二是力矩控制,通过电流估算负载。

采样方法主要有三种:

  • 串联采样电阻: 在电机回路串一个小电阻(比如0.1Ω),测电阻两端电压。便宜,但会有功率损耗
  • 霍尔电流传感器: 用ACS712之类的芯片,隔离性好,精度高,但贵
  • MOS管导通电阻采样: 利用MOS管导通时的Rds(on)来估算电流,不额外增加元件,但精度差

我项目中用得最多的是采样电阻法。成本低,精度够用。一般选0.1Ω/1W的电阻,配合运放放大后送ADC。

采样电路设计要注意几点:

  1. 采样电阻要放在低端(GND侧),这样共模电压低,运放好选
  2. 运放要选轨到轨的,因为小电流时电压很低
  3. PCB布线时,采样电阻的走线要宽,减少寄生电阻
  4. ADC采样要多次平均,滤除PWM开关噪声

我曾经在一个项目中,采样电阻布局离大电流回路太近,结果采样值一直跳,根本没法用。后来把采样电阻单独拉出来,用开尔文接法,问题才解决。嗯,这里要注意,采样电阻的走线一定要单独走,不要和功率回路共用。

电流采样的软件处理:

// ADC采样并滤波
#define SAMPLE_COUNT 10

uint16_t Get_Motor_Current(void) {
    uint32_t sum = 0;
    uint16_t sample;
    
    for(uint8_t i = 0; i < SAMPLE_COUNT; i++) {
        // 启动ADC转换
        ADC1->CR2 |= ADC_CR2_SWSTART;
        while(!(ADC1->SR & ADC_SR_EOC));  // 等待转换完成
        sample = ADC1->DR;
        sum += sample;
        delay_us(10);  // 等待PWM稳定
    }
    
    // 返回平均值
    return (uint16_t)(sum / SAMPLE_COUNT);
}

// 过流保护
void OverCurrent_Check(void) {
    uint16_t current = Get_Motor_Current();
    uint16_t current_mA = (current * 3300) / 4096;  // 3.3V参考,12位ADC
    
    if(current_mA > OVER_CURRENT_THRESHOLD) {
        // 过流,立即停止电机
        H_Bridge_Stop();
        Set_Error_Flag(ERROR_OVER_CURRENT);
        // 这里可以加蜂鸣器报警或者LED指示
    }
}
避坑指南: 我曾经在采样时没做软件滤波,结果PWM开关瞬间的尖峰干扰导致误触发过流保护,电机频繁启停。后来加了10次平均滤波,并且采样时刻避开PWM边沿,问题解决。建议你在PWM的中间时刻触发ADC采样,避开开关噪声。

好了,第一章的内容就这些。电机驱动基础是后面所有调试工作的根基。H桥怎么搭、PWM频率怎么选、电流怎么采,这些搞不清楚,后面调试窗帘电机时你会很痛苦。下一章我们讲电机控制算法,包括PID调速和位置控制,到时候见。