一、了解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)中实现状态切换的。

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

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

在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 的跟随曲线进行判断参数的合理性。主要调整以下参数:


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

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