单片机
返回首页

STM32无刷电机控制中滑膜观测器的应用与电机调整指南

2025-09-23 来源:cnblogs

这个教程是针对KY_Motor的无刷电机开发板,滑膜观测器反正切的补充教程,大家比较关注现有的程序如何适配到自己的电机上,因此我们团队推出了如下教程,让大家在学习的过程中有迹可循。

e8132ece6313a863af56c376d2feff27_1dcd1cfaed4f4418bded87e812bb391c.png

开发板链接:开发板

1. 电机电气参数

电机的定子电阻 Rs 和定子电感 Ls 是影响电机控制的重要参数,不同电机的这两个参数可能会有较大差异。需要参考新电机的规格书获取这些参数,并更新到代码中。


积分系数 Ki


  • 文件位置:Userconfig.h 和 Sensorless_SMO.h

  • 修改方法:


// Userconfig.h

#define  Motor_Rs   新电机定子电阻值f  // 根据新电机规格书修改

#define  Motor_Ls   新电机定子电感值f  // 根据新电机规格书修改


// Sensorless_SMO.h

typedef struct{

    float  Rs;                // 定子电阻,更新为新电机的定子电阻

    float  Ls;                // 定子电感,更新为新电机的定子电感

    // 其他参数...

} SMO_Motor;


#define SMO_Motor_DEFAULTS {新电机定子电阻值, 新电机定子电感值, 0.0, 0.0, 0.0, 0, 0, 0.0, 0.0}

2. 电机极对数

电机的极对数 POLES 也会影响电机的控制,不同电机的极对数可能不同。需要根据新电机的规格书更新该参数。

文件位置:Userconfig.h 和 Sensorless_SMO.h

// Userconfig.h

#define  Motor_Pn   新电机极对数  // 根据新电机规格书修改


// Sensorless_SMO.h

typedef struct{

    // 其他参数...

    uint32_t   POLES;         // 电机极对数,更新为新电机的极对数

    // 其他参数...

} SMO_Motor;


#define SMO_Motor_DEFAULTS {0.0, 0.0, 0.0, 0.0, 0.0, 新电机极对数, 0, 0.0, 0.0}

3. 速度设定值

新电机的最大和最小转速可能与原电机不同,需要调整最大速度 MAXSpeed 和最小速度 MinSpeed,以及速度参考函数 SPEEDREF。

文件位置:Userconfig.h

// Userconfig.h 

 #define MAXSpeed 新电机最大转速 // 根据新电机规格书修改

 #define MinSpeed 新电机最小转速 // 根据新电机规格书修改 

 #define SPEEDREF(X) ((MAXSpeed - MinSpeed)/4096.0*X + MinSpeed)

4. 对齐和开环运行电压设定值

电机的对齐和开环运行阶段的电压设定值 UD_Align、UQ_Align、UD_Open 和 UQ_Open 可能需要根据新电机的特性进行调整。

文件位置:Userconfig.h

// Userconfig.h

#define UD_Align               _IQ(新的对齐阶段d轴电压值)  // 根据新电机特性调整

#define UQ_Align               _IQ(新的对齐阶段q轴电压值)  // 根据新电机特性调整

#define UD_Open                _IQ(新的开环运行阶段d轴电压值)  // 根据新电机特性调整

#define UQ_Open                _IQ(新的开环运行阶段q轴电压值)  // 根据新电机特性调整

5. PI 控制器参数

PI 控制器用于控制电机的电流和速度,不同电机的动态特性可能不同,需要调整 PI 控制器的参数 Kp 和 Ki。

文件位置:PI_Controler.c

修改方法:

// PI_Controler.c

void PI_init(void)

{

    /*******d轴电流PI控制器参数**************/

    pi_id.Kp   = _IQ(新的d轴电流Kp值);  // 根据新电机特性调整

    pi_id.Ki   = _IQ(新的d轴电流Ki值);  // 根据新电机特性调整

    // 其他参数...


    /*******q轴电流PI控制器参数**************/

    pi_iq.Kp   = _IQ(新的q轴电流Kp值);  // 根据新电机特性调整

    pi_iq.Ki   = _IQ(新的q轴电流Ki值);  // 根据新电机特性调整

    // 其他参数...


    /*******速度PI控制器参数**************/

    pi_spd.Kp   = _IQ(新的速度Kp值);  // 根据新电机特性调整

    pi_spd.Ki   = _IQ(新的速度Ki值);  // 根据新电机特性调整

    // 其他参数...

}

        更换电机后,需要重点关注电机的电气参数(电阻、电感、极对数)、速度设定值、对齐和开环运行电压设定值以及 PI 控制器参数。在修改参数时,应参考新电机的规格书,确保参数的准确性。同时,在修改程序后,需要进行充分的测试,以确保电机能够正常运行。


电机的对齐和开环运行阶段的电压设定值 UD_Align、UQ_Align、UD_Open 和 UQ_Open 可能需要根据新电机的特性进行调整,那么这几个参数怎么改?


UD_Align、UQ_Align、UD_Open 和 UQ_Open 这些参数在电机的对齐和开环运行阶段起着关键作用,它们分别代表 d 轴和 q 轴的电压设定值。更换电机后,由于新电机的电气特性(如电阻、电感、极对数等)可能与原电机不同,这些参数需要根据新电机的特性进行调整。以下是调整这些参数的详细步骤:


对齐阶段(UD_Align 和 UQ_Align)

UD_Align:d 轴电压主要用于建立电机的磁场。一般来说,可以先将 UD_Align 设置为一个较小的正值,例如 _IQ(0.05) 或 _IQ(0.1)。如果电机在对齐阶段无法正常对齐,可以适当增加 UD_Align 的值。

UQ_Align:q 轴电压用于产生转矩。在对齐阶段,通常希望电机静止,因此可以将 UQ_Align 设置为 0,即 _IQ(0.0)。

开环运行阶段(UD_Open 和 UQ_Open)

UD_Open:在开环运行阶段,d 轴电压通常用于维持电机的磁场。可以根据电机的额定电流和电阻来估算 d 轴电压的大小。一般来说,可以将 UD_Open 设置为一个较小的正值,例如 _IQ(0.0) 或 _IQ(0.05)。

UQ_Open:q 轴电压用于产生转矩,控制电机的转速。可以根据电机的额定功率和转速来估算 q 轴电压的大小。可以从一个较小的电压值开始,逐渐增加 UQ_Open 的值,观察电机的转速变化,直到达到所需的转速。

PI参数调整

PI 控制器用于控制电机的电流和速度,不同电机的动态特性可能不同,需要调整 PI 控制器的参数 Kp 和 Ki 这个参数应该怎么更改

#include 'PI_Controler.h'


/************电流 - 速度控制器初始化**************/


PI_CONTROLLER pi_id = PI_CONTROLLER_DEFAULTS; //d轴电流控制器

PI_CONTROLLER pi_iq = PI_CONTROLLER_DEFAULTS; //q轴电流控制器

PI_CONTROLLER pi_spd = PI_CONTROLLER_DEFAULTS; //速度控制器


void PI_init(void)

{

  /*******d轴电流控制器**************/

  

  pi_id.Kp   = _IQ(新的d轴比例系数值);

  pi_id.Ki   = _IQ(新的d轴积分系数值);

  pi_id.Umax = _IQ(0.4);

  pi_id.Umin = _IQ(-0.4); 

  pi_id.Kslf = _IQ(0.1057073975);   // 低通滤波系数 _IQ(0.1057073975); 

  pi_id.ui = 0;

  pi_id.i1 = 0; 

  

  /*******q轴电流控制器**************/


  pi_iq.Kp   = _IQ(新的q轴比例系数值);

  pi_iq.Ki   = _IQ(新的q轴积分系数值); 

  pi_iq.Umax = _IQ(0.8);

  pi_iq.Umin = _IQ(-0.3);

  pi_iq.Kslf = _IQ(0.1057073975);  // 低通滤波系数 _IQ(0.1057073975); 

  pi_iq.ui = 0;

  pi_iq.i1 = _IQ(0.15); 

  

 /*******速度控制器**************/  

  

   pi_spd.Kp   = _IQ(新的速度比例系数值);

   pi_spd.Ki   = _IQ(新的速度积分系数值); 

   pi_spd.Umax = _IQ(0.65);

   pi_spd.Umin = _IQ(-0.65);

   pi_spd.ui = 0;

   pi_spd.i1 = _IQ(0.15);  

}


  • 具体调整方法

  • 比例系数 Kp
  • 作用:Kp 决定了控制器对误差的响应速度。Kp 值越大,控制器对误差的响应越迅速,系统的动态响应速度越快,但可能会导致系统出现较大的超调甚至不稳定。

  • 调整方法:可以先将 Kp 设置为一个较小的值,例如 _IQ(0.1),然后逐渐增加 Kp 的值,观察电机的响应。如果电机的响应速度较慢,可以适当增加 Kp 的值;如果电机出现超调或不稳定的情况,需要减小 Kp 的值。

  • 作用:Ki 用于消除系统的稳态误差。Ki 值越大,积分作用越强,系统消除稳态误差的速度越快,但可能会导致系统出现积分饱和现象,使系统的动态性能变差。

  • 调整方法:在调整 Ki 之前,需要先将 Kp 调整到一个合适的值。可以先将 Ki 设置为 0,然后逐渐增加 Ki 的值,观察电机的稳态误差。如果电机存在稳态误差,可以适当增加 Ki 的值;如果电机出现积分饱和现象,需要减小 Ki 的值。


  • pi_id.Kslf = _IQ(0.1057073975); // 低通滤波系数 _IQ(0.1057073975); 这个低通滤波参数是怎么确定?

  • 在电机控制中,pi_id.Kslf 这样的低通滤波系数用于对信号进行平滑处理,减少噪声和高频干扰的影响,以提高系统的稳定性和控制精度。确定这个低通滤波系数通常可以采用理论计算、经验取值和实验调整等方法,下面详细介绍:

  • 1. 理论计算方法

    低通滤波器常用一阶惯性环节来表示,其传递函数为:

  •  

    要通过理论计算确定 Kslf,可以按以下步骤进行:

  • 确定时间常数 T:根据电机系统的特性和需要滤除的噪声频率范围来选择合适的时间常数 T。例如,如果需要滤除较高频率的噪声,可以选择较小的 T 值;如果希望对信号的变化响应较慢,可以选择较大的 T 值。

  • 确定采样周期 (T_s):采样周期 (T_s) 由控制系统的硬件和软件决定,通常是固定的。在你的代码中,Control_Ts = 0.000080f 表示采样周期为 (80 mu s)。

  • 计算滤波系数 (alpha):将 T 和 Ts 代入公式 中,计算得到滤波系数 α。

  • 2. 经验取值方法

            在实际应用中,也可以根据经验来选择低通滤波系数。一般来说,滤波系数的取值范围在 0 到 1 之间,取值越大,滤波器对输入信号的响应越快,但对噪声的抑制能力越弱;取值越小,滤波器对噪声的抑制能力越强,但对输入信号的响应越慢。


    以下是一些常见的经验取值范围:

  • 当需要快速响应信号变化时,可以选择较大的滤波系数,例如 0.2 到 0.5。

  • 当需要较强的噪声抑制能力时,可以选择较小的滤波系数,例如 0.05 到 0.2。

  •         代码中,pi_id.Kslf = _IQ(0.1057073975) 就是一个经验取值,这个值相对较小,说明滤波器对噪声的抑制能力较强,但对信号的响应较慢。

            还可以通过仿真的方式获取,方法有很多种,每个人选择的也不同,有人擅长计算,有人经验丰富,有人运气好,随便拿个参数,电机就能运转正常。


进入单片机查看更多内容>>
相关视频
  • 【TI MSPM0 应用实战】智能小车+工业角度编码器+血氧仪+烟雾探测器!硬核参考设计详解!

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

  • 直播回放: Microchip Timberwolf™ 音频处理器在线研讨会

  • 基于灵动MM32W0系列MCU的指夹血氧仪控制及OTA升级应用方案分享

精选电路图
  • 1瓦线性调频增强器

  • 家用电器遥控器

  • 12V 转 28V DC-DC 变换器(基于 LM2585)

  • 红外开关

  • DS1669数字电位器

  • HA1377 桥式放大器 BCL 电容 17W(汽车音频)

    相关电子头条文章