主题中讨论的其他器件:MOTORWARE、、、 DRV8320
工具与软件:
您好!
根据 solutions/common/sensorless_foc/source/is05_motor_id.c 实验、我们构建了基于速度控制的系统。 我们在低速(SPI 通信)和高速下使用编码器的角度
使用估算器来确定角度。 当我们使用编码器角度时、我们使用函数 EST_setAngle_rad 将该角度注入估算器。
我们使用测试设置来运行此过程、其中电机的轴驱动飞轮。 我们可以通过 Kistler 的传感器测量轴的速度和力。 当我们将速度设定点设置为120 rpm 时
我们还看到电机的转速为120rpm。 当我们然后开始注入编码器角度时、电机保持运转正常、但是我们看到速度下降到大约90rpm。 如果我们再看一看反馈信号
对于 pi_spd、它表示电机仍在以120rpm 的转速运行。 因此、Motorware 认为电机正在以正确的速度运行。
我也可以在不使用编码器的情况下重现这种行为、但通过首先读取 est 角度、添加-0.001 rad 的偏移、然后使用函数 est_getAngle_est_rad ()。 我还调节
gSystem.estOutputData.angle_rad (这被用来计算矢量)。 转速也降至大约90rpm。
还要注意的是、ctrl 对象中的 pi_spd 反馈信号表示电机以120rpm 的转速运行。
是否有人知道这里发生了什么以及我们如何解决这个问题?
下面是 ISR 的代码片段:
.... EST_run(gSystem.estHandle, &gSystem.estInputData, &gSystem.estOutputData); angleEst_rad = EST_getAngle_est_rad(gSystem.estHandle); loggingNeeded = true; float32_t estAngleLUT; float32_t estAngleInjectionDebug; // get est angle from the lookup table (to convert from 1 mech. to 7 electrical) int32_t index = (int32_t)(gSystem.EncAngleDegrees / 2); // get the index (every 2 degrees 1) float32_t remainder = (gSystem.EncAngleDegrees / 2) - index; float32_t LUT_value = lookupTableEncAngle_to_EstAngle[index]; float32_t LUT_value_1 = lookupTableEncAngle_to_EstAngle[index+1]; if(LUT_value_1 < 0 && LUT_value > 0){ LUT_value_1 = LUT_value_1 + MATH_TWO_PI; } float32_t stepSizeEstAngle = LUT_value_1 - LUT_value; estAngleLUT = LUT_value + (stepSizeEstAngle * remainder); if(estAngleLUT > MATH_PI) estAngleLUT = estAngleLUT - MATH_TWO_PI; estAngleLUT = estAngleLUT + gSystem.EncAngleOffset_Rad; // offset is normaly 0.0 if(gSystem.useEncAngle){ EST_setAngle_rad(gSystem.estHandle, estAngleLUT); gSystem.estOutputData.angle_rad = estAngleLUT; } if(gSystem.useEstAngleInjection){ estAngleInjectionDebug = EST_getAngle_est_rad(gSystem.estHandle)+gSystem.EncAngleOffset_Rad; // offset is normaly 0.0 if(estAngleInjectionDebug > MATH_PI) estAngleInjectionDebug = estAngleInjectionDebug - MATH_TWO_PI; if(estAngleInjectionDebug < -MATH_PI) estAngleInjectionDebug = estAngleInjectionDebug + MATH_TWO_PI; EST_setAngle_rad(gSystem.estHandle, estAngleInjectionDebug); gSystem.estOutputData.angle_rad = estAngleInjectionDebug; } // // compute the sin/cos phasor // phasor.value[0] = cosf(gSystem.estOutputData.angle_rad); phasor.value[1] = sinf(gSystem.estOutputData.angle_rad); // // set the phasor in the Park transform // PARK_setPhasor(gSystem.parkHandle, &phasor); // // run the Park transform // PARK_run(gSystem.parkHandle, &(gSystem.estInputData.Iab_A), (MATH_Vec2 *)&(gSystem.Idq_in_A)); ....
我们在具有 DRV8320的 launchXL-F280049C 上使用 motorware SDK 版本5.02。