此帖子意外标记的已解决,请参阅新主题: e2e.ti.com/.../tms320f280037c-tms320f280037c-universal-motor-control-lab-estimator-estoutputdata-bad-despite-good-inputs-dmc_level_3-from-successful-dmc_level_2
嗨、
旋转 BLDC 电机、尝试快速实现。 我已成功使用 InstaSPIN 实验室在评估套件上测试了此电机。
在让 DMC_LEVEL_2 在定制硬件上旋转电机时遇到一些困难。
仔细检查代码后、并未使用 V/Hz 角度发生器来命令电机、而是使用估算器来命令电机。
我最终成为了问题的绊脚石、因为用于开环 V/Hz 控制的角度发生器 InstaSPIN 实验"is03"在我的原型上完成了它(正确吗?) 绕过估算器生成的角度。
然后、我打开估算器、无需将其连接到控制系统、只需要查看它是否正常工作。
以下是我正在使用的 ISR:
__interrupt void motor1CtrlISR(void)
{
//motorVars_M1.ISRCount++;
MOTOR_Vars_t *obj = (MOTOR_Vars_t *)motorHandle_M1;
USER_Params *objUser = (USER_Params *)(obj->userParamsHandle);
HAL_ackMtr1ADCInt(); // acknowledge the ADC interrupt
HAL_readMtr1ADCData(&obj->adcData); // read the ADC data with offsets
obj->ISRCount++;
obj->adcData.V_V.value[0] -=obj->adcData.offset_V_sf.value[0] * obj->adcData.VdcBus_V; // remove offsets
obj->adcData.V_V.value[1] -=obj->adcData.offset_V_sf.value[1] * obj->adcData.VdcBus_V;
obj->adcData.V_V.value[2] -=obj->adcData.offset_V_sf.value[2] * obj->adcData.VdcBus_V;
// Verifies the ADC for current and voltage, offset compensation,
// clarke / park transformations. (Without using estimator angle)
MATH_Vec2 phasor;
CLARKE_run(obj->clarkeHandle_I, &obj->adcData.I_A, &obj->estInputData.Iab_A);
CLARKE_run(obj->clarkeHandle_V, &obj->adcData.V_V, &obj->estInputData.Vab_V);
#if (DMC_BUILDLEVEL == DMC_LEVEL_2)
//---------------------------------------
if(obj->flagRunIdentAndOnLine == true){
obj->counterTrajSpeed++;
if(obj->counterTrajSpeed >= objUser->numIsrTicksPerTrajTick){
obj->counterTrajSpeed = 0;
TRAJ_run(obj->trajHandle_spd); // run a trajectory for speed reference, so the reference changes with a ramp instead of a step
obj->estInputData.speed_ref_Hz= TRAJ_getIntValue(obj->trajHandle_spd);
}
//obj->enableCurrentCtrl = obj->flagEnableCurrentCtrl;
//obj->enableSpeedCtrl = obj->flagEnableSpeedCtrl;
}
else{
obj->enableSpeedCtrl = false;
obj->enableCurrentCtrl = false;
}
obj->estInputData.dcBus_V = obj->adcData.VdcBus_V;
obj->speed_int_Hz = obj->estInputData.speed_ref_Hz;
EST_run(obj->estHandle, &obj->estInputData, &obj->estOutputData);
//obj->oneOverDcBus_invV = obj->estOutputData.oneOverDcBus_invV;
//obj->estOutputData.oneOverDcBus_invV = 1.0 / obj->estInputData.dcBus_V;
obj->oneOverDcBus_invV = 1.0 / obj->estInputData.dcBus_V;
ANGLE_GEN_run(obj->angleGenHandle, obj->estInputData.speed_ref_Hz);
obj->angleGen_rad = ANGLE_GEN_getAngle(obj->angleGenHandle);//angleFoc_rad = ANGLE_GEN_getAngle(obj->angleGenHandle);
obj->angleFOC_rad = obj->angleGen_rad;
VS_FREQ_run(obj->VsFreqHandle, obj->estInputData.speed_ref_Hz);
obj->Vdq_out_V.value[0] = VsFreq_M1.Vdq_out.value[0];//VS_FREQ_getVd_out(obj->VsFreqHandle);
obj->Vdq_out_V.value[1] = VsFreq_M1.Vdq_out.value[1];//VS_FREQ_getVq_out(obj->VsFreqHandle);
phasor.value[0] = __cos(obj->angleFOC_rad);
phasor.value[1] = __sin(obj->angleFOC_rad);
IPARK_setPhasor(obj->iparkHandle_V, &phasor); // set the phasor in the inverse Park transform
IPARK_run(obj->iparkHandle_V, &obj->Vdq_out_V, &obj->Vab_out_V); // run the inverse Park module
//SVGEN_setup(obj->svgenHandle, obj->estOutputData.oneOverDcBus_invV); // setup the space vector generator (SVGEN) module
SVGEN_setup(obj->svgenHandle, obj->oneOverDcBus_invV);
SVGEN_run(obj->svgenHandle, &obj->Vab_out_V, &obj->pwmData.Vabc_pu); // run the space vector generator (SVGEN) module
if(HAL_getPwmEnableStatus(obj->halMtrHandle) == false)
{
obj->pwmData.Vabc_pu.value[0] = 0.0;
obj->pwmData.Vabc_pu.value[1] = 0.0;
obj->pwmData.Vabc_pu.value[2] = 0.0;
}
HAL_writePWMData(obj->halMtrHandle, &obj->pwmData);
请注意、估算器不用于生成 PWM 的相位角;ANGLE_GEN_Run 直接接收目标速度并向 PWM 信号链提供相量。
以下是 使用 V/Hz 控制方法时 ADC 读数的一些数据记录快照:
(对于每组4个图表:左上、右上、左下、右下)
(编辑)(左) I_A 值[0]、I_A 值[1]、I_A 值[2]、angleGen_rad
(中间) V_V.value[0]、V_V.value[1] 、V_V.value[2]、 angleGen_rad
(右) IAB_A.value[0]、 IAB_A.value[1]、 VAB_V.value[0]、VAB_V.value[1]

因此、在提供输入的情况下、Clarke 变换会输出非常清晰的波形。 它们被生产、速度相当低、为20Hz。 用户会认为估算器在从该反馈中查找转子位置等方面不会遇到任何问题。
相反、我得到了以下结果:

如果电机未旋转、ANGLE_rad 是-pi 和 PI 之间的实际数字、当电机开始旋转时、它会立即变为+INF。
oneOverDcBus_invV 是常数。
所有其他数字都会发生巨大变化。 RPS 在-25000至25000之间波动。
如何修复估算器?