Part Number: TMS320F280037
Hi TI experts,
I am experiencing some startup issues with a surface PMSM while using the FAST Estimator. I have a few questions about FAST that will hopefully help me resolve these issues. Here is my understanding of how it works. My project is based on the universal_motor_control_lab within the MotorControlSDK.
Here are the two variables that control the forceAngle.
objUser->forceAngleFreq_Hz
objUser->forceAngleAccel_Hzps
Here's the state flow of the code during startup. First, align the rotor at the align current on the d axis:
else if(obj->motorState == MOTOR_ALIGNMENT)
{
obj->angleFOC_rad = 0.0f;
obj->enableSpeedCtrl = false;
obj->IsRef_A = 0.0f;
obj->Idq_out_A.value[0] = obj->alignCurrent_A;
obj->Idq_out_A.value[1] = 0.0f;
TRAJ_setIntValue(obj->trajHandle_spd, 0.0f);
if((obj->stateRunTimeCnt > obj->alignTimeDelay) ||
(obj->flagEnableAlignment == false))
{
obj->stateRunTimeCnt = 0;
obj->motorState = MOTOR_OL_START;
obj->Idq_out_A.value[0] = obj->fluxCurrent_A;
EST_setAngle_rad(obj->estHandle, obj->angleFOC_rad);
PI_setUi(obj->piHandle_spd, obj->alignCurrent_A);
}
After the alignTimeDelay has transpired. Set the d axis to the fluxCurrent, and seed the speed controller with the aligncurrent. Looks like the align current is getting transferred over to the Q axis here.
Then it moves to MOTOR_OL_START where the FOC angle grabs the angle put out by the estimator. I'm guess this is the forceAngle at this point since the rotor was just aligned and is not spinning yet.
else if(obj->motorState == MOTOR_OL_START)
{
obj->angleFOC_rad = obj->angleEST_rad;
obj->motorState = MOTOR_CL_RUNNING;
}
Now, in MOTOR_CL_RUNNING, we sit in this condition until the startupTimeDelay has passed, at which point the D axis current is set to zero and we move to MOTOR_CTRL_RUN, which is normal FOC operation. At this point the motor should have started successfully, and the FOC loops are working as expected.
if(obj->motorState == MOTOR_CL_RUNNING)
{
obj->stateRunTimeCnt++;
if(obj->stateRunTimeCnt == obj->startupTimeDelay)
{
obj->Idq_out_A.value[0] = 0.0f;
obj->motorState = MOTOR_CTRL_RUN;
}
}
- How does the FAST Estimator use the forceAngleFreq_Hz and forceAngleAccel_Hzps variables? I'm assuming it generates an angle starting at a frequency of forceAngleFreq_Hz and it accelerates at a speed of forceAngleAccel_Hzps?
- How does the estimator know when to switch over from the forced angle to the estimated angle? Is there some type of error threshold that must be achieved? Is there a flag in the estimator that indicates when the switch over has occured? I haven't been able to find such a flag.
- At what point in this startup routine can I expect / is it desired for the estimator to switch over from ForceAngle to normal operation angle estimation? Do I need to define my own conditions and then shut off ForceAngle?
Regards,
Ryan