Part Number: INSTASPINFOCMOTORWAREGUI
Other Parts Discussed in Thread: MOTORWARE
Hi,
I am working of dual motor control with Motorware SDK on LaunchXL-F290049C. I would like to implement all functionalities like FW and RS online, torque control. So far I have been successful in torque/ speed control for either motor. However, I am unable to get FW and RS online to work.
Field weakening - As I understand, Just setting the motorvars[x].flagEnableFWC to 1 should be enough to enable FW as the PI is already defined. However, this does not work. I notice that unlike the other labs, the motorVars[x].Vs_V does not get updated with the motor speed. It remains at 0.
Rs online - This is used this when FW is not active
//
// runRsOnLine for Rs online calibration
//
void runRsOnLine(EST_Handle estHandle, HAL_MotorNum_e ctrlNum)
{
//
// execute Rs OnLine code
//
if(motorVars[ctrlNum].flagRunIdentAndOnLine == true)
{
if((EST_getState(estHandle) == EST_STATE_ONLINE) &&
(motorVars[ctrlNum].flagEnableRsOnLine == true))
{
EST_setFlag_enableRsOnLine(estHandle, true);
EST_setRsOnLineId_mag_A(estHandle, motorVars[ctrlNum].RsOnLineCurrent_A);
float32_t RsError_Ohm = motorVars[ctrlNum].RsOnLine_Ohm - motorVars[ctrlNum].Rs_Ohm;
if(abs(RsError_Ohm) < (motorVars[ctrlNum].Rs_Ohm * 0.05)) // 5% Error
{
EST_setFlag_updateRs(estHandle, true);
}
}
else
{
EST_setRsOnLineId_mag_A(estHandle, 0.0);
EST_setRsOnLineId_A(estHandle, 0.0);
EST_setRsOnLine_Ohm(estHandle, EST_getRs_Ohm(estHandle));
EST_setFlag_enableRsOnLine(estHandle, false);
EST_setFlag_updateRs(estHandle, false);
}
}
return;
} // end of runRsOnLine() function
In the mainISR()
// store the input data into a buffer
estInputData[isrNum].dcBus_V = adcData[isrNum].dcBus_V;
if(EST_getState(estHandle[isrNum]) != EST_STATE_ONLINE)
{
Idq_ref_A[isrNum].value[0] = EST_getIntValue_Id_A(estHandle[isrNum]);
estInputData[isrNum].speed_ref_Hz = EST_getIntValue_spd_Hz(estHandle[isrNum]);
estInputData[isrNum].speed_int_Hz = EST_getIntValue_spd_Hz(estHandle[isrNum]);
}
else
{
Idq_ref_A[isrNum].value[0] = EST_getIdRated_A(estHandle[isrNum]);
estInputData[isrNum].speed_ref_Hz = motorVars[isrNum].speedTraj_Hz;
estInputData[isrNum].speed_int_Hz = motorVars[isrNum].speedTraj_Hz;
}
// update Id reference for Rs OnLine
EST_updateId_ref_A(estHandle[isrNum],
(float32_t *)&(Idq_ref_A[isrNum].value[0]));
// run the estimator
EST_run(estHandle[isrNum],
&estInputData[isrNum],
&estOutputData[isrNum]);
// get Idq, reutilizing a Park transform used inside the estimator.
// This is optional, user's Park works as well
EST_getIdq_A(estHandle[isrNum], (MATH_Vec2 *)(&(Idq_in_A[isrNum])));
// run the speed controller
// run the speed controller
if(EST_doSpeedCtrl(estHandle[isrNum]))
{
counterSpeed[isrNum]++;
if(counterSpeed[isrNum] >= userParams[isrNum].numCtrlTicksPerSpeedTick)
{
counterSpeed[isrNum] = 0;
PI_run_series(piHandle_spd[isrNum],
estInputData[isrNum].speed_ref_Hz,
estOutputData[isrNum].fm_lp_rps * MATH_ONE_OVER_TWO_PI,
0.0,
(float32_t *)(&(motorVars[isrNum].IsRef_A)));
PI_run_series(piHandle_fwc[isrNum],
motorVars[isrNum].VsRef_V,
motorVars[isrNum].Vs_V,
0.0,
(float32_t *)(&(motorVars[isrNum].angleCurrent_rad)));
// compute the sin/cos phasor using fast RTS function, callable assembly
fwcPhasor[isrNum].value[0] = sinf(motorVars[isrNum].angleCurrent_rad);
fwcPhasor[isrNum].value[1] = cosf(motorVars[isrNum].angleCurrent_rad);
// Idq_ref_A[isrNum].value[0] = motorVars[isrNum].IsRef_A *
// fwcPhasor[isrNum].value[0];
Idq_ref_A[isrNum].value[1] = motorVars[isrNum].IsRef_A *
fwcPhasor[isrNum].value[1];
}
}
SetUp for Rs online
motorVars[ctrlNum].flagEnableRsRecalc = true;
motorVars[ctrlNum].flagEnableRsOnLine = true;
motorVars[ctrlNum].RsOnLineCurrent_A = USER_M2_MOTOR_RES_EST_CURRENT_A;
Call Rs online in main()
//
// run Rs online
//
runRsOnLine(estHandle[ctrlNum], ctrlNum);
// enable or disable force angle
EST_setFlag_enableForceAngle(estHandle[ctrlNum],
motorVars[ctrlNum].flagEnableForceAngle);
EST_setFlag_enableRsRecalc(estHandle[ctrlNum],
motorVars[ctrlNum].flagEnableRsRecalc);
EST_setFlag_enableRsOnLine(estHandle[ctrlNum],
motorVars[ctrlNum].flagEnableRsOnLine);
While Rs online running, the motors don't run but make a buzzing noise.
It will be very helpful if someone could guide me what I am doing wrong and how I can fix it.