基于ADRC的FOC位置环控制

2023-10-26

ADRC介绍

自抗 扰 控 制 技 术 是 近 几 年 以来 在 非 线 性 PID 控 制 的基 础 上 发 展 而 来 的一 种 改 进 的 新 型 非 线 性 控 制 技 术 ,该算法在PID的基础上,引多了“安排过渡过程”和同时合理“提取微分信号”的方法,并加多了扩张状态观测器对系统的未知模型和外部扰动总和作用量进行实时估计和补偿,自抗扰控 主 要 包 括 跟 踪 微 分 器 (Tracking Differentiator,TD)、扩 张状 态观 测器 (ExtendedState Observer,ESO)和 非 线性状 态 误差 反馈 (Nonlinear StatesErrorFeed.Back,NLSEF)三 部分 。

1.非线性跟踪微分器

x1为输入v的过渡信号
x2为输入v的微分的过渡信号
h为计算步长槽。越大滤波效果更好,但跟踪信号的相位损失越大。
r为跟踪速度因子,值越大跟踪速度越快
fhan为离散域最速控制综合函数
α为非线性因子
跟踪微分器可以使给定的输入信号有一个缓冲的过称,减少超调现象,使经过跟踪微分器后的输出有一个爬升的过称。fhan为最速控制函数。
跟踪微分器是一个由误差提取误差微分的过称,同时能让控制量变得缓和。

在这里插入图片描述
在这里插入图片描述

2.非线性ESO观测器

ESO是一种通过对不确定转改对象的观测器形式的跟踪微分器进行改造而获得的状态观测器。 过将ESO观测出的对象模型的内、外扰动的实时作用量补偿到控制中,可将不确定非线性系统动态地转化为积分器串联型结构系统。
z1为系统输入的观测值
z2为系统输入的微分的观测值
z3为系统总扰动
fe fe1为非线性扰动
fal为非线性函数
β_01 β_02β_03为可调因子
为滤波因子,该参数越大,滤波效果越好

非线性反馈函数,用非线性反馈代替线性反馈,提高了收敛速度和抗扰动能力。
传统观测器使用误差积分,但是作用速度慢且会引起超调。
ESO将系统编程积分串联形式,将误差在控制量中补偿掉,是ADRC的灵魂所在。

在这里插入图片描述

3.非线性状态误差反馈控制律原理(NLSEF)

非线性状态误差反馈控制律采用了一种独立于对象模型的非线性控制器结构。NLSEF自动检测系统扰动,并给与补偿分量,若ESO的速度足够快,那么这个补偿分量就能精确地反映出系统的扰动情况。被控对象被化为积分串联型后,就可构造出理想控制器,这完全归功于该分量的补偿作用。补偿分量作用的实质是一种抗扰作用。
e1是偏差误差 e2是微分误差 u0是未经补偿的控制量 u是经过扰动补偿后的控制量

在这里插入图片描述

4.调参流程:

1.调TD

先单独调TD,r的数量级一般为10的5次方,h的数量级一般为10的负三次方。设置完r和h后,设定一个过滤变化的数据输入,将x1和输入的数据绘出,观察是否能够跟踪上。
TD跟踪效果(粗调)

在这里插入图片描述

2.调ESO

调完TD后,在调ESO时,需要先将NLSEF的参数大致调一下,这是由于ESO中的公式与NLSEF相关联。将alpha1和alpha2调为0.5和1.5,belta1和belta2设置为1。然后开始调ESO的数据,ESO主要用来观测输入量和外部扰动,以控制某类电机的速度举例,ESO则用来观测速度和电机受到的扰动。将电机的实际速度和设定输入设置进入函数,显示实际速度和观测速度z1,观察观测效果,z1是否能够跟踪电机的实际速度,给电机添加扰动,观察z3是否正确变化,b一般设为1或2。
ESO观测速度值与真实速度值(黄色为真实值)

在这里插入图片描述

3.调NLSEF

先调alpha1和alpha2,0<alpha1<1<alpha2,belta1和belta2即PID的P和D,根据需要的控制效果进行调整。
NLSEF控制效果(黄色为设定值10)
在这里插入图片描述

5.基于ADRC的位置环设计

在对ADRC调参完成后,将其应用在位置环中。控制框图如图所示。

ADRC框图

在这里插入图片描述

基于ADRC的位置环控制框图

在这里插入图片描述

ADRC控制角度效果(设定值8000)

在这里插入图片描述

5.ADRC代码

#include "MC_ADRC.h"
#include "MC_Globals.h"
#include "math.h"
#include "stdlib.h"
#include "uploading.h"
#include "MC_PID_regulators.h"
#include "stm32f40x_as5048.h"


//参数区,这11个就是需要用户整定的参数
/****************TD**********/
float r = 200000,//快速跟踪因子
      h = 0.0003;//滤波因子,系统调用步长

/**************ESO**********/
float b       = 2,//系统系数
      delta   = 0.0021,//delta为fal(e,alpha,delta)函数的线性区间宽度
      belta01 = 30,//扩张状态观测器反馈增益1
			belta02 = 300,//扩张状态观测器反馈增益2
			belta03 = 10000;//扩张状态观测器反馈增益3
	  
/**************NLSEF*******/
float alpha0 = 0.4,//
			alpha1 = 0.8,//
      alpha2 = 1.2,//

			belta0 = 0,//跟踪输入信号增益
      belta1 = -1.8,//跟踪输入信号增益
      belta2 = -0.02;//跟踪微分信号增益
	  

	  
/*****************************fhan函数*********************************/
float fhan(float x1,float x2,float r,float h)
{
 /*****************************第一套************************/
  float d    = 0,
        a    = 0,
				a0   = 0,
				a1   = 0,
				a2   = 0,
				y    = 0,
				fhan = 0;
  
  d    =  r*h*h;
  a0   =  h*x2;
  y    =  x1+a0;
  a1   =  sqrtf(d*(d+8*fabsf(y)));
  a2   =  a0 + LSign(y)*(a1 - d)/2.0;
  a    =  (a0+y)*(LSign(y+d)-LSign(y-d))/2.0  + a2*(1-(LSign(y+d)-LSign(y-d))/2.0);
  fhan = -r*(a/d)*(LSign(y+d)-LSign(y-d))/2.0 - r*LSign(a)*(1-(LSign(a+d)-LSign(a-d))/2.0);
	
 /******************************第二套**********************/
//	float deltaa  =0,
//				deltaa0 =0,
//	      y       =0,
//	      a0      =0,
//	      a       =0,
//	      fhan    =0;
//	
//	deltaa = r*h;
//	deltaa0 = deltaa*h;
//	y=fx1+fx2*h;
//	a0 = sqrtf(deltaa*deltaa+8*r*fabsf(y));
//	if(fabsf(y)<=deltaa0)
//		a=fx2+y/h;
//	else
//		a=fx2+0.5*(a0-deltaa)*sign(y);
//	if(fabsf(a)<=deltaa)
//		fhan = -r*a/deltaa;
//	else
//		fhan = -r*sign(a);
	
  return fhan;
}
/************************************sign函数***************************/

int LSign(float x)
{
	if(x>0)
	{
		return 1 ;
	}	
	else if(x<0)
	{
	return -1;
	}	
	else
	{
			return 0;
	}
	
}
/*******************************fal函数**********************************/
float fal(float e,float alpha,float delta)
{
  float result = 0,fabsf_e = 0;
  
  fabsf_e = fabsf(e);
  
  if(delta>=fabsf_e)
    result = e/powf(delta,1.0-alpha);
  else //if(delta<fabsf_e)
    result = powf(fabsf_e,alpha)*LSign(e);
 
 return result;     
}


//中间变量区,不需要用户管理以及赋值
/****************TD*******************/
float x1 = 0,//跟踪输入
      x2 = 0,//跟踪输入的微分
/****************ESO******************/
      e  = 0,//误差
			z1 = 0,//跟踪反馈值
			z2 = 0,//跟踪反馈值的而微分
			z3 = 0,//跟踪系统的扰动(总扰动)
/**************NLSEF******************/
      u = 0;//输出值
/********************************ADRC************************************/
float ADRC(float v,float y)
{
  float u0 = 0,
				e0 = 0,
        e1 = 0,
				e2 = 0;
/******************************TD****************************************/
  x1 = x1 + h*x2;
  x2 = x2 + h*fhan(x1-v,x2,r,h);
	
	
	
/******************************ESO***************************************/
	
	
  e = z1 - y;
  z1 = z1 + h*(z2-belta01*e);
  z2 = z2 + h*(z3-belta02*fal(e,0.5,delta)+b*u);
  z3 = z3 + h*(-belta03*fal(e,0.25,delta));
	
	
	
/******************限幅,ADRC正常的话不会达到限幅条件********************/
  if(z1>=30000) z1=30000;
  if(z1<=-30000) z1 = -30000;
  if(z2>=30000) z2=30000;
  if(z2<=-30000) z2 = -30000;
  if(z3>=30000) z3=30000;
  if(z3<=-30000) z3 = -30000;
/******************************NLSEF*************************************/

	e0  = e0+e1;
  e1 = x1 - z1;
  e2 = x2 - z2;
  
//  u0 = belta1*fal(e1,alpha1,delta) + belta2*fal(e2,alpha2,delta);//其中0<alpha1<1<alpha2
	u0 = belta1*fal(e1,alpha1,delta) + belta2*fal(e2,alpha2,delta)+belta0*fal(e0,alpha0,delta);//其中0<alpha1<1<alpha2
  
  u = u0 - z3/b;
  
	Pack_Send_data(u0,0,v,z1,z2,z3,0xA1);
	
  return u0;
}

获取源码:公众号【程序员DeRozan】回复1207

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于ADRC的FOC位置环控制 的相关文章

随机推荐

  • Kafka 事务特性分析

    kafka transaction Kafka 事务特性分析 1 特性背景 支持事务消息有什么作用 消息事务是实现分布式事务的一种方案 可以确保分布式场景下的数据最终一致性 2 分布式事务介绍 当前系统架构主流是分布式架构与微服务架构 在这
  • Java NIO 的前生今世 之一 简介

    Java NIO 是由 Java 1 4 引进的异步 IO Java NIO 由以下几个核心部分组成 Channel Buffer Selector NIO 和 IO 的对比 IO 和 NIO 的区别主要体现在三个方面 IO 基于流 Str
  • 【Matlab学习笔记】【图像滤波去噪】中值滤波

    中值滤波程序 clc clear all J imread F 图像去噪 4 jpg I rgb2gray J subplot 1 2 1 imshow I title 原始图像 K medfilt2 I 4 4 进行中值滤波 subplo
  • debian linux root登录,DEBIAN 10切换ROOT用户登录

    ebian 10默认的一样不能用root用户登录 还是需要设置 方法如下 一 打开终端 用普通用户登录 输入 su 输入密码 切换到root用户 二 设置root用户登录 nano etc ssh sshd config 三 修改配置 Pe
  • 《百面机器学习》学习笔记之经典算法(支持向量机SVM、逻辑回归LR、决策树DT)

    第三章 经典算法 01 支持向量机 支持向量机 Support Vector Machine SVM 是监督学习方法 将低维的数据映射到高维的核映射空间 寻找 分类超平面 将不同类别的数据区分开 在空间上线性可分的两类点 分别向SVM分类的
  • 什么是负边沿触发_负边沿jk触发器功能测试

    负沿jk触发器有什么特点 JK触发器是数字电路触发器中的一种基本电路单元 JK触发器具有置0 置1 保持和翻转功能 在各类集成触发器中 JK触发器的功能最为齐全 在实际应用中 它不仅有很强的通用性 而且能灵活地转换其他类型的触发器 由JK触
  • 前端重新学习(5)DOM与DOM2、DOM3区别以及DOM2新特性

    摘抄自他人笔记 http itbilu com javascript js Vyxodm 1g html https blog csdn net pxy lele article details 49755071 感谢分享 目录 DOM0
  • 开关电源matlab仿真设计报告,基于MATLAB的开关电源反馈控制系统的设计和仿真

    电源世界 年第七期 模型 方法 仿真以 人傲抓 汇 基于 的 开 关 电源 反 馈 控 制 系 统 的设 计和 仿真 李洪文 毛佳 吉林大学 长春 摘 要 本 洲 十州 关电源 的模 型 和 反馈控制 系统进行 了分 析 及 设 计 并 采
  • @Inner使用及原理

    外部从Gateway访问 需要鉴权 eg CURD操作 这种是最常使用的 用户登录后正常访问接口 不需要我们做什么处理 可能有的接口需要加权限字段 外部从Gateway访问 不需要鉴权 eg 短信验证码 需要我们将uri加入到securit
  • Python 类和实例

    可以自由地给一个实例变量绑定属性 比如 给实例bart绑定一个name属性 gt gt gt bart name Bart Simpson gt gt gt bart name Bart Simpson 由于类可以起到模板的作用 因此 可以
  • 写测试用例、重构函数、生成SQL查询……原来CodeGeeX还能做这些!

    CodeGeeX中的智能问答功能 Ask CodeGeeX 可以帮助程序员解答开发过程中遇到的问题 但是 Ask CodeGeeX 的能力不止于此 用它还能帮助程序员高效编写测试用例 添加代码调试信息 实现SQL语句等等 如果你还不知道如何
  • 求三角形重心 包括凹多边形的模板

    求多边形重心的题目大致有这么几种 1 质量集中在顶点上 n个顶点坐标为 xi yi 质量为mi 则重心 X xi mi mi Y yi mi mi 特殊地 若每个点的质量相同 则 X xi n Y yi n 2 质量分布均匀 这个题就是这一
  • [PyQt] 在QLabel上用drawText实现文字滚动

    from PyQt4 QtGui import from PyQt4 QtCore import try fromUtf8 QString fromUtf8 except AttributeError def fromUtf8 s retu
  • 毕业设计-基于协同过滤推荐算法的视频推荐系统

    目录 前言 课题背景和意义 实现技术思路 一 关键技术分析 二 系统建模 三 结果分析 四 总结及展望 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精
  • Python之列表(list)基础知识点

    文章目录 1 创建列表 1 1 使用基本语法 创建 1 2 基于list 创建 1 3 range 创建整数列表 1 4 推导式生成列表 2 增加元素 2 1 append 方法 2 2 列表相加 2 3 extend 方法 2 4 ins
  • 共享本地文件夹

    ps 需要传输比较大的文件夹时 可以使用此方法 访问本地地址 直接进行下载 1 需要访问的那台电脑需要先安转node js https nodejs org en 2 进入终端安装本地服务http server 运行指令 npm insta
  • 自动驾驶汽车运动规划技术回顾——PDF版本

    英文 A Review of Motion Planning Techniques for Automated Vehicless 中文 自动驾驶汽车运动规划技术回顾 Chinese Gonz lez D P rez J Milan s V
  • 解决文字和elementUI中的进度条progress组件不能在同一行的问题

    我们使用span标签包裹一段文字 想要和elementUI中的progress组件显示在同一行 效果如下 span是一个行元素 progress是一个块元素 起初我是使用弹性盒布局 display flex 想让他们显示在一行 但是使用弹性
  • df查询命令用法区别。df -ih与df -lh

    今天磁盘显示没有可用空间了 google后记录一下 本人是菜鸟一枚 搞不清楚 i 与 h的区别 幸好文章地址http www 111cn net sys CentOS 86335 htm 截图如下 经过对比发现假如执行df lh命令发现磁盘
  • 基于ADRC的FOC位置环控制

    ADRC位置环控制 ADRC介绍 1 非线性跟踪微分器 2 非线性ESO观测器 3 非线性状态误差反馈控制律原理 NLSEF 4 调参流程 1 调TD 2 调ESO 3 调NLSEF 5 基于ADRC的位置环设计 ADRC框图 基于ADRC