ST MCSDK5.4.8 电机库默认支持单电阻和三电阻电流采样,而双电阻采样因成本低、结构简洁,在工业电机控制中应用广泛。本文基于 ST 官方 LAT1334 应用笔记,以 STM32G43RBT6 为例,详解如何通过修改电机库文件,实现双电阻采样功能,核心涉及工程配置、函数重定义、占空比限制三大关键步骤,适用于 MCSDK5.4.8 及相近版本。
1. 双电阻采样核心机理
- 三电阻采样:需根据电机扇区切换采样的两相(AB/AC/BC),配置灵活但硬件成本高;
- 双电阻采样:固定采集 Ia、Ib 两相电流,直接用于 FOC 运算,硬件简化但需限制最大占空比,避免采样失效。
2. 完整操作步骤
2.1 生成三电阻采样工程(基础配置)
首先通过 MCSDK Workbench 生成三电阻采样工程,后续在此基础上修改为双电阻采样:
- 打开 MCSDK Workbench,创建新工程,选择目标芯片(如 STM32G43RBT6);
- 电流采样配置(Power Stage - Current Sensing):
- 采样拓扑:选择 “Three Shunt Resistors”(后续通过软件修改为双电阻);
- 配置参数:设置分流电阻值(如 0.33Ω)、放大倍数(如 1.53)、最大可测电流等;
- 采样信号配置(Control Stage - Analog Input and Protection):
- 分配采样通道:Phase U 对应 ADC1_IN1(A0),Phase V 对应 ADC1_IN6(C0),Phase W 暂不配置;
- 采样时间:设置为 7.5 ADCclk,确保采样精度;
- 生成工程,确认工程中包含三电阻采样核心文件
r3_2_g4xx_pwm_curr_fdbk.c(路径:MCLib/G4xx/Src)。
2.2 文件拷贝与重命名(避免破坏原库)
MCSDK 电机库函数默认带
__weak属性,支持用户重定义,无需修改原文件,步骤如下:- 找到工程中的
r3_2_g4xx_pwm_curr_fdbk.c文件,复制一份并重命名为r2_2_g4xx_pwm_curr_fdbk.c; - 将新文件放回原目录(MCLib/G4xx/Src),后续所有修改均在新文件中进行,保留原文件备份。
2.3 精简静态电流读取函数
双电阻采样仅需用到 PhaseAOffset 和 PhaseBOffset,无需检测 PhaseCOffset,精简步骤如下:
- 打开
r2_2_g4xx_pwm_curr_fdbk.c,删除除 “文件包含” 和R3_2_GetPhaseCurrents函数外的所有内容; - 保留
#include "r3_2_g4xx_pwm_curr_fdbk.h"等必要头文件,确保编译无依赖错误; - 静态电流读取函数
R3_2_CurrentReadingPolarization可沿用原逻辑(不修改),仅忽略 PhaseCOffset 的使用即可。
2.4 重定义电流读取函数(核心修改)
重点修改
R3_2_GetPhaseCurrents函数,屏蔽三电阻的扇区判断逻辑,直接读取双电阻电流并重构第三相,步骤如下:- 删除函数的
__weak属性(确保重定义生效),添加 CCMRAM 属性(可选,优化执行速度); - 屏蔽扇区相关判断:删除原代码中根据
Sector选择 ADC 采样通道的逻辑(三电阻采样需按扇区切换,双电阻固定采样 U、V 相); - 计算 Ia、Ib 电流:通过 ADC 采样值与偏移量差值得到,添加饱和限制避免溢出;
- 重构 Ic 电流:根据基尔霍夫定律
Ic = -Ia - Ib,补充第三相电流计算; - 核心代码示例:
#if defined (CCMRAM)
#if defined (__ICCARM__)
#pragma location = ".ccmram"
#elif defined (__CC_ARM) || defined(__GNUC__)
__attribute__( ( section ( ".ccmram" ) ) )
#endif
#endif
void R3_2_GetPhaseCurrents( PWMC_Handle_t * pHdl, ab_t * Iab )
{
PWMC_R3_2_Handle_t * pHandle = ( PWMC_R3_2_Handle_t * )pHdl;
TIM_TypeDef * TIMx = pHandle->pParams_str->TIMx;
uint32_t ADCDataReg1;
int32_t Aux;
uint32_t ADCDataReg2;
// 屏蔽三电阻的扇区判断逻辑,直接读取U、V相ADC通道
ADCDataReg1 = *pHandle->pParams_str->ADCDataReg1[0]; // 固定读取U相通道
ADCDataReg2 = *pHandle->pParams_str->ADCDataReg2[0]; // 固定读取V相通道
/* 禁用ADC触发源,避免扇区切换干扰 */
LL_TIM_SetTriggerOutput(TIMx, LL_TIM_TRGO_RESET);
/* 计算Ia电流:偏移量 - ADC采样值,添加饱和限制 */
Aux = ( int32_t )( pHandle->PhaseAOffset ) - ( int32_t )( ADCDataReg1 );
Iab->a = (Aux < -INT16_MAX) ? -INT16_MAX : (Aux > INT16_MAX) ? INT16_MAX : (int16_t)Aux;
/* 计算Ib电流:同上 */
Aux = ( int32_t )( pHandle->PhaseBOffset ) - ( int32_t )( ADCDataReg2 );
Iab->b = (Aux < -INT16_MAX) ? -INT16_MAX : (Aux > INT16_MAX) ? INT16_MAX : (int16_t)Aux;
/* 重构Ic电流,遵循基尔霍夫定律 */
pHandle->_Super.Ia = Iab->a;
pHandle->_Super.Ib = Iab->b;
pHandle->_Super.Ic = -Iab->a - Iab->b;
}
2.5 限制最大占空比(避免采样失效)
双电阻采样无法像三电阻那样灵活选择采样点,若占空比过大会导致 ADC 采样被振铃、死区等干扰,需通过软件限制最大调制比:
- 占空比限制原理:有效采样需满足
t_duty > max(tr, tn) + Dt且t_duty > ts + tc + ts(tr = 振铃时间,tn = 干扰时间,Dt = 死区时间,ts = 采样时间,tc = 转换时间); - 修改参数文件:打开
parameters_conversion.h(路径:MC_SDK_5.4.8/Middlewares/ST/MotorControl/templates); - 调整最大调制比:例如计算后最大调制比为 95%,则修改
MAX_MODULE参数:#define MAX_MODULE 31128 // 32767×95% ≈ 31128 - 同步更新 MMITABLE 数组(按 95% 比例调整各元素值,确保 FOC 运算不超限)。
3. 关键注意事项
- 函数属性:必须删除
R3_2_GetPhaseCurrents的__weak属性,否则原库函数会覆盖重定义函数; - 通道固定:双电阻采样固定采集 U、V 相(Ia、Ib),工程配置时需确保 ADC 通道与硬件采样电阻对应;
- 占空比计算:需根据实际硬件参数(PWM 频率、死区时间、ADC 采样时间)推导最大占空比,避免盲目设置;
- 兼容性:修改后的文件仅适用于双电阻采样,若需切换回三电阻,需重新启用原
r3_2_g4xx_pwm_curr_fdbk.c文件。
MCSDK5.4.8 电机库适配双电阻采样的核心是 “函数重定义 + 占空比限制”:通过拷贝并重命名三电阻采样文件,屏蔽扇区判断逻辑,直接读取固定两相电流并重构第三相,同时限制最大调制比避免采样失效。整个过程无需修改原库文件,兼容性强,可快速移植到 STM32G4、STM32F4 等系列芯片的电机控制项目中。
阅读全文
182