STM32F103无刷电机控制:硬件设计与软件实现

1. 项目背景与核心需求

无刷直流电机(BLDC)作为传统有刷电机的升级方案,凭借高效率、长寿命和低噪音等优势,在无人机、电动工具、工业自动化等领域得到广泛应用。STM32F103作为经典的Cortex-M3内核微控制器,其丰富的外设资源和适中的处理能力,使其成为DIY无刷电机控制器的理想选择。

这个项目的核心目标是基于STM32F103实现一个完整的无刷电机控制器,需要同时支持有感(带霍尔传感器)和无感(反电动势检测)两种控制模式。在实际应用中,有感模式启动更可靠但需要额外传感器,无感模式结构简单但对控制算法要求更高。两种模式的灵活切换可以适应不同场景需求。

提示:选择STM32F103C8T6这类64引脚版本,因其具备3个定时器(TIM1/TIM2/TIM3)和足够多的GPIO,能满足三相PWM输出和信号采集需求。

2. 硬件设计与关键元件选型

2.1 主控电路设计

STM32F103最小系统需要包含:

  • 8MHz晶振和两个22pF负载电容
  • 复位电路(10kΩ上拉电阻+0.1μF电容)
  • BOOT0跳线(用于切换启动模式)
  • SWD调试接口(SWDIO/SWCLK)

电源部分建议采用LM2596降压模块将输入电压降至3.3V,同时保留12V/5V输出为驱动电路供电。特别注意要在每个IC的VCC引脚附近放置0.1μF去耦电容。

2.2 功率驱动电路

三相全桥驱动是BLDC控制的核心,推荐方案:

  • 预驱芯片:IR2101S(耐压600V,自带死区控制)
  • MOS管:IRLR7843(30V/160A,Rds(on)仅1.7mΩ)
  • 电流检测:ACS712-30A(基于霍尔效应,隔离测量)

电路布局时需注意:

  1. 高侧和低侧MOS管栅极电阻取值10-100Ω
  2. 每个MOS管DS极间并联快恢复二极管(如FR107)
  3. 三相输出端加0.1μF薄膜电容滤波

2.3 传感器接口设计

对于有感模式,需要处理霍尔传感器信号:

  • 霍尔元件供电:5V LDO(如AMS1117)
  • 信号调理:74HC14施密特触发器(消除抖动)
  • 连接器:3pin 2.54mm排针(H1/H2/H3)

无感模式需要检测反电动势:

  • 分压电阻网络:10kΩ+1kΩ(将母线电压降至3.3V以内)
  • 滤波电路:RC低通(截止频率约1kHz)
  • 比较器:LM393(产生过零信号)

3. 软件架构与核心算法

3.1 基础驱动层实现

使用STM32标准外设库或HAL库初始化关键外设:

// PWM定时器配置(TIM1通道1/2/3) TIM_TimeBaseInitTypeDef TIM_Base; TIM_Base.TIM_Prescaler = 72-1; // 1MHz计数频率 TIM_Base.TIM_CounterMode = TIM_CounterMode_Up; TIM_Base.TIM_Period = 1000-1; // 1kHz PWM TIM_TimeBaseInit(TIM1, &TIM_Base); // 互补PWM输出配置 TIM_OCInitTypeDef TIM_OC; TIM_OC.TIM_OCMode = TIM_OCMode_PWM1; TIM_OC.TIM_OutputState = TIM_OutputState_Enable; TIM_OC.TIM_Pulse = 500; // 初始占空比50% TIM_OC1Init(TIM1, &TIM_OC); TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);

3.2 有感控制模式

六步换相法是基础实现方案:

  1. 通过霍尔状态确定当前转子位置(60°分辨率)
  2. 查表激活对应的MOS管组合
  3. 根据转速需求调整PWM占空比

霍尔信号处理示例代码:

uint8_t Hall_GetState(void) { return (GPIO_ReadInputDataBit(GPIOA, H1_Pin) << 2) | (GPIO_ReadInputDataBit(GPIOA, H2_Pin) << 1) | GPIO_ReadInputDataBit(GPIOA, H3_Pin); } const uint8_t PhaseTable[8] = { 0, // 000: 无效状态 PHASE_AC, // 001: 0-60° PHASE_BC, // 010: 60-120° PHASE_BA, // 011: 120-180° PHASE_CA, // 100: 180-240° PHASE_CB, // 110: 240-300° PHASE_AB // 101: 300-360° };

3.3 无感控制模式

反电动势过零检测是关键难点:

  1. 在PWM关断期间检测悬浮相电压
  2. 与虚拟中性点电压比较确定过零点
  3. 根据换相时序延迟30°电角度

过零检测中断服务例程:

void ADC1_2_IRQHandler(void) { if(ADC_GetITStatus(ADC1, ADC_IT_JEOC)) { uint16_t bemf = ADC_GetInjectedConversionValue(ADC1, ADC_InjectedChannel_1); uint16_t vneutral = VCC_MEASURED / 2; if((bemf > vneutral + HYST) && !cross_detected) { cross_detected = 1; TIM_SetCounter(TIM2, 0); // 重置换相计时器 } ADC_ClearITPendingBit(ADC1, ADC_IT_JEOC); } }

4. 调试技巧与性能优化

4.1 启动策略优化

无感模式启动是最大挑战,推荐三段式启动:

  1. 对齐阶段:强制给AB相通电,将转子拉到确定位置
  2. 加速阶段:逐步提高换相频率(开环控制)
  3. 切换阶段:当反电动势足够大时切到闭环控制

启动参数典型值:

typedef struct { uint16_t align_time; // 对齐时间ms(通常100-300) uint16_t ramp_steps; // 加速步数(20-50) uint16_t step_time; // 每步时间ms(5-20) uint16_t bemf_threshold; // 切换阈值mV(约电源电压1/4) } StartupParams;

4.2 PID速度控制

位置式PID算法实现示例:

void PID_Update(PID_TypeDef* pid, float actual, float target) { float error = target - actual; pid->integral += error * pid->dt; // 抗积分饱和 if(pid->integral > pid->max_i) pid->integral = pid->max_i; else if(pid->integral < -pid->max_i) pid->integral = -pid->max_i; float derivative = (error - pid->prev_error) / pid->dt; pid->output = pid->kp * error + pid->ki * pid->integral + pid->kd * derivative; pid->prev_error = error; }

参数整定建议:

  • Kp:从0.1开始,观察响应速度
  • Ki:约为Kp/10,消除静差
  • Kd:高速时抑制振荡,通常Kp/100

4.3 保护机制实现

必须包含的硬件保护:

  1. 过流保护:ADC检测电流>阈值时立即关闭PWM
  2. 欠压保护:输入电压低于阈值时软关机
  3. 堵转保护:转速低于预期且电流过大时报警

保护触发处理流程:

graph TD A[保护触发] --> B[关闭所有PWM输出] B --> C[记录错误代码到Flash] C --> D[进入待机模式] D --> E[需手动复位恢复]

5. 实测数据与波形分析

使用示波器捕获的关键波形:

测试项正常波形特征异常情况处理
PWM输出互补对称,死区时间正确检查TIM_BDTR寄存器配置
霍尔信号6状态循环,边沿清晰检查传感器安装角度
反电动势梯形波,过零点明确调整滤波电容值
相电流正弦度良好,无畸变检查MOS管导通阻抗

实测性能指标(以新西达2212电机为例):

参数有感模式无感模式
启动成功率100%85%(需优化启动参数)
转速范围500-15000 RPM1000-12000 RPM
效率@50%负载89%83%
动态响应时间<50ms<80ms

6. 进阶改进方向

6.1 FOC矢量控制升级

在现有硬件基础上可升级为FOC控制:

  1. 增加相电流采样(至少两路)
  2. 实现Clarke/Park变换
  3. 采用SVPWM调制技术

关键代码结构:

void FOC_Update(void) { ClarkeTransform(ia, ib, &i_alpha, &i_beta); ParkTransform(i_alpha, i_beta, theta, &id, &iq); PID_Regulate(id, iq); InvParkTransform(vd, vq, theta, &v_alpha, &v_beta); SVPWM_Generate(v_alpha, v_beta); }

6.2 无线调试接口

通过USART转蓝牙模块(如HC-05)实现:

  1. 配置AT指令设置模块参数
  2. 定义简单通信协议:
    • 0x01: 读取转速
    • 0x02: 设置目标转速
    • 0x03: 读取错误码

6.3 能量回馈制动

硬件改进:

  1. 增加母线电压检测电路
  2. 修改MOS管驱动时序实现同步整流

软件逻辑:

if(brake_active && bus_voltage < max_voltage) { // 开启低侧MOS管续流 TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Enable); // 调整PWM占空比控制制动强度 TIM_SetCompare1(TIM1, brake_level); }