本帖最后由 a976209770 于 2024-12-27 20:08 编辑
1. FOC算法模块概述
FOC(无传感器磁场定向控制)是一种高效的电机控制方法,它通过直接控制电机的磁场方向来实现高精度的转速和位置控制。在 APM32M3514 电机控制系统中,FOC算法结合了电流环、速度环、以及SVPWM(空间矢量脉宽调制)技术,从而实现对电机的精确控制。
1.1 关键功能- 电流环控制:确保电机输出的力矩与电流成正比。
- 速度环控制:控制电机的转速,通过调整电流命令值来实现目标速度。
- SVPWM调制:通过生成合适的PWM信号来控制逆变器,从而实现对电机相电流的精确控制。
2. FOC算法模块的文件结构
2.1 关键文件
- MOTOR_CONTROL/FOC_Ctrl.c:
- 该文件实现了FOC算法的核心功能,包括电流环控制、速度环控制、SVPWM调制等。
- 文件中包括了 PI控制器 的实现和 空间矢量脉宽调制(SVPWM) 的生成函数。
- MOTOR_CONTROL/inc/FOC_Ctrl.h:
- 该头文件声明了FOC算法所需要的函数原型。
- 包含电流环、速度环控制的函数声明,及SVPWM函数的声明。
3. 电流环和速度环控制的实现
3.1 电流环控制
电流环控制是FOC算法的核心部分,电流环的作用是调节电机的转矩。通过测量电机的电流并与参考电流进行比较,PI控制器将调整电流命令,以确保电机产生正确的转矩。
在 FOC_Ctrl.c 中,电流环的实现代码如下:void current_ctrl(Motor_TypeDef *Motor)
{
clarke(&Motor->Foc.stc_Iuvw, &Motor->Foc.stc_Iab); // Clarke 变换
park(&Motor->Foc.stc_Iab, &Motor->Foc.stc_SinCos, &Motor->Foc.stc_Idq); // Park 变换
/* PI 控制器用于 D 轴电流 */
Motor->stc_IdPi.s16_Error = Motor->Foc.stc_IdqCmd.s16q15_D - Motor->Foc.stc_Idq.s16q15_D;
anti_pi(&Motor->stc_IdPi);
Motor->Foc.stc_Vdq.s16q15_D = Motor->stc_IdPi.s32_Out;
/* 限制 Vq 的最大值 */
uint32_t u32_Temp;
int16_t s16q15Vmax = Motor->Foc.s16Vbus * 18918 >> 15; // Vmax = Vbus / sqrt(3)
u32_Temp = s16q15Vmax * s16q15Vmax
- Motor->Foc.stc_Vdq.s16q15_D * Motor->Foc.stc_Vdq.s16q15_D;
Motor->stc_IqPi.s32_Umax = isqrt32(u32_Temp);
Motor->stc_IqPi.s32_Umin = -Motor->stc_IqPi.s32_Umax;
/* PI 控制器用于 Q 轴电流 */
Motor->stc_IqPi.s16_Error = Motor->Foc.stc_IdqCmd.s16q15_Q - Motor->Foc.stc_Idq.s16q15_Q;
anti_pi(&Motor->stc_IqPi);
Motor->Foc.stc_Vdq.s16q15_Q = Motor->stc_IqPi.s32_Out;
/* 逆 Park 变换 */
inv_park(&Motor->Foc.stc_Vdq, &Motor->Foc.stc_SinCos, &Motor->Foc.stc_Vab);
}
电流环控制流程- 误差计算:计算实际电流与目标电流(IqRef 和 IdRef)之间的差值。
- PI控制:使用PI控制器对误差进行调节,输出控制量(Iq_control 和 Id_control)。
- 电流命令输出:根据PI控制器的输出,调整电流参考值,控制逆变器的PWM输出。
PI控制器PI控制器通过调节比例(P)和积分(I)参数,确保电流误差最小化。PI控制器的计算代码如下:
Motor->stc_IdPi.s16_Error = Motor->Foc.stc_IdqCmd.s16q15_D - Motor->Foc.stc_Idq.s16q15_D;
anti_pi(&Motor->stc_IdPi);
Motor->Foc.stc_Vdq.s16q15_D = Motor->stc_IdPi.s32_Out;
Motor->stc_IqPi.s16_Error = Motor->Foc.stc_IdqCmd.s16q15_Q - Motor->Foc.stc_Idq.s16q15_Q;
anti_pi(&Motor->stc_IqPi);
Motor->Foc.stc_Vdq.s16q15_Q = Motor->stc_IqPi.s32_Out;
Kp 和 Ki 为比例和积分增益,控制器根据误差调整电流输出。
3.2 速度环控制
速度环控制是FOC算法的另一重要组成部分,其作用是控制电机的转速,确保电机运行在目标速度下。
速度环控制实现的核心思想是:根据目标速度(s16SpdCmd)和实际速度(s16SpeedActual)之间的误差,调整电流(IqRef)来调节电机的转速。
在 FOC_Ctrl.c 中,速度环的实现代码如下:
static void M1_RunSpinSlow(void)
{
Motor_type.Foc.u16q15VdqSqrt = isqrt32((uint32_t)(Motor_type.Foc.stc_Vdq.s16q15_D * Motor_type.Foc.stc_Vdq.s16q15_D + Motor_type.Foc.stc_Vdq.s16q15_Q * Motor_type.Foc.stc_Vdq.s16q15_Q));
Motor_type.Foc.s16SpeedRamp = ramp_s16(Motor_type.Foc.s16SpdCmd,&stc_SpdRamp);
/* low pass filter for speed, Fc : 200Hz*/
Motor_type.Foc.s16SpdFilt = (Motor_type.Foc.s16SpdFilt*14521 + Motor_type.stc_SmoPara.s16q15SpdObs*18247) >> 15;
/* pi for speed */
Motor_type.stc_SpdPi.s16_Error = Motor_type.Foc.s16SpeedRamp - Motor_type.Foc.s16SpdFilt;
anti_pi(&(Motor_type.stc_SpdPi));
/* set Id/q command */
Motor_type.Foc.stc_IdqCmd.s16q15_Q = Motor_type.stc_SpdPi.s32_Out;
Motor_type.Foc.stc_IdqCmd.s16q15_D = 0;
if((abs(Motor_type.Foc.s16SpeedRamp)<Motor_type.User.u16FreeWheelSpdCmd) && (abs(Motor_type.Foc.s16SpdCmd)<Motor_type.User.u16FreeWheelSpdCmd))
{
M1_SwitchRunSpinFreewheel();
}
}
速度环控制流程- 误差计算:计算目标速度与实际速度之间的差值。
- PI控制:通过PI控制器调节速度误差,输出电流参考(IqRef),用于电流环控制。
4. SVPWM(空间矢量脉宽调制)生成逻辑
SVPWM 是一种高效的调制方法,用于控制逆变器输出的三相电压,从而控制电机的转矩和速度。SVPWM 通过选择合适的矢量组合,实现逆变器的PWM信号生成,从而控制电机的相电流。
4.1 SVPWM生成代码
在控制中,SVPWM的实现的部分代码如下:
void PWM_CompareConfig(uint16_t usCmpA,uint16_t usCmpB,uint16_t usCmpC)
{
PWM_CMPR1 = usCmpA;//A相比较值点
PWM_CMPR2 = usCmpB;//B相比较值点
PWM_CMPR3 = usCmpC;//C相比较值点
PWM_CMPR1_CC1C = usCmpA;//A相比较值点
PWM_CMPR2_CC2C = usCmpB;//B相比较值点
PWM_CMPR3_CC3C = usCmpC;//C相比较值点
}
SVPWM生成流程- 计算电压矢量:根据电流命令值(Iq_control 和 Id_control)以及转子角度(Theta),计算空间矢量的V_alpha和V_beta分量。
- 计算PWM占空比:根据电压矢量分量计算PWM占空比,最终生成三相电机驱动的PWM信号。
5. 参考速度(s16SpdCmd)的作用
参考速度 s16SpdCmd 是系统输入的重要参数,表示用户期望的电机转速。通过速度环控制,s16SpdCmd 和实际速度之间的误差被PI控制器调节,生成电流参考(IqRef)。电流参考进一步影响电机的力矩输出。
5.1 参考速度与电流控制的关系
// 更新电流参考
IqRef = speed_control; // 速度环输出影响电流参考值
功能说明:
- 目标速度 s16SpdCmd 影响 IqRef 的值,最终通过电流控制系统调节电机的转矩。
6. FOC控制算法的整体流程
整个 FOC 控制过程由多个环节和函数协同工作,包含坐标变换、电流控制、速度控制、以及PWM生成。以下是整个算法的整体流程:
流程图详细描述- 开始:
- 读取电流反馈(Iu, Iv, Iw):
- Clarke变换(Iu, Iv 到 Ialpha, Ibeta):
- Clarke变换将三相电流(Iu, Iv, Iw)转换为 α-β 轴电流(Ialpha, Ibeta)。
- 变换公式:Ialpha=IuIbeta=(Iu+2∗Iv)/√3Ialpha = IuIbeta = (Iu + 2 * Iv) / √3
- Park变换(Ialpha, Ibeta 到 Id, Iq):
- 使用 Park 变换将 α-β 电流转换到 d-q 轴电流(Id, Iq)。
- 变换公式:Id=Ialpha∗cos(θ)+Ibeta∗sin(θ)Iq=−Ialpha∗sin(θ)+Ibeta∗cos(θ)Id = Ialpha * cos(θ) + Ibeta * sin(θ)Iq = -Ialpha * sin(θ) + Ibeta * cos(θ)
- 电流环控制 PI:
- 对 Id 和 Iq 进行 PI 控制,确保电机的转矩和磁场方向精确控制。
- PI 控制函数会计算出新的电流控制命令。
- 速度环控制 PI:
- 计算目标速度 s16SpdCmd 与实际速度 s16SpeedActual 之间的误差,采用 PI 控制调节速度。
- 输出控制信号作为电流参考 IqRef。
- 计算电流参考 IqRef:
- 根据速度环的输出结果调节 IqRef,调整电流参考,以实现目标转速。
- 滑模观测器估算转子角度和速度:
- 使用滑模观测器或其他无传感器方法估算转子的位置和速度。
- 结合电流和电压的反馈信息估算转子位置 (Theta) 和转速 (Speed)。
- 计算电压矢量 Vd, Vq:
- 根据电流参考 IqRef 和 IdRef 计算电机的电压矢量 Vd 和 Vq,这将用来控制逆变器的输出。
- SVPWM生成:
- 使用 SVPWM(空间矢量脉宽调制)生成逆变器控制的PWM信号,控制电机的相电流。
- 通过逆变器调整电机相电压,从而实现对电机转速和转矩的控制。
- 计算PWM占空比:
- 根据 Vd 和 Vq 计算电压矢量的占空比,调节PWM信号。
- 生成PWM信号:
- 生成适用于逆变器的PWM信号,调整逆变器的开关状态。
- 控制逆变器输出三相电压:
- 驱动电机:
- 监测电机状态:
- 系统实时监测电机的运行状态,确保电机在正常工况下运行。
- 状态切换判断:
- 如果检测到停止命令或错误(如过流、过压等),则切换电机的状态。
- 如果没有错误或停止命令,则继续运行。
- 切换到新状态:
- 当发生故障或需要停机时,系统会切换到适当的状态,如 RunState_Freewheel(空转状态)或 RunState_Stop(停止状态)。
- 继续控制电机:
- 如果没有发生状态切换,则系统继续按照FOC算法控制电机。
7. 总结
在本篇文章中,详细介绍了 APM32M3514 中 FOC控制算法 模块的实现,包括电流环控制、速度环控制、SVPWM生成和转子角度估算。通过结合实际代码和流程图,可以更清晰地理解 FOC 算法的工作原理及其实现过程。
FOC 算法的成功实现依赖于多个关键环节的协调工作,包括坐标变换、电流调节、速度控制、转子角度估算和PWM调制等。通过这些步骤,系统能够精确控制电机的转速和转矩。
|