1. 先搞清楚“最穷套件”到底能解决什么问题
如果你手头只有 STM32F103 最小系统板、几个三极管、电阻和一颗三相无刷电机,想用最低成本让电机转起来,那这个方案就是为你准备的。它不追求高性能、高精度,核心目标只有一个:用最基础的硬件验证六步换相原理,让电机稳定转动。
六步换相是无刷电机驱动的基础,很多高级算法如 FOC 都建立在它之上。但市面上大多数教程一开始就推荐专用驱动芯片,对新手来说硬件门槛高、原理难消化。这个“最穷套件”方案最大的价值在于:你能亲手从三极管开关电路开始,理解每步换相如何改变电流路径,如何通过检测反电动势或霍尔信号判断转子位置。
我建议先明确一点:这个方案适合学习和原理验证,不适合直接用于产品。因为三极管驱动在电流、散热、保护电路上有明显局限。但如果你能在这个套件上调通,后续换到 MOS 管或专用芯片时会轻松很多。
2. 硬件准备:最低成本需要哪些材料
“最穷”不代表随便凑合。下面列出的是能保证基础功能的最小集合,缺一不可:
- 主控:STM32F103C8T6 最小系统板(核心是带 6 路 PWM 输出的定时器)
- 驱动电路:6 个 NPN 三极管(如 S8050)、6 个基极电阻(1kΩ)、6 个上拉电阻(10kΩ)
- 电源:12V 直流电源(根据电机额定电压调整)、3.3V/5V 给单片机供电
- 电机:三相无刷电机(带霍尔传感器会更简单,无感电机需额外设计反电动势检测)
- 辅助工具:万用表、示波器(可选,但调试时极大帮助)
电路连接的关键点:
- 三极管用作开关,不是线性放大。基极电阻限制电流,避免烧毁 STM32 IO 口。
- 上拉电阻确保三极管可靠关断。
- 电机三相线对应三组半桥:A相(Q1、Q2)、B相(Q3、Q4)、C相(Q5、Q6)。
- 电源地必须共地,否则 PWM 信号参考点混乱。
如果电机不带霍尔传感器,你需要额外设计反电动势检测电路。通常用电阻分压+电压跟随器,将电机相电压衰减到 STM32 ADC 可测范围(0-3.3V)。但首次实验强烈建议先用带霍尔的电机,减少变量。
3. 六步换相的本质:电流路径如何切换
无刷电机转动靠的是不断切换三相电流组合,使磁场始终“牵引”转子。六步换相就是一个周期内包含 6 种不同的通电状态:
| 步骤 | Q1 | Q2 | Q3 | Q4 | Q5 | Q6 | 电流路径 |
|---|---|---|---|---|---|---|---|
| 1 | ON | OFF | OFF | ON | OFF | OFF | A→B |
| 2 | ON | OFF | OFF | OFF | OFF | ON | A→C |
| 3 | OFF | OFF | ON | OFF | OFF | ON | B→C |
| 4 | OFF | ON | ON | OFF | OFF | OFF | B→A |
| 5 | OFF | ON | OFF | OFF | ON | OFF | C→A |
| 6 | OFF | OFF | OFF | ON | ON | OFF | C→B |
注意:表格中只开了两个管子(一个上桥、一个下桥),绝对避免同一相上下桥直通。STM32 的 PWM 输出要配合死区控制,即使软件误操作也不会同时导通。
换相顺序由转子位置决定:
- 有霍尔传感器:直接读取霍尔信号组合,查表对应到上述 6 步。
- 无传感器:检测未通电相的反电动势过零点,延迟一定电角度后换相。
新手最容易错的地方:
- 以为六步是固定顺序循环。实际上正转、反转顺序不同,要根据位置信号动态调整。
- 忽略换相时机。换早了或换晚了都会导致转矩下降、振动甚至失步。
4. STM32F103 的配置:定时器如何产生 6 路 PWM
STM32F103 的定时器(如 TIM1)能直接生成 6 路带死区的 PWM,这是硬件基础。配置顺序如下:
4.1 时钟和 GPIO 初始化
先开启 TIM1 和对应 GPIO 时钟(RCC 寄存器)。6 路 PWM 输出引脚固定:
- CH1/1N: PA8/PA7
- CH2/2N: PA9/PA6
- CH3/3N: PA10/PA5
如果你用的最小系统板这些引脚被占用,可能需要重映射(AFIO),但首次实验尽量用默认引脚。
4.2 定时器基本参数
关键参数计算:
- PWM 频率:一般 10-20kHz。太高则开关损耗大,太低可能电机有噪音。
- 死区时间:根据三极管开关速度设置,通常 1-2μs。太短可能直通,太长降低效率。
用 CubeMX 配置时重点检查:
- PWM 模式:选择 PWM mode 1 或 2(对应输出极性)
- 互补输出:使能 CHxN
- 死区发生器:使能并设置死区时间
- 刹车功能:先禁用,简化调试
4.3 代码中的换相控制
初始化后,通过改变 CCR 寄存器调整占空比(即电压大小),但换相是通过改变有效输出通道实现的:
// 示例:换相到步骤 1(A相上桥、B相下桥导通) __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, duty_cycle); // CH1 输出 PWM __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, 0); // CH2 关闭 __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_3, 0); // CH3 关闭 // 互补通道由硬件自动控制,前提是主通道设置正确注意:不要直接操作 GPIO 来开关电机,必须通过定时器输出 PWM,才能利用硬件死区保护。
5. 霍尔传感器信号的处理与换相时机
带霍尔的电机有三路输出(H1、H2、H3),组合起来对应 6 个状态。STM32 可以用外部中断或定时器编码器模式读取。
5.1 接线与读取
霍尔信号一般是开漏输出,需要上拉到 3.3V。接到 STM32 的任意三个支持外部中断的引脚(如 PA0、PA1、PA2)。
配置上升沿和下降沿都触发中断,在中断服务函数中读取三路状态:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { uint8_t hall_state = (H1_GPIO_Port->IDR & H1_Pin) ? 1 : 0; hall_state |= (H2_GPIO_Port->IDR & H2_Pin) ? 2 : 0; hall_state |= (H3_GPIO_Port->IDR & H3_Pin) ? 4 : 0; switch(hall_state) { case 1: // 对应换相步骤 1 set_commutation_step(1); break; case 3: // 步骤 2 set_commutation_step(2); break; // ... 其他状态 } }5.2 换相表的设计
霍尔状态与换相步骤的对应关系不是固定的,取决于电机极对数、传感器安装角度。最好用示波器同时抓霍尔信号和相电压,验证换相点是否在反电动势过零后 30 度电角度。
新手常见问题:
- 霍尔状态读取不稳定:增加软件消抖(连续多次采样一致才确认)
- 换相后电机振动:可能是霍尔安装相位误差,尝试在代码中调整换相表偏移
- 某个方向不转:检查换相顺序是否反向
6. 无传感器方案:反电动势过零点检测
如果电机不带霍尔,就需要检测反电动势。原理:电机转动时,未通电的相会感应出与转子位置相关的电压,其过零点对应特定的电角度。
6.1 检测电路设计
由于反电动势幅度随转速变化,直接测量可能超出 ADC 范围。常用电阻分压+电压跟随器:
电机相线 → R1(10k) → ADC输入 → R2(2.2k) → GNDR1、R2 比例根据电机最大转速时的反电动势计算,确保 ADC 输入不超过 3.3V。电压跟随器的作用是提高输入阻抗,避免影响分压比。
6.2 软件处理要点
反电动势检测只能在未通电相进行,而且需要在 PWM 关断期间采样(因为导通时相电压被电源电压拉高)。常用方法:
- 在 PWM 周期中间点(当互补通道都关闭时)触发 ADC 采样
- 对采样值进行滤波(移动平均或低通滤波)
- 检测电压从正到负或负到正的过零点
- 过零点后延迟 30 度电角度(根据当前转速计算时间)执行换相
代码结构示例:
void ADC_IRQHandler(void) { static uint32_t zero_cross_time = 0; uint16_t adc_value = ADC1->DR; if((adc_value > 2048) && (last_value <= 2048)) { // 检测上升过零 uint32_t now = HAL_GetTick(); uint32_t electrical_period = now - zero_cross_time; zero_cross_time = now; // 计算30度电角度对应的时间延迟 uint32_t delay_time = electrical_period / 12; start_commutation_timer(delay_time); } last_value = adc_value; }6.3 启动策略:无传感器方案的难点
无传感器电机最大的挑战是启动阶段:转速为零时没有反电动势。常用方法:
- 对齐启动:先给固定相通电,将转子拉到已知位置
- 升频启动:从低频开始逐步提高换相频率,同时缓慢增加电压
- 开环加速到一定转速后切换到闭环检测
启动参数需要根据电机特性调整,没有通用值。建议先用示波器观察启动过程中的相电压和电流,找到合适的加速曲线。
7. 调试流程:从不动到稳定转动
无论有感还是无感,调试都要遵循从简到繁的顺序:
7.1 硬件检查
- 静态测试:不给电机供电,用万用表检查 6 个三极管是否能正常开关(控制 IO 高低电平,测量 CE 间电阻)
- 半桥测试:单独测试每一相,确认上桥导通时相线电压接近电源电压,下桥导通时接近地
- 相通短路测试:确保任意两相之间没有短路
7.2 软件逐步验证
- PWM 输出验证:不接电机,用示波器看 6 路 PWM 波形是否正确,死区是否生效
- 单步换相测试:手动控制换相步骤,每步持续几秒钟,用万用表测量相电压确认电流路径
- 低速开环运行:固定频率换相(如 1Hz),观察电机是否步进转动
- 闭环启动:加入位置检测,从低速开始逐步提高转速
7.3 常见问题排查顺序
电机不转或转动异常时,按这个顺序排查:
- 电源问题:电源电压是否足够?电流是否被限流?
- 信号问题:STM32 PWM 输出是否正常?三极管基极电压是否随 PWM 变化?
- 换相逻辑:霍尔信号或反电动势检测是否正确?换相表是否正确?
- 时序问题:换相时机是否合适?延迟时间是否根据转速动态调整?
- 参数问题:PWM 频率、死区时间、启动参数是否适合当前电机?
特别提醒:调试无传感器方案时,一定要先用低压、小功率电源,避免启动失败时电流过大损坏器件。
8. 从验证到实用:哪些地方需要改进
这个“最穷套件”能让你理解原理,但要实际应用还需要改进:
8.1 硬件升级方向
- 三极管换 MOS 管:降低导通损耗,提高开关速度
- 增加电流检测:在每个下桥臂加采样电阻,用运放放大后送 ADC
- 加入保护电路:过流保护、欠压锁定、温度检测
- 使用专用驱动芯片:如 DRV8301、IRUMPH50B 等,集成保护功能
8.2 软件优化空间
- 电流闭环:根据检测到的相电流实现力矩控制
- 速度闭环:加入编码器或提高反电动势检测精度,实现精确调速
- 启动优化:针对不同负载设计自适应启动算法
- 故障处理:增加堵转检测、失步恢复等鲁棒性功能
8.3 性能评估指标
当你的驱动能稳定工作后,可以关注这些指标判断优化效果:
- 最大启动转矩(能带动多大负载启动)
- 转速范围(最低稳定转速到最高空载转速)
- 效率(输入功率与输出机械功率的比值)
- 振动和噪音水平
最终要不要从三极管升级到更专业的方案,取决于你的应用场景。如果只是做实验、学原理,这个“最穷套件”已经足够;如果要用于实际产品,建议直接基于专用驱动芯片开发。
这个方案最值得花时间的地方不是调参,而是理解每个换相步骤如何形成旋转磁场,如何通过位置反馈保持同步。一旦原理通了,后续无论换什么硬件平台,核心思路都是相通的。