1. 前言
在当前使用的电机电阻采样方式中分为单电阻,双电阻,三电阻三种方式,其中在 ST MCSDK5.4 库中支持了两种采样方式,单电阻和三电阻,在市面还存在另外一种采样方式,即双电阻采样,本文讨论的是如何修改现有驱动库支持该种采样方式。
2. 电流双电阻采样机理
图1. 双电阻采样结构
实际使用过程中双电阻采样同三电阻采样有相同的机制,即在 shunt 电阻上进行电流采集,并且根据基尔霍夫定理 Ia+Ib+Ic=0,采集两相电流即可以重构出第三路电流;三电阻电流采集会根据扇区不同分别转换电流采样的两个相线(AB,AC,BC 三种情况);而双电阻采样一般直接对 Ia,Ib 进行采样即可,在 FOC 运算中直接使用这两个量。
3. 操作步骤
3.1. 产生工程
使用 MCSDK workbench 产生工程,如何生成工程可以参考马达培训文档,这边不再详细说明,需要使用三电阻采样方式,注意配置的是 U,V 即对应的 Ia,Ib。
图2. MCSDK workbench 电流采样配置界面
图3. MCSDK workbench 采样信号配置界面
3.2. 文件拷贝
以 STM32G43RBT6 配置为例,生成工程中电流采样使用的是 r3_2_g4xx_pwm_curr_fdbk.c文件, 找到这个文件复制一份,重新命名为 r2_2_g4xx_pwm_curr_fdbk.c,我们会在这个文件中对相关函数进行重新定义。这边有个点要注意,原始的电机库文件函数定义都是__weak 属性,因此在不破坏原始文件的同时,我们可以重新定义我们需要的函数。本案例中我们只需要重新定义两个函数,一个是读取静态电流数值的函数,一个是运行过程中得到三相电流的函数。
__weak void R3_2_CurrentReadingPolarization( PWMC_Handle_t * pHdl )
__weak void R3_2_GetPhaseCurrents( PWMC_Handle_t * pHdl, ab_t * Iab )
图4. 电机库的电流采样文件所在位置
3.3. 修改读取静态电流函数
因为对于两电阻采样,我们后面只会使用到 PhaseAOffset 和 PhaseBOffset 这两个值,可以将 R3_2_CurrentReadingPolarization 这个函数改为只检测这两个数据,这边也可以不进行修改,第三个 PhaseCOffset 不使用即可,这个函数我们沿用原来的。在打开的r2_2_g4xx_pwm_curr_fdbk.c 文件中,除了包含文件以及 R3_2_GetPhaseCurrents 函数外,其他内容都删除掉。
图5. 电流采样文件保留内容
3.4. 修改电流读取函数
修改 R3_2_GetPhaseCurrents 函数中的电流读取与计算的设定,这边我们需要屏蔽之前三电阻方式按照扇区来区分采样以及采样相线的设定,增加如下程序,注意把__weak 属性删除掉。
#if defined (CCMRAM)
#if defined (__ICCARM__)
#pragma location = ".ccmram"
#elif defined (__CC_ARM) || defined(__GNUC__)
__attribute__( ( section ( ".ccmram" ) ) )
#endif
#endif
/**
* @brief It computes and return latest converted motor phase currents motor
* @param pHdl: handler of the current instance of the PWM component
* @retval Ia and Ib current in Curr_Components format
*/
void R3_2_GetPhaseCurrents( PWMC_Handle_t * pHdl, ab_t * Iab )
{
#if defined (__ICCARM__)
#pragma cstat_disable = "MISRAC2012-Rule-11.3"
#endif /* __ICCARM__ */
PWMC_R3_2_Handle_t * pHandle = ( PWMC_R3_2_Handle_t * )pHdl;
#if defined (__ICCARM__)
#pragma cstat_restore = "MISRAC2012-Rule-11.3"
#endif /* __ICCARM__ */
TIM_TypeDef * TIMx = pHandle->pParams_str->TIMx;
uint8_t Sector;
int32_t Aux;
uint32_t ADCDataReg1;
uint32_t ADCDataReg2;
Sector = ( uint8_t )pHandle->_Super.Sector;
ADCDataReg1 = *pHandle->pParams_str->ADCDataReg1[Sector];
ADCDataReg2 = *pHandle->pParams_str->ADCDataReg2[Sector];
/* disable ADC trigger source */
LL_TIM_SetTriggerOutput(TIMx, LL_TIM_TRGO_RESET);
/* Current on Phase C is not accessible */
/* Ia = PhaseAOffset - ADC converted value) */
Aux = ( int32_t )( pHandle->PhaseAOffset ) - ( int32_t )( ADCDataReg1 );
/* Saturation of Ia */
if ( Aux < -INT16_MAX )
{
Iab->a = -INT16_MAX;
}
else if ( Aux > INT16_MAX )
{
Iab->a = INT16_MAX;
}
else
{
Iab->a = ( int16_t )Aux;
}
/* Ib = PhaseBOffset - ADC converted value) */
Aux = ( int32_t )( pHandle->PhaseBOffset ) - ( int32_t )( ADCDataReg2 );
/* Saturation of Ib */
if ( Aux < -INT16_MAX )
{
Iab->b = -INT16_MAX;
}
else if ( Aux > INT16_MAX )
{
Iab->b = INT16_MAX;
}
else
{
Iab->b = ( int16_t )Aux;
}
pHandle->_Super.Ia = Iab->a;
pHandle->_Super.Ib = Iab->b;
pHandle->_Super.Ic = -Iab->a - Iab->b;
}
3.5. 限制最大占空比
三电阻可以在任意两相采样电阻上选取可以采样的相线以及采样点,配置较灵活,但如果是双电阻,则需要注意我们若不做特别处理,最大占空比不能做到 100%,因此我们可以根据实际电路以及 PWM 频率等综合考虑进去,对最大调制比进行限制。
比如我们使用的 PWM 周期为 t,tr 为振铃波形时间,tn 为相线干扰波形,ts 为 ADC 采样时间,tc 为 ADC 转换时间,Dt 为死区时间,使用一个 ADC 进行双路电流采样,那么可以估算如下,如果按照中心点触发方式,则有效采样的最小占空比为:
标签:采样,__,电阻,Iab,pHandle,MCSDK5.4,电流
From: https://blog.csdn.net/u014319604/article/details/137054352