FOC-滑膜控制器SMC/滑膜观测器SMO

news/2025/2/11 20:49:33/

目录

前面

滑膜速度控制器

控制器所处位置

理论设计

模型搭建

滑膜观测器

基本原理

反正切函数

锁相环

滑膜观测器模型(反正切)

滑膜观测器C代码实现

SMO.c

SMO.h


前面

滑膜常见用处有两个:

1、作为滑膜控制器SMC,对速度进行直接控制

2、作为滑膜观测器SMO,获取电机角度与转速信息

滑膜速度控制器

SMC叫滑膜控制(Sliding Mode Contral)

三相PMSM是一个非线性、强耦合的多变量控制系统,对于外界的扰动或者电机自身的参数发生变化时,传统的PI控制并不能满足实际的要求。因此可以引入滑模控制SMC,它对扰动和参数不敏感,响应速度也够快。

控制器所处位置

该模型在整个控制系统中的位置:

输入是:参考转速实际转速的误差。

输出是:Iq轴PI调节的输入。

理论设计

滑模控制其设计如下:

重点关注最后一个公式就可以。

模型搭建

公式可以转换为模型:

其中这三个属于滑模控制器关键参数:

转速:0.2秒时加载,可快速恢复到参考转速值1000。

电磁转矩

滑膜观测器

SMO叫滑膜观测器(Sliding Mode Observer),用于获取转子位置信息与转速信息。

在整个控制系统中所处的位置:

基本原理

该方法基于给定电流反馈电流之间的误差来设计滑膜观测器,并通过该误差重构电机的反电动势估算转子位置

简单来说就是,滑膜观测器就是通过采样与坐标变换得到的Ualpha,Ubeta,Ialpha,Ibeta四个参数值,获取扩展反电动势Ealpha、Ebeta的值。

之后则是需要想办法通过反电动势值,来获取转子的位置角θ:常见办法有反正切函数、PLL锁相环。同理也可同时获得转速估计值

反正切函数

转子的位置角:

转速估计值:

锁相环

滑膜观测器模型(反正切)

整体模型:

滑膜观测器总模型:

滑膜观测器获取反电动势模型:

反正切函数模型获取转子位置与速度信息:

转子位置 实际值与估计值:

转子速度 实际值与估计值:

滑膜观测器C代码实现

SMO.c

#include "Sensorless_SMO.h"
#include "IQ_math.h"
#define PI 3.14159265358979extern  Angle_SMO   Angle_SMOPare ;
extern  Speed_est   Speed_estPare ;
extern  SMO_Motor   SMO_MotorPare ;
extern  IQAtan     IQAtan_Pare; //这段代码实现了角度估计的计算过程,其中包括滑模位置观测器的更新、电流误差的计算、滑动控制量的计算和反电势的估计
void  Angle_Cale(p_Angle_SMO  pV)
{/*	Sliding mode current observer	*/pV->EstIalpha = _IQmpy(pV->Fsmopos,pV->EstIalpha) + _IQmpy(pV->Gsmopos,(pV->Valpha-pV->Ealpha-pV->Zalpha));pV->EstIbeta  = _IQmpy(pV->Fsmopos,pV->EstIbeta)  + _IQmpy(pV->Gsmopos,(pV->Vbeta -pV->Ebeta -pV->Zbeta ));/*	Current errors	*/pV->IalphaError = pV->EstIalpha - pV->Ialpha;pV->IbetaError  = pV->EstIbeta  - pV->Ibeta;/*  Sliding control calculator	*//* pV->Zalpha=pV->IalphaError*pV->Kslide/pV->E0) where E0=0.5 here*/pV->Zalpha = _IQmpy(IQsat(pV->IalphaError,pV->E0,-pV->E0),_IQmpy2(pV->Kslide));pV->Zbeta  = _IQmpy(IQsat(pV->IbetaError ,pV->E0,-pV->E0),_IQmpy2(pV->Kslide));/*	Sliding control filter -> back EMF calculator	*/pV->Ealpha = pV->Ealpha + _IQmpy(pV->Kslf,(pV->Zalpha-pV->Ealpha));pV->Ebeta  = pV->Ebeta  + _IQmpy(pV->Kslf,(pV->Zbeta -pV->Ebeta));}void  SMO_Pare_init(void )  // 电机参数初始化
{SMO_MotorPare.Rs = 0.821;    SMO_MotorPare.Ls = 0.00758; SMO_MotorPare.Ib = 6 ;   SMO_MotorPare.Vb = 14 ;SMO_MotorPare.Ts = 0.00008;SMO_MotorPare.POLES=4;SMO_MotorPare.BASE_FREQ=135;  SMO_MotorPare.Fsmopos = exp((-SMO_MotorPare.Rs/SMO_MotorPare.Ls)*(SMO_MotorPare.Ts));SMO_MotorPare.Gsmopos = (SMO_MotorPare.Vb/SMO_MotorPare.Ib)*(1/SMO_MotorPare.Rs)*(1-SMO_MotorPare.Fsmopos);Angle_SMOPare.Fsmopos = (int32_t)( SMO_MotorPare.Fsmopos*32768);Angle_SMOPare.Gsmopos = (int32_t)( SMO_MotorPare.Gsmopos*32768);Angle_SMOPare.Kslide = 4500 ;  //     Angle_SMOPare.Kslf =1000;      //      Angle_SMOPare.E0= 32670 ;      //    Speed_estPare.SpeedK1=355;Speed_estPare.SpeedK2=669;Speed_estPare.speed_coeff=(500*60)/(SMO_MotorPare.POLES ); // 2毫秒计算一次角度差值 1000/2ms=500   =7500	
}// 电机在2ms时间计算角度变化量。即是公式:// Speed_estPare.Speed_ele_angleIQ =Speed_estPare.ele_angleIQ -Speed_estPare.old_ele_angleIQ  // 防止超过65535和小于0,把差值一阶滤波,插值变化量乘系数就可以得到速度。// 速度信号的计算可以简单根据转位置的步进角计算或者直接根据角度在一定周期内的变化量计算// 其中移位16是把角度变化量归1的一个系数,变化角度/360度,在乘一个系数得到速度,// 可以通过示波器测量一个霍尔周期时间来计算。// 假设一个霍尔周期时间15ms,电机极对数为4,速度RPM=1/T*60/p=1000/15*60/4=1000rpm // 然后看在线看角度变化量(或者通讯发出来),速度RPM=变化量/65535*K=1000,求得系数K。 // 系数 :Speed_estPare.speed_coeffvoid SMO_Speedcale(void)  // 2ms执行一次
{Speed_estPare.ele_angleIQ= IQAtan_Pare.IQAngle; Speed_estPare.Speed_ele_angleIQ =Speed_estPare.ele_angleIQ- Speed_estPare.old_ele_angleIQ ;//如果速度估计值为负数,则加上一个周期的角度(65536)来获得正数表示的速度值if( Speed_estPare.Speed_ele_angleIQ <0)Speed_estPare.Speed_ele_angleIQ+=65536; 	//通过速度滤波器计算平滑的速度估计值Speed_estPare.Speed_ele_angleIQFitter= _IQ10mpy(Speed_estPare.SpeedK2, Speed_estPare.Speed_ele_angleIQFitter)+_IQ10mpy(Speed_estPare.SpeedK1,  Speed_estPare.Speed_ele_angleIQ);//转换成电机的旋转速度值Speed_RPM 这个是系数角度计算系数speed_coeffSpeed_estPare.Speed_RPM = (Speed_estPare.Speed_ele_angleIQ*Speed_estPare.speed_coeff)>>16; // 最大角度 2pi是一圈 65536//对转速值进行限制。如果转速值超过3000 RPM,则将转速值设为0if( Speed_estPare.Speed_RPM>=3000)Speed_estPare.Speed_RPM=0;Speed_estPare.old_ele_angleIQ = Speed_estPare.ele_angleIQ ;
}//===========================================================================
// No more.
//===========================================================================

SMO.h

#ifndef  Sensorless_SMO_H
#define  Sensorless_SMO_H#include "IQ_math.h"
#include "stm32f10x.h" 
#include "math.h"typedef struct {int32_t  Valpha;       //二相静止坐标系alpha-轴电压	int32_t  Ealpha;       //二相静止坐标系alpha-轴反电动势int32_t  Zalpha;       //alfa轴滑膜观测器的z平面int32_t  Gsmopos;      //滑膜常数1int32_t  EstIalpha;    //滑膜估算alpha-轴电流int32_t  Fsmopos;      //滑膜常数2int32_t  Vbeta;        //二相静止坐标系beta-轴电压	 int32_t  Ebeta;  	    //二相静止坐标系beta-轴反电动势int32_t  Zbeta;        //beta轴滑膜观测器的z平面	 int32_t  EstIbeta;     //滑膜估算beta-轴电流 int32_t  Ialpha;  	    //二相静止坐标系alpha-轴电流int32_t  IalphaError;  //二相静止坐标系beta-轴电流误差int32_t  Kslide;       //滤波器系数	 int32_t  Ibeta;  	    //二相静止坐标系beta-轴电流 int32_t  IbetaError;   //二相静止坐标系beta-轴电流误差int32_t  Kslf;         //滤波器系数int32_t  E0;	          //滑膜的电流误差的限幅值 0.5} Angle_SMO, *p_Angle_SMO;#define Angle_SMO_DEFAULTS {0,0,0,0,0,0,0,0,0,0,0,0} // 初始化参数typedef struct {int32_t  Speed_ele_angleIQ;  //速度电角度值(计算速度)  int32_t  old_ele_angleIQ;   // 电机历史电角度int32_t  ele_angleIQ;      // 电机电角度int32_t  Speed_ele_angleIQFitter;  //速度电角度值(计算速度)    	 uint16_t Speed_RPM;       	 //电机旋转速度 	 uint32_t speed_coeff;       //计算速度的系数uint16_t SpeedK1;           // 速度滤波系数K1uint16_t SpeedK2;         // 速度滤波系数K2}Speed_est;#define Speed_est_DEFAULTS {0,0,0,0,0,0,0,0} // 初始化参数typedef struct{float  Rs; 			//电机的相电阻	 float  Ls;			//电机的相电感	  float  Ib; 			//电机控制器的基本相电流 	  float  Vb;			//电机控制器的基本相电压	 float  Ts;			 //采样周期	 uint32_t   POLES; // 电机的极对数uint32_t   BASE_FREQ; // 电机控制器的基本频率float  Fsmopos;		   //滑膜常数1float  Gsmopos;			 //滑膜常数2}SMO_Motor;#define SMO_Motor_DEFAULTS {0.0,0.0,0.0,0.0,0.0,0,0,0.0,0.0} // 初始化参数void  Angle_Cale(p_Angle_SMO  pV); //滑膜电机位置电角度计算
void  SMO_Pare_init (void );   // 滑膜观测器的参数初始化
void SMO_Speedcale(void) ;    //  滑膜的角度计算速度函数
#endif /* Sensorless_SMO*/


http://www.ppmy.cn/news/699290.html

相关文章

linux开机自动进grub,linux 开机进入grub

解决办法&#xff1a;使用CentOS安装光盘进行开机GRUB引导修复   具体操作&#xff1a;   使用CentOS系统光盘引导计算机(系统盘要与原来安装的系统版本相同)   按F5进入系统修复模式   输入&#xff1a;linux rescue 回车   默认OK   选择Continue出现下面的界面 …

win10开机自启动浏览器,打开指定网页

关于win10系统&#xff0c;开机自动打开一个指定网页 在桌面空白处右键&#xff0c;新建 > 快捷方式&#xff0c;在输入框内输入你要打开的网址。 2.点击下一步&#xff0c;取个名&#xff0c;点击完成。 3.打开电脑 运行&#xff0c; 输入 shell:startup &#xff0c; 点击…

一个强制开机启动cmd的方法,适用于资源管理器崩溃,开机黑屏带鼠标,任务管理器和win+r都无法呼出的情形

手动开启windows带命令行和带网络连接的安全模式的方法 开端 很久之前我通过这个文章修复了我的系统&#xff0c;那时有个很有趣的事情&#xff0c;就是开机时explorer其实也可以调用除c盘以外的其他系统的explorer运行&#xff0c;然后今天我正好把explorer和任务管理器都搞…

计算机开机按f1,电脑开机按F1的原因及解决方法

很多电脑在使用一两年时间以后,或者突然停电、非法关机,再或者电脑CPU风扇故障、硬盘损坏等等原因,电脑就可能会在开机后报“press F1 to continue,DEL to enter SETUP”或“Press F1 Resume”之类的错误,一定要按一下“F1”才能继续启动电脑,每次开机都这样,虽然很多时候…

linux系统开机报错,linux开机报错故障

以下是机房里的小兄弟整理的文章,首先感谢余义林的细心的发现问题解决问题,并整理问题。 错误信息: checking filesystems /contians a file system wite errors, check forced Error reading block 145817602(Attempt to read block from filesystem short read)while geti…

xp计算机用户账户密码删除,xp强行删除管理员开机密码

匿名用户 2013-08-28 提问 回答 你用U盘起动盘,或者可以找张系统光盘,用光盘启动,有些系统光盘带密码清除的功能的 光盘,选择清除开机密码。 或 方法一、利用NET命令 我们知道在Windows XP中提供了“net user”命令,该命令可以添加、修改用户账户信息,其语法格式为: net…

error怎么开机 fan_笔记本开机显示fan error怎么解决?

展开全部 笔记本开机显示fan error解决方e5a48de588b662616964757a686964616f31333366303137法如下: 一、笔记本电脑问题Fan Error无法启动的问题的背景 1、笔记本电脑经常放在背包里,走路、跑步晃动; 2、笔记本2天没有关机,直接合上盖子; 3、第三天笔记本电脑开机提示 Fa…

phpstudy怎么开机启动mysql_phpstudy设置开机启动

PhpStudy默认的是非服务模式&#xff0c;也就是说要手动打开它才行&#xff0c;但是我们希望它是开机启动&#xff0c;而非我们手动去开启它。官方给出的说法是&#xff0c;选择系统服务就是开机自动启动&#xff0c;然而经过尝试发现却并非这样&#xff0c;即使你选择了系统服…