This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TMS320F2806: Instaspin-FOC电流采样触发点设置错误的问题

Part Number: TMS320F2806

工程师您好,我之前咨询了有关F28069 Instaspin-FOC相电流采样的问题,并未得到有效回复。在应用笔记ZHCAA13 – 6.2020当中提到,新的电流重构算法原理如下图:

...

lab10e的HAL_setTrigger()函数设置采样触发点是当三相电流都可测时在占空比最小的相中间触发采样,这是没有问题的,属于上图的T1区域,但是当只有一相或者两相电流可测量时,采样的触发点是设在了占空比第二宽的相的中点处,这明显不是上图所示的T2或T3区域,我认为HAL_setTrigger的设置是有错误的,应该纠正

//! \brief Set trigger point in the middle of the low side pulse
//! \param[in] handle The hardware abstraction layer (HAL) handle
//! \param[in] ignoreShunt The low side shunt that should be ignored
//! \param[in] midVolShunt The middle length of output voltage
static inline void HAL_setTrigger(HAL_Handle handle,const SVGENCURRENT_IgnoreShunt_e ignoreShunt,
const SVGENCURRENT_VmidShunt_e midVolShunt)//CMPA参与PWM的翻转,CMPB用于构成触发ADC采样
{
HAL_Obj *obj = (HAL_Obj *)handle;

PWM_Obj *pwm1 = (PWM_Obj *)obj->pwmHandle[PWM_Number_1];
PWM_Obj *pwm2 = (PWM_Obj *)obj->pwmHandle[PWM_Number_2];
PWM_Obj *pwm3 = (PWM_Obj *)obj->pwmHandle[PWM_Number_3];
PWM_Obj *pwm;

uint16_t nextPulse1 = (pwm1->CMPA + pwm1->CMPAM) / 2;
uint16_t nextPulse2 = (pwm2->CMPA + pwm2->CMPAM) / 2;
uint16_t nextPulse3 = (pwm3->CMPA + pwm3->CMPAM) / 2;
uint16_t pwmCMPA1 = pwm1->CMPA;
uint16_t pwmCMPA2 = pwm2->CMPA;
uint16_t pwmCMPA3 = pwm3->CMPA;

if(ignoreShunt == use_all)//都可用的时候挑出最小值
{
if((nextPulse1 <= nextPulse2) && (nextPulse1 <= nextPulse3))
{
pwm = pwm1;
}
else if((nextPulse2 <= nextPulse1) && (nextPulse2 <= nextPulse3))
{
pwm = pwm2;
}
else
{
pwm = pwm3;
}
}
else//一相或两相可用的时候挑出中间值(经过SVGENCURRENT_compPwmData()函数,一相可测量只是暂时的,最终也会变成两相可测量)
{
if(midVolShunt == Vmid_a)
{
pwm = pwm1;
}
else if(midVolShunt == Vmid_b)
{
pwm = pwm2;
}
else
{
pwm = pwm3;
}
}

pwmCMPA1 = pwm->CMPA;
pwmCMPA2 = pwm->CMPAM;

if(pwmCMPA2 >= (pwmCMPA1 + pwm->DBFED))
{
pwmCMPA3 = (pwmCMPA2 - (pwmCMPA1 + pwm->DBFED)) / 2 + 1;
if(pwmCMPA3 < (pwm1->TBPRD>>1))
{
pwm1->CMPB = pwmCMPA3;
}
else
{
pwm1->CMPB = (pwm1->TBPRD>>1);
}
PWM_setSocAPulseSrc(obj->pwmHandle[PWM_Number_1],PWM_SocPulseSrc_CounterEqualCmpBDecr);//在这里应该是一路触发,带动三路都采,采到的值能不能用后续再处理
}
else
{
pwmCMPA3 = ((pwmCMPA1 + pwm->DBFED) - pwmCMPA2 ) / 2 + 1;
if(pwmCMPA3 < (pwm1->TBPRD>>1))
{
pwm1->CMPB = pwmCMPA3;
}
else
{
pwm1->CMPB = (pwm1->TBPRD>>1);
}
PWM_setSocAPulseSrc(obj->pwmHandle[PWM_Number_1],PWM_SocPulseSrc_CounterEqualCmpBIncr);
}

return;
} // end of HAL_setTrigger() function