static inline void SVGENCURRENT_compPwmData(SVGENCURRENT_Handle svgencurrentHandle, MATH_vec3 *pPwmData, MATH_vec3 *pPwmData_prev)
{
SVGENCURRENT_Obj *svgencurrent = (SVGENCURRENT_Obj *)svgencurrentHandle;
_iq Va_avg = (pPwmData->value[0]+pPwmData_prev->value[0])>>1;
_iq Vb_avg = (pPwmData->value[1]+pPwmData_prev->value[1])>>1;
_iq Vc_avg = (pPwmData->value[2]+pPwmData_prev->value[2])>>1;
_iq Vlimit;
_iq Vmid, Vmid_prev;
_iq Voffset;
Vlimit = svgencurrent->Vlimit;//最大占空比
//define compensation mode
if(Va_avg > Vlimit)
{
if(Vb_avg > Vlimit)//
{
svgencurrent->compMode = one_phase_measurable;//
if(Va_avg > Vb_avg)//
Vmid = pPwmData->value[1];//
Vmid_prev = pPwmData_prev->value[1];
svgencurrent->Vmid = Vmid_b;//
}
else
{
Vmid = pPwmData->value[0];
Vmid_prev = pPwmData_prev->value[0];
svgencurrent->Vmid = Vmid_a;
}
}
else if(Vc_avg > Vlimit)
{
svgencurrent->compMode = one_phase_measurable;
if(Va_avg > Vc_avg)
{
Vmid = pPwmData->value[2];
Vmid_prev = pPwmData_prev->value[2];
svgencurrent->Vmid = Vmid_c;
}
else
{
Vmid = pPwmData->value[0];
Vmid_prev = pPwmData_prev->value[0];
svgencurrent->Vmid = Vmid_a;
}
}
else
{
svgencurrent->compMode = two_phase_measurable;
if(Vb_avg > Vc_avg) svgencurrent->Vmid = Vmid_b;
else svgencurrent->Vmid = Vmid_c;
}
}
else
{
if(Vb_avg > Vlimit)
{
if(Vc_avg > Vlimit)
{
svgencurrent->compMode = one_phase_measurable;
if(Vb_avg > Vc_avg)
{
Vmid = pPwmData->value[2];
Vmid_prev = pPwmData_prev->value[2];
svgencurrent->Vmid = Vmid_c;
}
else
{
Vmid = pPwmData->value[1];
Vmid_prev = pPwmData_prev->value[1];
svgencurrent->Vmid = Vmid_b;
}
}
else
{
svgencurrent->compMode = two_phase_measurable;
if(Va_avg > Vc_avg) svgencurrent->Vmid = Vmid_a;
else svgencurrent->Vmid = Vmid_c;
}
}
else
{
if(Vc_avg > Vlimit)
{
svgencurrent->compMode = two_phase_measurable;
if(Va_avg > Vb_avg) svgencurrent->Vmid = Vmid_a;
else svgencurrent->Vmid = Vmid_b;
}
else
{
svgencurrent->compMode = all_phase_measurable;
}
}
}
//phase voltage compensator
if(svgencurrent->compMode == one_phase_measurable)//得出只有一相可以采集到电流
{
//???不理解为什么??
Voffset = (Vmid + Vmid_prev) - (Vlimit <<1);//
pPwmData->value[0] -= Voffset;//减去偏置 使下管时间采样更充分
pPwmData->value[1] -= Voffset;
pPwmData->value[2] -= Voffset;
}
// get ignore current
//判断偏置修正后占空比是否大于占空比限制值
if(((pPwmData->value[0] + pPwmData_prev->value[0])>>1) > Vlimit)
{
svgencurrent->IgnoreShunt = ignore_a;
}
else if(((pPwmData->value[1] + pPwmData_prev->value[1])>>1) > Vlimit)
{
svgencurrent->IgnoreShunt = ignore_b;
}
else if(((pPwmData->value[2] + pPwmData_prev->value[2])>>1) > Vlimit)
{
svgencurrent->IgnoreShunt = ignore_c;
}
else
{
svgencurrent->IgnoreShunt = use_all;
}
pPwmData_prev->value[0] = pPwmData->value[0];
pPwmData_prev->value[1] = pPwmData->value[1];
pPwmData_prev->value[2] = pPwmData->value[2];
return;
} // end of SVGENCURRENT_compPwmData() function
static inline void HAL_setTrigger(HAL_Handle handle,const SVGENCURRENT_IgnoreShunt_e ignoreShunt,
const SVGENCURRENT_VmidShunt_e midVolShunt)
{
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
{
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
非常感谢牛x的TI工程师,向您们学习,敬礼~
问题1:
iq Va_avg = (pPwmData->value[0]+pPwmData_prev->value[0])>>1;
_iq Vb_avg = (pPwmData->value[1]+pPwmData_prev->value[1])>>1;
_iq Vc_avg = (pPwmData->value[2]+pPwmData_prev->value[2])>>1;
为什么要求两次的平均?是单纯的滤波吗?
问题2:Voffset = (Vmid + Vmid_prev) - (Vlimit <<1);//
为什么要减去两次的值才是需要等到的偏置?
问题3:HAL_setTrigger函数中
if(pwmCMPA2 >= (pwmCMPA1 + pwm->DBFED))
{
pwmCMPA3 = (pwmCMPA2 - (pwmCMPA1 + pwm->DBFED)) / 2 + 1;
if(pwmCMPA3 < (pwm1->TBPRD>>1))
{
pwm1->CMPB = pwmCMPA3;
}
的原理?
问题4:SVGEN_run()个函数的基本原理是什么?