STM32无刷电机控制中滑膜观测器的应用与电机调整指南
2025-09-23 来源:cnblogs
这个教程是针对KY_Motor的无刷电机开发板,滑膜观测器反正切的补充教程,大家比较关注现有的程序如何适配到自己的电机上,因此我们团队推出了如下教程,让大家在学习的过程中有迹可循。

开发板链接:开发板
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 代入公式
中,计算得到滤波系数 α。当需要快速响应信号变化时,可以选择较大的滤波系数,例如 0.2 到 0.5。
当需要较强的噪声抑制能力时,可以选择较小的滤波系数,例如 0.05 到 0.2。
2. 经验取值方法
在实际应用中,也可以根据经验来选择低通滤波系数。一般来说,滤波系数的取值范围在 0 到 1 之间,取值越大,滤波器对输入信号的响应越快,但对噪声的抑制能力越弱;取值越小,滤波器对噪声的抑制能力越强,但对输入信号的响应越慢。
以下是一些常见的经验取值范围:
代码中,pi_id.Kslf = _IQ(0.1057073975) 就是一个经验取值,这个值相对较小,说明滤波器对噪声的抑制能力较强,但对信号的响应较慢。
还可以通过仿真的方式获取,方法有很多种,每个人选择的也不同,有人擅长计算,有人经验丰富,有人运气好,随便拿个参数,电机就能运转正常。
- 意法半导体中国本地造STM32微控制器启动规模量产
- 意法半导体全新STM32C5系列,重新定义入门级微控制器性能与价值,赋能万千智能设备
- 使用 Keil Studio for Visual Studio Code开发 STM32 设备
- 基于机智云与STM32的智能拐杖安全监测系统在养老物联网中的应用
- 内置全栈安全,一站式满足CRA法案与IEC 62443标准——米尔STM32MP257核心板
- 如何用 STM32 FLASH 实现等效 100 万次擦写的 EEPROM 功能?
- 实战解析:通过一个小项目掌握STM32所有外设
- STM32学了两年半,却还是不会做项目
- 意法半导体推出最新STM32MP21微处理器,兼具高性价比、低功耗、高灵活性
- 基于STM32的矿井作业环境监测系统设计与实现
- 六大全新产品系列推出,MCX A微控制器家族迎来创新
- 意法半导体全新STM32C5系列,重新定义入门级微控制器性能与价值,赋能万千智能设备
- 模组复用与整机重测在SRRC、CCC、CTA/NAL认证中的实践操作指南
- 有源晶振与无源晶振的六大区别详解
- 英飞凌持续巩固全球微控制器市场领导地位
- 使用 Keil Studio for Visual Studio Code开发 STM32 设备
- 从控制到系统:TI利用边缘AI重塑嵌入式MCU的边界
- 蓝牙信道探测技术原理与开发套件实践
- Microchip 推出生产就绪型全栈边缘 AI 解决方案,赋能MCU和MPU实现 智能实时决策
- LoRa、LoRaWAN、NB-IoT与4G DTU技术对比及工业无线方案选型分析




