This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/TMS320F28069M:2个电机无法同时运行,μ A、但可以单独运行

Guru**** 2561900 points
Other Parts Discussed in Thread: MOTORWARE

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/783044/ccs-tms320f28069m-2motor-can-not-simultaneously-run-but-can-alone-run

器件型号:TMS320F28069M
主题中讨论的其他器件:MOTORWARE

工具/软件:Code Composer Studio

我的项目从  motorWare proj-13e 更改为  2电机控制。 每个 电机 可以    单独运行,但  不能同时运行 。先运行电机1 正常,然后运行电机2,

 当 !!!(以下程序时开始,非常大的电流,实现40A #define USER_MOTOR_MAX_CURRENT      (20.0))

//如果我们强制对齐、使用 Rs 重新计算、将 eQEP 角度与转子角度对齐

if ((EST_getState (obj->estHandle)=EST_State_Rs)&&(USER_MOTOR_TYPE =MOTOR_Type_Pm))

ENC_setZeroOffset (encHandle[HAL_MTR1]、(uint32_t)(HAL_getQepPosnMaximum (halHandle、HAL_MTR1)- HAL_getQepPosnCounts (halHandle、HAL_MTR1)));

for (;;)

//等待使能系统标志被置位
while (!(gMotorVars[motorNum].Flag_enableSys));

//可以显示库内部 PI。 IQ 现在没有基准
if (gMotorVars[HAL_MTR1].Flag_enableUserParams == false)

CTRL_setFlag_enableSpeedCtrl (ctrlHandle[HAL_MTR1]、true);

其他

CTRL_setFlag_enableSpeedCtrl (ctrlHandle[HAL_MTR1]、false);

if (gMotorVars[HAL_MTR2].Flag_enableUserParams == false)

CTRL_setFlag_enableSpeedCtrl (ctrlHandle[HAL_MTR2]、true);

其他

CTRL_setFlag_enableSpeedCtrl (ctrlHandle[HAL_MTR2]、false);

//循环、同时使能系统标志为 true
while (gMotorVars[motorNum].Flag_enableSys)

for (motorNum=HAL_MTR1;motorNum<=HAL_MTR2;motorNum++)

CTRL_Obj * obj =(CTRL_Obj *) ctrlHandle[motorNum];
ST_Obj * stObj =(ST_Obj *) stHandle[motorNum];


//递增计数器
gCounter_updateGlobals[motorNum]++;

//启用/禁用使用从 user.h 加载的电机参数
CTRL_setFlag_enableUserMotorParams (ctrlHandle[motorNum]、gMotorVars[motorNum].Flag_enableUserParams);

//启用/禁用电机启动期间的 Rs 重校准
EST_setFlag_enableRsRecalc (obj->estHandle、gMotorVars[motorNum].Flag_enableRsRecalc);

//启用/禁用偏置值的自动计算
CTRL_setFlag_enableOffset (ctrlHandle[motorNum]、gMotorVars[motorNum].Flag_enableOffsetcalc);


if (CTRL_ISERROR (ctrlHandle[motorNum]))

//将使能控制器标志设置为 false
CTRL_setFlag_enableCtrl (ctrlHandle[motorNum]、false);

//将使能系统标志设置为 false
gMotorVars[motorNum].Flag_enableSys = false;

//禁用 PWM
HAL_disablePwm (halHandle、motorNum);

其他

//更新控制器状态
bool flag_ctrlStateChanged = CTRL_updateState (ctrlHandle[motorNum]);

//启用或禁用控件
CTRL_setFlag_enableCtrl (ctrlHandle[motorNum]、gMotorVars[motorNum].Flag_Run_Identify);

if (flag_ctrlStateChanged)

CTRL_State_e ctrlState = CTRL_getState (ctrlHandle[motorNum]);

if (ctrlState = CTRL_State_OffLine)

//启用 PWM
HAL_enablePwm (halHandle、motorNum);


否则、如果(ctrlState = CTRL_State_OnLine)

if (gMotorVars[motorNum].Flag_enableOffsetcalc == true)

//更新 ADC 偏置值
HAL_updateAdcBias (halHandle、motorNum);

其他

//设置电流偏置
HAL_setBias (halHandle、HAL_SensorType_Current、0、_IQ (I_A_offset)、motorNum);
HAL_setBias (halHandle、HAL_SensorType_Current、1、_IQ (I_B_OFFSET)、motorNum);
HAL_setBias (halHandle、HAL_SensorType_Current、2、_IQ (I_C_OFFSET)、motorNum);

//设置电压偏置
HAL_setBias (halHandle、HAL_SensorType_Voltage、0、_IQ (V_A_offset)、motorNum);
HAL_setBias (halHandle、HAL_SensorType_Voltage、1、_IQ (V_B_OFFSET)、motorNum);
HAL_setBias (halHandle、HAL_SensorType_Voltage、2、_IQ (V_C_offset)、motorNum);

//返回电流的偏置值
gMotorVars[motorNum].I_BIAS.value[0]= HAL_getBias (halHandle、HAL_SensorType_Current、0、motorNum);
gMotorVars[motorNum].I_BIAS.value[1]= HAL_getBias (halHandle、HAL_SensorType_Current、1、motorNum);
gMotorVars[motorNum].I_BIAS.value[2]= HAL_getBias (halHandle、HAL_SensorType_Current、2、motorNum);

//返回电压的偏置值
gMotorVars[motorNum].V_BIAS.value[0]= HAL_getBias (halHandle、HAL_SensorType_Voltage、0、motorNum);
gMotorVars[motorNum].V_BIAS.Value[1]= HAL_getBias (halHandle、HAL_SensorType_Voltage、1、motorNum);
gMotorVars[motorNum].V_BIAS.value[2]= HAL_getBias (halHandle、HAL_SensorType_Voltage、2、motorNum);

//启用 PWM
HAL_enablePwm (halHandle、motorNum);

否则、如果(ctrlState = CTRL_State_Idle)

//禁用 PWM
HAL_disablePwm (halHandle、motorNum);
gMotorVars[motorNum].Flag_Run_Identify = false;

if ((CTRL_getFlag_enableUserMotorParams (ctrlHandle[motorNum])=true)&&
(ctrlState > CTRL_State_Idle)&&
(gMotorVars[motorNum].CtrlVersion.Minor == 6))

//调用此函数来修复1p6
USER_softwareUpdate1p6 (ctrlHandle[motorNum]);



if (EST_isMotorIdentified (obj->estHandle))

//设置电流斜坡
EST_setMaxCurrentSlope _pu (obj->estHandle、gMaxCurrentSlope [motorNum]);
gMotorVars[motorNum].Flag_MotorIdentified = true;

//设置速度参考
CTRL_setSpd_ref_krpm (ctrlHandle[motorNum]、gMotorVars[motorNum].SpeedRef_krpm);

//设置速度加速度
CTRL_setMaxAccel_pu (ctrlHandle[motorNum]、_IQmpy (MAX_ACCEL_KRPMPS_SF、gMotorVars[motorNum].MaxAccel_krpmps));

//启用 SpinTAC 速度控制器


if (ctrlMode[motorNum]== speed)

STVELCTL_setEnable (stObj->velCtlHandle、true);
STPOSCTL_setEnable (stObj->posCtlHandle、false);

其他

STVELCTL_setEnable (stObj->velCtlHandle、false);
STPOSCTL_setEnable (stObj->posCtlHandle、true);


if (EST_getState (obj->estHandle)!= EST_State_OnLine)

//如果估算器未运行,请将 SpinTAC 置于复位状态
STVELCTL_setEnable (stObj->velCtlHandle、false);
STPOSCTL_setEnable (stObj->posCtlHandle、false);
//如果电机未运行、则将位置反馈馈入 SpinTAC 位置移动
STPOSMOVE_setPositionStart_mrev (stObj->posMoveHandle、STPOSCONV_getPosition_mrev (stObj->posConvHandle));

if (Flag_Locker_SoftwareUpdate[motorNum])

Flag_Locker_SoftwareUpdate[motorNum]= false;

USER_calcPIGains (ctrlHandle[motorNum]);

//使用预计算值初始化监视窗口 Kp 和 Ki 电流值
gMotorVars[motorNum].KP_idq = CTRL_getKp (ctrlHandle[motorNum]、CTRL_Type_PID_ID);
gMotorVars[motorNum].KI_Idq = CTRL_getKi (ctrlHandle[motorNum]、CTRL_Type_PID_ID);


gMotorVars[motorNum].KP_SPD = CTRL_getKp (ctrlHandle[motorNum]、CTRL_Type_PID_SPD);
gMotorVars[motorNum].KI_SPD = CTRL_getKi (ctrlHandle[motorNum]、CTRL_Type_PID_SPD);

//初始化 GoalSpeed 和 TorqueRampTime 的值
gMotorVars[motorNum].SpinTAC.VelIdGoalSpeed_KRPM =_IQmpy (STVELID_getGoalSpeed (stObj->velIdHandle)、_IQ (ST_SPEED_KRPM _PER_pu));
gMotorVars[motorNum].SpinTAC.VelIdTorqueRampTime_sec = STVELID_getTorqueRampTime_sec (stObj->velIdHandle);
STVELID_setSensorlessFeedback (stObj->velIdHandle、false);


//使用默认值初始化观察窗口 BW 值
gMotorVars[motorNum].SpinTAC.VelCtlBw_radps = STVELCTL_getBandwidth _radps (stObj->velCtlHandle);
//使用最大和最小 Iq 基准初始化监视窗口
gMotorVars[motorNum].SpinTAC.VelCtlOutputMax_A =_IQmpy (STVELCTL_getOutputMaximum (stObj->velCtlHandle)、_IQ (USER_IQ_FULL_SCALE_CURRENT_A));
gMotorVars[motorNum].SpinTAC.VelCtlOutputMin_A =_IQmpy (STVELCTL_getOutputMinimum (stObj->velCtlHandle)、_IQ (USER_IQ_FULL_SCALE_CURRENT_A));


gMotorVars[motorNum].SpinTAC.PosCtlBw_radps = STPOSCTL_getBandwidth _radps (stObj->posCtlHandle);
//使用最大和最小 Iq 基准初始化监视窗口
gMotorVars[motorNum].SpinTAC.PosCtlOutputMax_A =_IQmpy (STPOSCTL_getOutputMaximum (stObj->posCtlHandle)、_IQ (USER_IQ_FULL_SCALE_CURRENT_A));
gMotorVars[motorNum].SpinTAC.PosCtlOutputMin_A =_IQmpy (STPOSCTL_getOutputMinimum (stObj->posCtlHandle)、_IQ (USER_IQ_FULL_SCALE_CURRENT_A));



其他

Flag_Locker_SoftwareUpdate[motorNum]= true;

//估算器设置识别期间的最大电流斜率
gMaxCurrentSlope [motorNum]= EST_getMaxCurrentSlope _pu (obj->estHandle);


//适当时,更新全局变量
if (gCounter_updateGlobals[motorNum]>= NUM_MAIN_TICKS_for_global_variable_update)

//重置计数器
gCounter_updateGlobals[motorNum]= 0;

updateGlobalVariables_motor (ctrlHandle[motorNum]、stHandle[motorNum]、motorNum);

if (gMotorVars[motorNum].Flag_enableUserParams == true)

//更新 Kp 和 Ki 增益
updateKpKiGains (ctrlHandle[motorNum]、motorNum);

其他

if (CTRL_getMotorType (ctrlHandle[motorNum])== MOTOR_Type_Induction)

//重新计算 Kp 和 Ki 增益以将 R/L 限制2000.0和 Kp 限制修正为0.11
recalcKpKi (ctrlHandle[motorNum]);

//在识别感应电机时将电频率限制设置为零
setFeLimitZero (ctrlHandle[motorNum]);

//计算 ACIM 电机的 Dir_qFmt
ACIM_Dir_qFmtCalc (ctrlHandle[motorNum]);

其他

//重新计算 Kp 和 Ki 增益以将 R/L 限制2000.0和 Kp 限制修正为0.11
//并根据估算器状态重新计算增益以允许低电感 PMSM 为 id
recalcKpKiPmsm (ctrlHandle[motorNum]);

//计算 LS qFmt、使其电感比 LHF 小10倍
CTRL_calcMax_Ls_qFmt (ctrlHandle[motorNum]、&GMAX_LS_qFmt);

GLS_pu = EST_getLs_d_pu (obj->estHandle);
GLS_qFmt = EST_getLs_qFmt (obj->estHandle);

//更新 Kp 和 Ki 增益
// updateKpKiGains (ctrlHandle[motorNum],motorNum);

//设置 SpinTAC (ST)带宽范围
STVELCTL_setBandwidth_radps (stObj->velCtlHandle、gMotorVars[motorNum].SpinTAC.VelCtlBw_radps);

//设置 IQ 参考的最大值和最小值
STVELCTL_setOutputMaxums (stObj->velCtlHandle、_IQmpy (gMotorVars[motorNum].SpinTAC.VelCtlOutputMax_A、_IQ (1.0/USER_IQ_FULL_SCALE_CURRENT_A))、_IQmpy (gMotorVars[num].SpinTAC、_MPLE_VR_1.0);_MOTORA 满量程


STPOSCTL_setBandwidth_radps (stObj->posCtlHandle、gMotorVars[motorNum].SpinTAC.PosCtlBw_radps);

//设置 IQ 参考的最大值和最小值
STPOSCTL_setOutputMaxums (stObj->posCtlHandle、_IQmpy (gMotorVars[motorNum].SpinTAC.PosCtlOutputMax_A、_IQ (1.0/USER_IQ_FULL_SCALE_CURRENT_A))、_IQmpy (gMotorVars[motorNum].SpinTAC._A、_IQ_FULL_A);_IQMattle_A (gMODULL_LE_A)

//启用/禁用强制角
EST_setFlag_enableForceAngle (obj->estHandle、gMotorVars[motorNum].Flag_enableForceAngle);

//启用或禁用电源扭曲
CTRL_setFlag_enablePowerWarp (ctrlHandle[motorNum]、gMotorVars[motorNum].Flag_enablePowerWarp);

}//结束 for (motorNum=HAL_MTR1;motorNum<=HAL_MTR2;motorNum++)循环


}// while 结束(gFlag_enableSys)循环


//禁用 PWM
HAL_disablePwm (halHandle、HAL_MTR1);
HAL_disablePwm (halHandle、HAL_MTR2);

//设置默认控制器参数(重置控件以重新识别电机)
CTRL_setParams (ctrlHandle[HAL_MTR1]、&gUserParams[HAL_MTR1]);
CTRL_setParams (ctrlHandle[HAL_MTR2]、&gUserParams[HAL_MTR2]);
gMotorVars[HAL_MTR1].Flag_Run_Identify = false;
gMotorVars[HAL_MTR2].Flag_Run_Identify = false;

//设置 SpinTAC 组件


ST_setupPosConv (stHandle[HAL_MTR1]);
ST_setupVelId (stHandle[HAL_MTR1]);
ST_setupVelCtl (stHandle[HAL_MTR1]);
ST_setupPosCtl (stHandle[HAL_MTR1]);
ST_setupPosMove (stHandle[HAL_MTR1]);
gMotorVars[HAL_MTR1].MaxVel_KRPM = 0;

ST_setupPosConv (stHandle[HAL_MTR2]);
ST_setupVelId (stHandle[HAL_MTR2]);
ST_setupVelCtl (stHandle[HAL_MTR2]);
ST_setupPosCtl (stHandle[HAL_MTR2]);
ST_setupPosMove (stHandle[HAL_MTR2]);
gMotorVars[HAL_MTR2].MaxVel_KRPM = 0;

}// for (;)循环结束

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请检查 PWM 和 ISR 频率是否过高、因此没有足够的 CPU 周期来同时运行双电机。 您可能会先尝试降低 ISR 频率以查看发生的情况。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    CPU   频率90m  


    UINT_least8_t estNumber[2]={0、1};
    uint_least8_t ctrlNumber[2]={0、1};

    这种  ?是正确的、也不是0 Ω

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您可以参阅 lab10d 或 lab13f 中的配置、这两个实验是双电机控制示例、请尝试使用较低的 PWM 频率(ISR 频率)(<10kHz)进行双电机控制。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    ISR 频率=5k
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    对于双电机应该是这样的、如果您使用的是 instaSPIN-MOTION、请参阅 lab13f。