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.

[参考译文] TMS320F28069M:扭矩控制 lab11e

Guru**** 2609955 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/687037/tms320f28069m-torque-controll-lab11e

器件型号:TMS320F28069M

您好、TI、

我尝试在 lab11e 中使用扭矩模式、我更改了以下两个变量:

 

bool gHall_Flag_CurrentCtrl = true;
gIdq_ref_pu.value[1]= IQ_Ref_pu;

 

但是、当我增加 gIdq_ref_pu.value[1]时、没有发生任何情况。
我认识到 gHall_PwmDuty 始终为零。

 

我在以下代码中找到了这一点:

if (gHall_Flag_CurrentCtrl = true)                 //扭矩控制模式

gHall_BLDC_IS _FDB_pu = gAdcData.I. Value[gHall_BLDC_Flag_is_FDB];
gHall_BLDC_IS _ref_pu = speed_pid_out;

 // BLDC 电流环路
PID_run (pidHandle[3]、gHall_BLDC_IS _ref_pu、gHall_BLDC_IS FDB_pu、&gHall_PwmDuty);

HALLBLDC_Ctrl_PwmSet (gHall_PwmState、gHall_PwmDuty);

else                                                                                                                                     //速度控制模式

gHall_PwmDuty = speed_pid_out;
HALLBLDC_Ctrl_PwmSet (gHall_PwmState、gHall_PwmDuty);

 

然后、我将 gHall_PwmDuty 放入扭矩控制中、如下所示:

if (gHall_Flag_CurrentCtrl = true)                 //扭矩控制模式

gHall_BLDC_IS _FDB_pu = gAdcData.I. Value[gHall_BLDC_Flag_is_FDB];
gHall_BLDC_IS _ref_pu = speed_pid_out;

// BLDC 电流环路
PID_run (pidHandle[3]、gHall_BLDC_IS _ref_pu、gHall_BLDC_IS FDB_pu、&gHall_PwmDuty);

gHall_PwmDuty = IQ_Ref_pu;

HALLBLDC_Ctrl_PwmSet (gHall_PwmState、gHall_PwmDuty);

else                                                                                                                                     //速度控制模式

gHall_PwmDuty = speed_pid_out;
HALLBLDC_Ctrl_PwmSet (gHall_PwmState、gHall_PwmDuty);


在这一变化之后,电机开始运转,但它只能以非常低的速度平稳运行,在更高的速度下,它开始振荡和声音严重,我认为它不会变快。
我想我在代码中做了一些错误、因为电流控制在其他实验中工作、而 lab11e 的速度模式也工作。
我不确定要使用扭矩模式必须更改什么。 请帮助。

 

出于好奇、如果我想在 lab5a 或10a 中添加霍尔启动、这会很容易吗?
因为我在 mainISR 中看到了一些差异,我不知道如何处理它。

提前感谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是否要针对包括 BLDC 和 FAST 在内的全速范围实施扭矩控制? 如果是、您可以针对扭矩控制模式执行以下步骤。

    1、按如下方式更改 BLDC 的标志设置。
    bool gHall_Flag_EnableStartup = true;// true->启用霍尔启动
    //bool gHall_Flag_EnableStartup = false;// false ->禁用霍尔启动

    //bool gHall_Flag_CurrentCtrl = false;
    bool gHall_Flag_CurrentCtrl = true;

    2.在项目中添加两个全局变量。
    bool FS_FLAG_enableSpeedCtrl = false;
    //bool FS_FLAG_enableSpeedCtrl = true;
    _IQ FS_IQ_ref_pu =_IQ (0.1);

    3.在 mainISR()中按如下所示修改代码
    //适当时运行 PID 速度控制器
    if (fs_flag_enableSpeedCtrl == true)

    if (pidCntSpeed++>= USER_NUM_CTRL_TICKS_PER_SPEED_TICK)

    //计算 Id 参考平方
    _iq Id_ref_squared_pu =_IQmpy (PID_getRefValue (pidHandle[1])、PID_getRefValue (pidHandle[1]));

    //考虑 IQ^2+ID^2 =为^2
    _iq IQ_Max_pu =_IQsqrt (GIS _Max_squared_pu - ID_ref_squared_pu);

    //清除计数器
    PidCntSpeed = 0;

    //为速度控制器输出设置新的最小值和最大值
    PID_setMinMax (pidHandle[0]、-IQ_Max_pu、IQ_Max_pu);

    //运行速度控制器
    PID_RUN_SPD (pidHandle[0]、TRAJ_getIntValue (trajHandle_SPD)、SPEED_PU、&SPEED_pid_OUT);

    gIdq_ref_pu.value[1]= speed_pid_out;


    其他

    gIdq_ref_pu.value[1]= FS_IQ_ref_pu;


    4.按如下方式修改 HALLBLDC_Ctrl_Run()
    void HALLBLDC_Ctrl_Run (void)

    if (gHall_Flag_EnableStartup = true)

    gHall_PwmState = gHall_PwmIndex[gHall_State];

    if (_IQabs (speed_est_pu)< gHall_speed_FastToBldc_low_pu)//快速至霍尔

    if (gHall_Flag_EnableBldc = false)

    if (gHall_BLDC_cnt > 20)

    gHall_Flag_EnableBldc =真;
    GHall_BLDC_Cnt = 0;

    if (gHall_Flag_CurrentCtrl = true)//扭矩控制模式

    //以下指令加载速度 PI 的参数
    //控制器。
    PID_setGains (pidHandle[0]、_IQ (0.1)、_IQ (0.005)、_IQ (0.0));

    //将积分器输出的初始条件值设置为0
    PID_setUi (pidHandle[3]、_IQmpy (pid[2].UI、gFast2Hall_UI_coef));

    else//速度控制模式

    //以下指令加载速度 PI 的参数
    //控制器。
    PID_setGains (pidHandle[0]、_IQ (0.1)、_IQ (0.005)、_IQ (0.0));

    gHall_PwmDuty = pid[2].UI;

    //将积分器输出的初始条件值设置为0
    PID_setUi (pidHandle[0]、_IQmpy (pid[2].UI、gFast2Hall_SPD_coef));


    其他
    gHall_BLDC_Cnt++;


    否则、如果(_IQabs (gHall_speed_FDB_pu)> gHall_speed_BldcToFast_HIGH_PU)//霍尔转 FAST

    if (gHall_Flag_EnableBldc = true)

    if (gHall_Fast_cnt > 20)

    gHall_Flag_EnableBldc = false;
    gHall_Fast_cnt = 0;

    if (gHall_Flag_CurrentCtrl = true)//扭矩控制

    //以下指令加载速度 PI 的参数
    //控制器。
    PID_setGains (pidHandle[0]、_IQ (2.0)、_IQ (0.02)、_IQ (0.0));

    //将积分器输出的初始条件值设置为0,ID
    PID_setUi (pidHandle[1]、_IQ (0.0));

    //将积分器输出的初始条件值设置为0,Iq
    PID_setUi (pidHandle[2]、_IQmpy (pid[3].UI、gHall2Fast_UI_coef));


    else//速度控制

    //以下指令加载速度 PI 的参数
    //控制器。
    PID_setGains (pidHandle[0]、_IQ (2.0)、_IQ (0.02)、_IQ (0.0));

    //将积分器输出的初始条件值设置为0,速度
    PID_setUi (pidHandle[0]、_IQmpy (gHall_PwmDuty、gHall2Fast_SPD_Coef));

    //将积分器输出的初始条件值设置为0,Iq
    PID_setUi (pidHandle[2]、_IQmpy (gHall_PwmDuty、gHall2Fast_IQ_coef));

    //将积分器输出的初始条件值设置为0,ID
    PID_setUi (pidHandle[1]、_IQmpy (gHall_PwmDuty、_IQ (0.0)));


    PWM_setSockAPulseSrc (hal.pwmHandle[PWM_Number_1]、PWM_SockPulseSrc_EqualCounterZero);

    HAL_enablePwm (halHandle);

    其他
    gHall_Fast_Cnt++;



    if (gHall_Flag_EnableBldc)

    angle_pu = angle_est_pu;
    speed_pu = gHall_speed_FDB_pu;

    if (gHall_Flag_CurrentCtrl = true)//扭矩控制模式

    gHall_BLDC_IS _FDB_pu = gAdcData.I. Value[gHall_BLDC_Flag_is_FDB];

    if (fs_flag_enableSpeedCtrl == true)
    gHall_BLDC_IS _ref_pu = speed_pid_out;
    其他
    gHall_BLDC_IS _ref_pu = FS_IQ_ref_pu;

    // BLDC 电流环路
    PID_run (pidHandle[3]、gHall_BLDC_IS _ref_pu、gHall_BLDC_IS FDB_pu、&gHall_PwmDuty);

    HALLBLDC_Ctrl_PwmSet (gHall_PwmState、gHall_PwmDuty);

    else//速度控制模式

    gHall_PwmDuty = speed_pid_out;
    HALLBLDC_Ctrl_PwmSet (gHall_PwmState、gHall_PwmDuty);


    其他

    angle_pu = angle_est_pu;
    SPED_PU = SPED_EST_PU;


    else//(gHall_Flag_EnableStartup = false)

    angle_pu = angle_est_pu;
    SPED_PU = SPED_EST_PU;


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

    是的、我希望实现全速范围、BLDC 和 FAST 的扭矩控制。
    感谢您提供代码 Yanming。 现在我更清楚了一点。

    我尝试了这些更改、但它不起作用。 gHall_PwmDuty 仍为零。

    下面是观察窗口的图片:

    我发现我的另一件事是、如果我将 outMin 设置为0.1、电机开始旋转、UI 从零变为 outMin 的值。

    下面是观察窗口的图片,其中 outMin 设置为0.1。

     

    我认为 UI 是原因。 还有其他需要改变的地方吗?


    谢谢

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

    pid[3]的 outMax 和 outMin 似乎不正确。 您是否有以下代码将 PID 控制器 pid[3]初始化为其他 pid[0/1/2]。

    PID_setGains (pidHandle[3]、KP_IQ、KI_IQ、_IQ (0.0));
    PID_setMinMax (pidHandle[3]、-maxVoltage_pu、maxVoltage_pu);
    PID_setUi (pidHandle[3]、_IQ (0.0));

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