打印
[电机控制专用MCU]

APM32F035 FOC零基础电机入门调试(四) - 速度环的PI 参数进行调整确认

[复制链接]
141|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

一、了解APM32F035 速度环实现原理

1、了解什么速度环

1.1 基本概念

速度环是 FOC 控制中的中间环。它以电机的实际速度反馈为基础,与给定的速度指令进行比较,通过 PID(比例 - 积分 - 微分)调节算法,输出一个控制量,这个控制量通常作为电流环的设定值,进而通过电流环去控制电机的转矩,最终实现对电机速度的精确调节。

1.2 工作原理

  • 速度反馈获取:通常依靠安装在电机上的编码器来获取电机的实际速度信息。编码器会输出与电机转速相关的脉冲信号,通过对这些脉冲信号进行计数和处理,可以计算出电机的实时转速。
  • 速度误差计算:将获取到的电机实际速度与用户设定的目标速度进行比较,得出速度误差值。例如,目标速度为 1000 转 / 分钟,而电机实际转速为 950 转 / 分钟,则速度误差为 50 转 / 分钟。
  • PID 调节:根据速度误差,利用 PID 算法进行调节。比例环节(P)根据速度误差的大小,成比例地输出一个调节量,使电机速度朝着减小误差的方向变化;积分环节(I)对速度误差进行积分,主要用于消除系统的稳态误差,使电机最终能够稳定在目标速度上;微分环节(D)根据速度误差的变化率,提前对电机的速度变化趋势进行预测和调整,以改善系统的动态响应性能。
  • 输出至电流环:经过 PID 调节后得到的输出值,作为电流环的参考输入,用于控制电机的电流,进而产生相应的转矩,驱动电机达到目标速度125。

1.3 作用与意义

  • 速度控制精度:使电机能够按照设定的速度准确运行,在不同的负载条件下,都能将电机速度稳定在目标值附近,满足各种应用场景对速度精度的要求。
  • 动态响应性能:在电机启动、停止、加速、减速以及负载突变等动态过程中,速度环能够快速调整电机的输出转矩,使电机的速度能够快速跟随目标速度的变化,具有良好的动态响应特性。
  • 系统稳定性增强:通过不断地反馈和调节,速度环可以有效地抑制各种干扰因素对电机速度的影响,如电网电压波动、负载变化等,使电机运行更加稳定可靠。

1.4 与其他控制环的关系

在 FOC 控制中,通常还存在电流环和位置环。电流环是最内环,主要用于控制电机的转矩,速度环的输出作为电流环的设定值,通过控制电流来间接控制电机速度。位置环是最外环,当需要对电机的位置进行精确控制时,位置环根据目标位置与实际位置的误差,输出一个速度指令给速度环,由速度环和电流环共同作用,使电机到达目标位置。

2、035 FOC例程速度环是如何实现的

由于部分代码未开放,我们仅能够看到,035电机代码速度环主要依靠慢环实现,而慢环的状态切换主要依靠在main函数的While(1)中实现状态切换的。 image.png

慢环的整体状态和快环是一样的,主状态分为INIT 、STOP 、FAULT 、RUN这四种

image.png

同时在Run下面分为五个子状态:run-calib 、run-ready 、run-align 、run-spin 、run-freewheel

image.png

在Stop状态我们可以看到,首先通过define判断我们是使用旋钮控制转速还是软件下发调速,获取到当前电机运行速率,接下来判断电机是否处于错误状态,同时判断电机是否大于RUN的速度,如果是则切入RUN状态。

/*!
 * [@brief](home.php?mod=space&uid=247401) Stop state routine called in slow state machine
 *
 * @param void  No input parameter
 *
 * [@return](home.php?mod=space&uid=266161) None
 */
static void M1_Stop_Slow(void)
{
#if SPD_SOFT_OR_KNOB
    Motor_type.Foc.s16SpdCmd = vsp_2_rpm(Motor_type.User.s16Vsp);
#else
    Motor_type.Foc.s16SpdCmd = Motor_type.User.s16SoftwareSpdCmd;
#endif
    /* Get the speed command*/
    /* If a fault occurred */
    if(!Motor_type.User.u16_Fault**)
    {
      if(abs(Motor_type.Foc.s16SpdCmd) > STOP_TO_RUN_SPEED)
      {
          /* Switch from Stop to Run state*/
          M1_SwitchStopRun();
      }
    }
}

在RUN状态我们可以看到,统一首先通过define判断我们是使用旋钮控制转速还是软件下发调速,获取到当前电机运行速率,然后运行Run状态下的子状态

/*!
 * @brief Run state routine called in slow state machine
 *
 * @param void  No input parameter
 *
 * @return None
 */
static void M1_Run_Slow(void)
{
#if SPD_SOFT_OR_KNOB
    Motor_type.Foc.s16SpdCmd = vsp_2_rpm(Motor_type.User.s16Vsp);
#else
    Motor_type.Foc.s16SpdCmd = Motor_type.User.s16SoftwareSpdCmd;
#endif

    /* Run sub-state function */
    s_M1_STATE_RUN_TABLE_SLOW[eM1_RunSubState]();

}

此处是速度环控制核心,也是读取电机速度,通过PI调节电机速度,同时设置相应Q轴电流。

static void M1_RunSpinSlow(void)
{
    Motor_type.Foc.stc_IdqCmd.s16q15_D = 0;
    /*  speed ramp      */
    Motor_type.Foc.s16SpeedRamp = ramp_s16(Motor_type.Foc.s16SpdCmd,&stc_SpdRamp);
    Motor_type.stc_HallPara.u32q5_FreqFilt = (Motor_type.stc_HallPara.u32q5_FreqFilt * 32300 + Motor_type.stc_HallPara.u32q5_Freq *468) >>15;
    Motor_type.Foc.s16q15_SpdObs = Motor_type.stc_HallPara.u32q5_FreqFilt * SPEEDX >> 5;
    if(SQUARE_CTRL == Motor_type.stc_HallPara.u8_CtrlMode)
    {
        Motor_type.Foc.s16q15_SpdObs = 0 ;
    }
    Motor_type.Foc.s16SpdFilt = Motor_type.Foc.s16q15_SpdObs;
    /*  pi for speed    */
    Motor_type.stc_SpdPi.s16_Error = Motor_type.Foc.s16SpeedRamp - Motor_type.Foc.s16SpdFilt;
    anti_pi_q15(&(Motor_type.stc_SpdPi));

    /*  set Id/q command    */
    Motor_type.Foc.stc_IdqCmd.s16q15_Q = Motor_type.stc_SpdPi.s32_Out;

    if((abs(Motor_type.Foc.s16SpdCmd) < Motor_type.User.u16FreeWheelSpdCmd) && (abs(Motor_type.Foc.s16SpdFilt) < Motor_type.User.u16FreeWheelSpdCmd) )
    {                                          
        M1_SwitchRunSpinFreewheel();
    }
}

二、035有感FOC例程如何进行速度PI调整

先调节Kp 再加入Ki,数值从小到大进行调试验证,通过观测实际输出Iq CMD 的稳定趋势、给定的斜坡转速spd ramp 与实际转速spd_ filt 的跟随曲线进行判断参数的合理性。主要调整以下参数:

image.png

image.png

同时可以观察电流波形或者参数波形如下所示:

image.png

三、总结

结合前几篇内容,至此电流环的PI、速度环PI、霍尔角度校准基本已经初步调好,电机可以正常转起来。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

12

帖子

0

粉丝