器件型号: LAUNCHXL-F280039C
您好团队:
我们能够通过跳动 PI±电流来停止电机减速直流电压反弹。 线性直流电源> 13,000uF、逆变器 1300uF 大容量电容器。 在持续电流>16A 的线性电源下、相同的电机和直流逆变器在梯形波形下运行良好。 I
#else // !MOTOR1_ISBLDC
/* Reduce half the min/max deceleration current */
if(bMainDecel)
{
PI_setMinMax(obj->piHandle_spd, -obj->maxCurrent_A / 2 , obj->maxCurrent_A / 2);
}
else
{
PI_setMinMax(obj->piHandle_spd, -obj->maxCurrent_A / 1.25, obj->maxCurrent_A / 1.25);
}
SVGEN_setMode(obj->svgenHandle, obj->svmMode);
#endif // !MOTOR1_ISBLDC
当电机估算电流设置得过高以达到轨迹速度赫兹时、PI 积分器在下面的负积分器输入值和正积分器输入值之间明显地摆动电流非单调线性斜坡! 奇怪的是、这也会导致 PI RUN 系列中的直流电感电压在 Idq 帧 (motor1_drive.c) 中反弹直流。
分析 PI 集系列函数时、似乎__fsat 缺失、但编译器会跳过它、否则 CCS 无法找到它?
无论如何、我们添加的 bMainDecel 现在可以在减速期间停止 PI 最小/最大电流控制器中的直流反弹、也可以停止触发 OVC 故障! 然而、仍然对轨迹电流摆幅具有过多的非线性加速、这似乎是 PI 电流控制器中的积分器造成的且不饱和?
为什么要使用函数__fsat?
为什么 VsMaxV 乘以 PU 0.5f? 这一数学运算使得+165V 直流总线电压= 82.5VsMax。 请注意、转子 Speed_Hz 未计入 PI 积分器误差因子。 这似乎导致轨迹落后、因为只要 Speed_Hz < 1000RPM、电流就开始大幅滞后电压。 此电机需要 14-16 安培的电流才能在额定电压 235vdc 下达到远远超过 1000RPM。
奇怪的是、我们只能设置 USER_MOTOR1_MAX_CURRENT_A <= 10.535f、或者当 Speed_Hz > 250Hz 且仍然听到电流反弹> 420Hz 时、PI 开始振荡(反弹)定子电压。 问题是需要将电流设置为>12A 以穿过频率屏障、惯性矩以特定的 Idq 和转子速度交叉。 PI 控制器不得溢出 32 位错误乘法! 然而、float- 32 似乎正在溢出 pi_run 函数中的积分器误差。 也许是为什么 Luminary Micro 在 Thumb 汇编器中进行 32 位乘法、所以 CCS 编译器优化器不会影响速度积分器误差量的乘法。 当看似感性的电流开始滞后于电压超过几百转的转子>250Hz 时、积分在大多数转子转速下都保持稳定。
ERROR = refValue - fbackValue;
//计算比例输出
UP = KP * Error;
//最大电压输出
obj->VsMax_V = objUser->maxVsMag_pu * obj->adcData.VdcBus_V;
pi_setMinMax(obj->pi Handle_Id、-obj->VsMax_V、obj->VsMax_V);




// Maximum voltage output
obj->VsMax_V = objUser->maxVsMag_pu * obj->adcData.VdcBus_V;
PI_setMinMax(obj->piHandle_Id, -obj->VsMax_V, obj->VsMax_V);
#else // !SFRA_ENABLE
// run the Id controller
PI_run_series(obj->piHandle_Id,
obj->IdqRef_A.value[0], obj->Idq_in_A.value[0],
obj->Vdq_ffwd_V.value[0], (float32_t*)&obj->Vdq_out_V.value[0]);
// calculate Iq controller limits
float32_t outMax_V = __sqrt((obj->VsMax_V * obj->VsMax_V) -
(obj->Vdq_out_V.value[0] * obj->Vdq_out_V.value[0]));
PI_setMinMax(obj->piHandle_Iq, -outMax_V, outMax_V);
// run the Iq controller
PI_run(obj->piHandle_Iq, obj->IdqRef_A.value[1],
obj->Idq_in_A.value[1], (float32_t*)&obj->Vdq_out_V.value[1]);
#endif // !SFRA_ENABLE
#if defined(MOTOR1_FAST)
// set the Id reference value in the estimator
EST_setId_ref_A(obj->estHandle, obj->IdqRef_A.value[0]);
EST_setIq_ref_A(obj->estHandle, obj->IdqRef_A.value[1]);
#endif // MOTOR1_FAST
}



