第一章 电机驱动基础:直流有刷电机与无刷电机原理、H桥电路、PWM调速原理、电流采样
各位同学好,我是老张。做窗帘电机调试这些年,我踩过的坑比你们见过的电机型号还多。今天咱们就从最基础的电机驱动讲起。别小看这些基础,我见过太多工程师在H桥上烧管子,在PWM频率上翻车。说白了,基础不牢,后面调试起来真要命。
1.1 直流有刷电机 vs 无刷电机
先说说这两种电机。窗帘电机里,有刷电机和无刷电机都有应用。我个人习惯,小功率、成本敏感的项目用有刷,要求寿命长、噪音低的项目用无刷。
直流有刷电机,结构简单。里面有个换向器,靠电刷接触来换向。优点就是控制简单,给电就转,换向就反转。缺点嘛,电刷会磨损,有火花,噪音大。我在一个酒店窗帘项目里遇到过,有刷电机用了半年,电刷磨出来的碳粉把电路板都污染了,导致控制失灵。嗯,从那以后我对有刷电机的寿命格外关注。
直流无刷电机,没有电刷,靠电子换向器控制。转子是永磁体,定子是线圈。需要检测转子位置,通常是霍尔传感器或者反电动势检测。无刷电机效率高、寿命长、噪音低,但控制复杂,需要专门的驱动芯片或者MCU加MOS管。
我给你们列个对比表,方便选型时参考:
| 特性 | 有刷电机 | 无刷电机 |
|---|---|---|
| 控制复杂度 | 简单,直接调电压 | 复杂,需要换相逻辑 |
| 寿命 | 短(电刷磨损) | 长(无磨损部件) |
| 噪音 | 较大(电刷摩擦) | 小(运行平稳) |
| 效率 | 低(约70-80%) | 高(约85-95%) |
| 成本 | 低 | 高 |
| 典型应用 | 低成本窗帘、玩具 | 智能窗帘、电动百叶 |
1.2 H桥电路——电机正反转的核心
H桥,说白了就是四个开关管组成的电路,形状像字母H。两个上管,两个下管。控制电机正转、反转、停止、刹车。
为什么叫H桥?你看电路图,电机在中间,四个开关在四角,连线就像H。我刚开始学的时候,总觉得这名字起得挺形象。
H桥的基本工作模式:
- 正转: Q1和Q4导通,电流从左到右流过电机
- 反转: Q2和Q3导通,电流从右到左流过电机
- 停止: 所有开关断开,电机自由停止
- 刹车: 两个下管导通(或两个上管导通),电机线圈短路,快速制动
这里有个大坑——直通。什么叫直通?就是同一侧的上管和下管同时导通了。比如Q1和Q2同时打开,电源直接短路,瞬间大电流,管子秒烧。我曾经在调试一个窗帘电机时,软件里延时没设好,上下管切换时重叠了,啪的一声,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);
}
1.4 电流采样——保护电机的眼睛
电流采样,说白了就是监测电机吃了多少电。为什么要采样?两个原因:一是过流保护,防止堵转烧电机;二是力矩控制,通过电流估算负载。
采样方法主要有三种:
- 串联采样电阻: 在电机回路串一个小电阻(比如0.1Ω),测电阻两端电压。便宜,但会有功率损耗
- 霍尔电流传感器: 用ACS712之类的芯片,隔离性好,精度高,但贵
- MOS管导通电阻采样: 利用MOS管导通时的Rds(on)来估算电流,不额外增加元件,但精度差
我项目中用得最多的是采样电阻法。成本低,精度够用。一般选0.1Ω/1W的电阻,配合运放放大后送ADC。
采样电路设计要注意几点:
- 采样电阻要放在低端(GND侧),这样共模电压低,运放好选
- 运放要选轨到轨的,因为小电流时电压很低
- PCB布线时,采样电阻的走线要宽,减少寄生电阻
- 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指示
}
}
好了,第一章的内容就这些。电机驱动基础是后面所有调试工作的根基。H桥怎么搭、PWM频率怎么选、电流怎么采,这些搞不清楚,后面调试窗帘电机时你会很痛苦。下一章我们讲电机控制算法,包括PID调速和位置控制,到时候见。