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

news2024/11/15 23:22:21

目录

前面

滑膜速度控制器

控制器所处位置

理论设计

模型搭建

滑膜观测器

基本原理

反正切函数

锁相环

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

滑膜观测器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.14159265358979

extern  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_coeff

void 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_coeff
   Speed_estPare.Speed_RPM = (Speed_estPare.Speed_ele_angleIQ*Speed_estPare.speed_coeff)>>16; // 最大角度 2pi是一圈 65536
	
   //对转速值进行限制。如果转速值超过3000 RPM,则将转速值设为0
	 if( 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;      //滑膜常数1
	     int32_t  EstIalpha;    //滑膜估算alpha-轴电流
	     int32_t  Fsmopos;      //滑膜常数2
	     int32_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;           // 速度滤波系数K1
	    uint16_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;		   //滑膜常数1
    float  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.coloradmin.cn/o/713950.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

日本电子电器PSE认证METI备案、结构分析函报告详细解答

PSE认证是日本强制性安全认证&#xff0c;用以证明电子电气产品已通过日本电气和原料安全法 (DENAN Law) 或国际IEC标准的安全标准测试&#xff0c;457种产品进入日本市场必须通过PSE认证&#xff0c;其中&#xff0c;116种A类产品为特定电器和材料类&#xff0c;须获取认证并加…

机器学习中的Embeddings是什么

嵌入已经渗透到数据科学家的工具包中&#xff0c;并极大地改变了 NLP、计算机视觉和推荐系统的工作方式。然而&#xff0c;许多数据科学家发现它们过时且令人困惑。更多的人在不了解它们是什么的情况下盲目地使用它们。在本文中&#xff0c;我们将深入探讨嵌入是什么、它们如何…

【vue3】14-Vue全家桶-VueX状态管理

Vue全家桶 - VueX状态管理 认识应用状态管理VueX的状态管理 Vuex状态管理详解Vuex的基本使用单一状态树核心概念State组件获取状态setup中获取状态 核心概念Gettersgetters基本使用getters辅助函数 核心概念MutationsMutation基本使用mutation携带数据Mutation常量类型Mutation…

ModaHub魔搭社区:Zilliz Cloud 多组织与角色管理功能,让你的权限管理更简单!

目录 组织与角色功能简介 如何使用组织与角色功能&#xff1f; Zilliz Cloud 云服务是一套高效、高度可扩展的向量检索解决方案。近期&#xff0c;我们发布了 Zilliz Cloud 新版本&#xff0c;在 Zilliz Cloud 向量数据库中增添了许多新功能。其中&#xff0c;用户呼声最高的…

从零开始备战数学建模国赛之线性规划1.1

从零开始备战数学建模国赛之线性规划1.1 现在距离2023年的数学建模国赛还有不足三个月的时间&#xff0c;想与大家共同备战国赛。 这是我自己总结的一些代码和资料&#xff08;本文中的代码以及参考书籍等&#xff09;&#xff0c;放在github上供大家参考&#xff1a;https://…

流量控制 Sentinel

一、Sentinel(哨兵)简介 1、Sentinel的功能及特点 1.Sentinel的功能 Sentinel的支持 2.Sentinel的特点 Sentinel的特点 2、Sentinel的组成 核心库&#xff08;Java 客户端&#xff09;不依赖任何框架/库&#xff0c;能够运行于所有 Java 8 及以上的运行时环境&#xff0c;同…

HMAC算法详解

1.HMAC算法 1.1 HMAC算法简介 HMAC&#xff08;Hash-based Message Authentication Code&#xff0c;散列消息认证码&#xff09;是一种使用密码散列函数&#xff0c;同时结合一个加密密钥&#xff0c;通过特别计算方式之后产生的消息认证码&#xff08;MAC&#xff09;。它可…

Go语言使用中遇到的错误

Go语言使用中遇到的错误 1、go: go.mod file not found in current directory or any parent directory. 先运行这一行代码&#xff1a; go mod init name再运行你的 go get 命令就好了。 2、Failed to build the application: main.go:4:2: package generateproject/route…

C++之报错:is an inaccessible base of(一百四十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

物业管理变牛的好办法,新手零基础必备!

随着城市化进程的加速和商务发展的蓬勃&#xff0c;写字楼作为商业活动的核心场所&#xff0c;在现代都市生活中扮演着至关重要的角色。 随之而来的安全威胁和管理难题也日益凸显。因此&#xff0c;为了确保写字楼内部的安全与秩序&#xff0c;提高工作人员和访客的出入效率&am…

slab 内存池的设计与实现

目录 从一个简单的内存页开始聊 slab slab 的总体架构设计 slab 的组织架构 ​编辑 ​编辑 参考文献 伙伴系统内存分配原理的相关内容来看&#xff0c;伙伴系统管理物理内存的最小单位是物理内存页 page。也就是说&#xff0c;当我们向伙伴系统申请内存时&#xff0c;至少…

Windows:prometheus + grafana + wmi_exporter+ 主机信息监控页面 + 支持主机信息告警

1、PrometheusGrafana环境搭建 1.1、Prometheus 下载地址&#xff1a;Download | Prometheus 选择对应的系统的版本下载并解压压缩包&#xff0c;运行程序 本人在window系统上操作 双击 验证 浏览器输入http://localhost:9090/ 点击Staatus>Targets 出现以下即成功 1.…

Unifying Large Language Models and Knowledge Graphs: A Roadmap

5.2 LLM-augmented KG Completion 知识图谱补全(KGC)是指对给定知识图谱中缺失的事实进行推断的任务。与KGE类似,传统的KGC方法主要关注于KG的结构,而没有考虑广泛的文本信息。然而,最近llm的集成使KGC方法能够对文本进行编码或生成事实,以获得更好的KGC性能。这些方法根据…

【数据科学赛】2023大模型应用创新挑战赛 #¥10万 #百度

CompHub 主页增加了“近两周上新的奖金赛”&#xff0c;更加方便查找最新比赛&#xff0c;欢迎访问和反馈&#xff01; 以下内容摘自比赛主页&#xff08;点击文末阅读原文进入&#xff09; Part1赛题介绍 题目 2023大模型应用创新挑战赛 举办平台 Baidu AI Studio 主办方…

git介绍和使用

目录 一、git概述 1、简介 2、下载安装 二、git代码托管服务 1、常用的 Git 代码托管服务 2、使用码云代码托管服务 三、git常用命令 1、git全局设置 2、获取git仓库 3、工作区、暂存区、版本库 概念 4、Git工作区中文件的状态 5、本地仓库操作 6、远程仓库操作 …

Jetson Nano介绍

1. bo1公版介绍 Jetson NanoBO1公版的实物图如下图所示。其中1是TF卡接口&#xff0c;可以进行系统镜像烧写&#xff1b;2是40PIN GPIO扩展接口&#xff1b;3是用来传输数据或使用电源供电的Micro USB接口&#xff1b;4是千兆以太网口&#xff1b;5是USB3.0接口&#xff1b;6是…

CentOS Linux的替代品(五)_BigCloud Enterprise Linux for Euler 21.10 U 3基础安装教程

文章目录 CentOS Linux的替代品&#xff08;五&#xff09;_BigCloud Enterprise Linux for Euler 21.10 U 3基础安装教程一、BC-Linux简介二、BigCloud Enterprise Linux for Euler 21.10U3基础安装2.1 下载地址2.2 安装过程 三、简单使用3.1 关闭selinux3.1.1 临时关闭selinu…

QT学习笔记:QT的信号与槽

一、信号与槽&#xff08;Signal & Slot&#xff09;的基本概念 1、了解信号与槽 &#xff08;1&#xff09;信号&#xff08;Signal&#xff09;&#xff1a;在特定情况下被发射的事件&#xff0c;例如PushButton 最常见的信号就是鼠标单击时发射的 clicked() 信号&…

Pytest测试框架快速搭建

一、介绍 pytest是一个非常成熟的Python测试框架&#xff0c;能够支持简单的单元测试和复杂的功能测试&#xff0c;还可以用来做selenium/appnium等自动化测试、接口自动化测试&#xff08;pytestrequests&#xff09;&#xff1b;pytest具有很多第三方插件&#xff0c;并且可…

springboot整合腾讯企业邮箱/企业微信邮箱

springboot整合腾讯企业邮箱/企业微信邮箱 登录后点击“客户端设置” 2.勾选红框中选项并保存 3.点击微信绑定并绑定微信 4.绑定微信后点击生成新密码并保存(复制生成的密码后面会使用) 5.将配置复制到代码中 <dependency><groupId>com.sun