1. STM32 FOC电流采集方案概述
在电机控制领域,FOC(Field Oriented Control,磁场定向控制)算法因其优异的性能表现被广泛应用。STM32系列MCU凭借其丰富的外设资源,成为实现FOC算法的理想平台。本文将深入解析基于STM32的双电阻低侧电流采样方案,这是ST官方FOC库中精度较高的一种实现方式。
与单电阻方案相比,双电阻模式虽然在硬件成本上略有增加,但显著降低了采样时序的复杂度。其核心思想是通过在电机驱动电路的低侧(Low-side)放置两个采样电阻,分别检测两相电流,第三相电流则通过基尔霍夫定律计算得出。这种设计避免了单电阻方案中复杂的采样窗口计算问题,特别适合对实时性要求较高的应用场景。
2. 硬件架构与采样原理
2.1 低侧采样电路设计
典型的双电阻低侧采样硬件连接如下图所示:
code复制电机相线U → MOSFET Q1 → 采样电阻R1 → GND
电机相线V → MOSFET Q2 → 采样电阻R2 → GND
电机相线W → MOSFET Q3 → 无采样电阻 → GND
当某相的低侧MOSFET导通时,电流流经采样电阻产生压降,这个电压信号经过运放放大后送入STM32的ADC输入通道。需要注意的是:
- 采样电阻值通常选择在0.01Ω-0.1Ω之间,需考虑功率耗散和信噪比平衡
- 运放增益设置要使最大电流时输出不超过ADC参考电压
- PCB布局时应确保采样回路面积最小化,减少EMI干扰
2.2 定时器与ADC协同工作
STM32的先进定时器(如TIM1)与ADC的协同工作是实现精确采样的关键。系统配置要点包括:
- 定时器产生中心对齐的PWM波形,频率通常设置在10-20kHz
- PWM4通道被配置为无输出,仅用作触发事件源
- ADC配置为注入组模式,由定时器触发转换
具体工作时序如下图所示:
code复制PWM周期开始 → PWM有效输出 → 周期结束前1个时钟 → PWM4触发沿 → ADC开始转换
这种设计确保采样时刻发生在PWM周期的末尾,此时低侧MOSFET已导通足够长时间,电流信号趋于稳定。
3. 软件实现细节
3.1 ADC采样点计算算法
ST官方库中的R3_2_SetADCSampPointSectX()函数负责计算最佳采样点,其核心逻辑如下:
c复制uint16_t R3_2_SetADCSampPointSectX(PWMC_Handle_t *pHdl) {
// 检查是否能在PWM周期中间采样
if ((pHandle->Half_PWMPeriod - pHdl->lowDuty) > pHandle->pParams_str->Tafter) {
// 中间采样模式
SamplingPoint = pHandle->Half_PWMPeriod - 1;
pHandle->_Super.Sector = SECTOR_5;
// 设置GPIO指示状态
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, 0);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, 0);
} else {
// 边缘采样模式
DeltaDuty = pHdl->lowDuty - pHdl->midDuty;
if (DeltaDuty > ((pHandle->Half_PWMPeriod - pHdl->lowDuty) * 2U)) {
SamplingPoint = pHdl->lowDuty - pHandle->pParams_str->Tbefore;
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, 0);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, 1);
} else {
SamplingPoint = pHdl->lowDuty + pHandle->pParams_str->Tafter;
if (SamplingPoint >= pHandle->Half_PWMPeriod) {
// 需要切换触发极性
pHandle->ADC_ExternalPolarityInjected = LL_ADC_INJ_TRIG_EXT_FALLING;
SamplingPoint = (2U * pHandle->Half_PWMPeriod) - SamplingPoint - 1;
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, 1);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, 0);
} else {
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, 1);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, 1);
}
}
}
return R3_2_WriteTIMRegisters(&pHandle->_Super, SamplingPoint);
}
3.2 电流重构算法
获得两相电流采样值后,需要重构三相电流:
c复制// 获取ADC采样值
Iu = ADC1->JDR1; // U相电流ADC值
Iv = ADC1->JDR2; // V相电流ADC值
// 转换为实际电流值(单位:A)
Iu_actual = (float)Iu * ADC_REFERENCE_VOLTAGE / (4096 * Rshunt * Amplification_Gain);
Iv_actual = (float)Iv * ADC_REFERENCE_VOLTAGE / (4096 * Rshunt * Amplification_Gain);
// 计算W相电流(基尔霍夫定律)
Iw_actual = -Iu_actual - Iv_actual;
4. 关键参数配置与优化
4.1 ADC采样时间配置
ADC采样时间的设置需要考虑以下因素:
- 采样电阻和运放电路的建立时间
- PWM频率与ADC时钟的关系
- 信号链路的噪声特性
经验公式:
code复制总采样时间 = 采样周期数 × (ADC时钟周期) + 保持时间
对于STM32F3系列,典型配置为:
c复制hadc.Inj.SamplingTimeCommon = ADC_SAMPLETIME_7CYCLES_5;
4.2 死区时间与采样窗口
死区时间设置不当会导致采样失真,建议:
- 死区时间 ≥ 100ns(高频应用可能需要更大)
- 采样窗口应避开死区过渡时段
- 通过示波器验证实际波形
5. 常见问题与解决方案
5.1 采样值异常问题排查
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 电流读数跳变 | 采样时刻不当 | 调整Tbefore/Tafter参数 |
| 零电流时有偏置 | 运放失调电压 | 硬件校准或软件补偿 |
| 高频噪声干扰 | PCB布局问题 | 优化地平面,增加滤波电容 |
5.2 性能优化技巧
- 动态调整采样点:根据负载电流自动优化采样时刻
- 滑动平均滤波:对ADC采样值进行适度滤波
- 温度补偿:监测采样电阻温度,动态修正阻值
6. ST与SimpleFOC实现对比
6.1 采样策略差异
ST官方方案:
- 严格同步于PWM周期
- 采用硬件触发注入模式
- 支持动态采样点调整
SimpleFOC方案:
- 相对简化的定时采样
- 软件触发为主
- 固定采样时刻
6.2 性能表现对比
测试数据(2804电机,12V供电):
| 参数 | ST方案 | SimpleFOC |
|---|---|---|
| 1000RPM电流 | 0.025A | 0.032A |
| 波形THD | 3.2% | 5.8% |
| 动态响应 | 优 | 良 |
7. 电角度与机械角度关系处理
在FOC算法中,准确的电角度信息至关重要。通过AS5600等磁性编码器获取机械角度后,需要根据电机极对数转换为电角度:
c复制// 极对数定义
#define POLE_PAIRS 7
// 角度转换
mech_angle = AS5600_GetAngle(); // 获取机械角度(0-360°)
elec_angle = mech_angle * POLE_PAIRS; // 计算电角度
elec_angle = fmod(elec_angle, 360); // 归一化到0-360°
实测数据表明,在1260RPM时,电角度与机械角度的线性关系良好,验证了位置检测方案的可靠性。
8. 实际应用建议
- 参数校准:上电时自动进行电流零点校准
- 保护机制:实现过流、短路快速保护
- 调试接口:保留关键变量的实时监控功能
在IHM07M1开发板上实现时,特别注意:
- 电流检测运放的带宽要足够
- PWM频率不宜超过20kHz(考虑开关损耗)
- 确保ADC参考电压稳定
通过合理配置STM32的定时器和ADC外设,配合优化的软件算法,双电阻低侧电流采样方案可以实现高精度的电机电流检测,为FOC控制提供可靠反馈。相比单电阻方案,虽然增加了少量硬件成本,但显著降低了软件复杂度,是中小功率电机控制的理想选择。