基于ADRC的FOC位置环控制

2023-05-16

ADRC位置环控制

  • ADRC介绍
  • 1.非线性跟踪微分器
  • 2.非线性ESO观测器
  • 3.非线性状态误差反馈控制律原理(NLSEF)
  • 4.调参流程:
    • 1.调TD
    • 2.调ESO
    • 3.调NLSEF
  • 5.基于ADRC的位置环设计
        • ADRC框图
        • 基于ADRC的位置环控制框图
        • ADRC控制角度效果(设定值8000)
  • 5.ADRC代码

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位置环控制 的相关文章

  • 这篇很好地引入介绍了ADRC

    这篇很好地引入介绍了ADRC https zhuanlan zhihu com p 151342543 from voters page 61 true 从零开始搭建无人机控制系统 xff08 一 xff09 反馈与闭环 遥远的乌托邦 欢迎
  • ADRC自抗扰控制自学笔记(包含simulink仿真)(转载)

    他这里让我很好理解了跟踪微分器 非线性PID 准确说是非线性PD xff0c 所以可以看到输入是两根线而不是三根线 xff09 也就是说传统PID是线性的 xff1f 但是不是那些系统是非线性的 xff0c 比如无人机 xff0c 平衡车
  • 关于ADRC的一些粗鄙之语

    看这篇我感受到我控制理论方面的基础还掌握得不够 摘自 xff1a https zhuanlan zhihu com p 156228260 关于ADRC的一些粗鄙之语 隔壁uncle wang 机械工程Ph D amp 控制算法小萌新 ac
  • 自抗扰控制理论(四)ADRC控制串级系统

    刚刚优酷里面看到一个用串级ADRC弄无人机的视频 https v youku com v show id XNDA5MTY5ODQxNg 61 61 html 摘自 xff1a https zhuanlan zhihu com p 1153
  • 我的ADRC调参经验总结

    提示 xff1a 本文是在前人基础上搭建的ADRC模型 xff0c 并根据这一模型学习如何对其进行调参时产生的 xff0c 部分结论来自论文 目录 前言一 控制系统简介二 调参步骤1 前后结果效果对比2 调参经验 总结参考链接 前言 ADR
  • FOC控制之小A小B小C是如何追求小D的

    1 写在前面 随着电动汽车的热火 xff0c 关于FOC控制技术的文章这几年在网络上可谓是一搜一大把 xff0c 各种理论分析 xff0c 公式推导 xff0c 应有尽有 通过这些文章 xff0c 可以看出大佬还是很多的 另外也有FOC的开
  • ADRC从入门到放弃0

    ADRC xff1a 自抗扰控制器 其中 xff0c 在对自抗扰理论的 研究中 xff0c 引入了带宽概念这一个崭新的思路 xff0c 极大的简化了自抗扰技术使用时参数整定 的问题 xff0c 同时时域分析的方法可以发现利用带宽的概念还有利
  • 无传感器永磁同步电机电机自适应自抗扰ADRC控制策略

    提示 xff1a 无速度传感器永磁同步电机电机自适应自抗扰控制策略 xff0c 在2022年10月12日晚上23 xff1a 00写完的 人生的路真的很难走 xff0c 身边也发生了很多不好的事情 xff0c 关于一些研究成果和simuli
  • 【ADRC】跟踪微分器

    在上一篇文章中 xff0c 分析了PID算法的基本数学原理 xff0c 从PID算法的原理与实际应用 xff0c 是可以看出其PID的优点与缺点的 xff0c ADRC算法 自抗扰控制 也可以说是针对PID算法的一些缺点 xff0c 或者说
  • 【ADRC】扩张状态观测器(ESO)

    扩张状态观测器是自抗扰控制中非常重要的一个环节 xff0c 在我学习这部分内容后 xff0c 在写本篇文章时 xff0c 大致可以按照三个步骤来做实验 xff0c 推导 xff0c 由这三个步骤来由浅入深地去理解扩张状态观测器 ESO xf
  • 20210824-ADRC数学和解释

    ADRC个人感觉就是 xff0c 对目标信号进行最速跟踪 43 不确定量观测补偿 43 低通滤波信号微分 43 pid 举例说明 xff1a 输入 xff1a Sr 目标电机速度 xff0c 输出 xff1a u 电机pwm 被控量 xff
  • PLC的自抗扰控制(ADRC)算法

    自抗扰控制算法 网上很多文章有理论推导和讲解 大家也可以关注韩京清教授的论文和书籍 这里就不赘述了 博途PLC ADRC自抗扰控制完整源代码可以参看下面这篇文章 博途PLC 1200 1500PLC自抗扰控制 ADRC 完整SCL源代码 R
  • ADRC/Matlab一步步实现跟踪微分器TD(附完整PLC测试代码链接)

    TD微分器的主要作用 就是安排过渡过程 产生跟踪信号和微分信号 滤除噪声 关于Adrc的理论分析不是本篇博客的重点 主要也是能力所限 相关理论大家可以看韩京清教授的论文 专栏有简单的学习笔记 感兴趣的同学可以看看 链接如下 ADRC自抗扰的
  • ADRC Ardupilot代码分析

    记录一下自己对于Ardupilot ADRC控制代码的一些理解 GitHub链接 ADRC Active Disturbance Rejection Control by MichelleRos Pull Request 20243 Ard
  • FOC观测器之龙伯格观测器

    状态观测器 xff1a 根据控制理论 xff0c 如果一个系统能够完全通过其检测到的输出值来重构其系统状态 xff0c 则认为该系统是可观测的 其作用于无传感器转子的位置和速度的检测反馈 xff0c 再作用到PARK逆变换和转矩磁链控制上
  • 自抗扰控制(ADRC)仿真系统(matlab/simulink)的搭建

    一 现在关于自抗扰控制技术方面的研究已经比较成熟了 xff0c 基本上熟悉结构以后都可以找到例子实现 xff0c 今天以一个简单的例子来介绍自抗扰控制的仿真系统搭建 xff0c 不必畏惧 xff0c 熟悉皆可达 1 首先自抗扰控制分为TD
  • ADRC自抗扰控制学习

    入门 自抗扰控制01 xff1a 为何ADRC会成为百年PID算法的继承者 xff1f http news eeworld com cn mp ZLG a23516 jspx 自抗扰控制02 ADRC如何避免执行错误命令 http news
  • FOC中的PARK变换_TI和ST电机控制库的源码实现

    FOC中的Clarke变换 TI和ST电机控制库的源码实现 FOC中的PARK变换 TI和ST电机控制库的源码实现 FOC中的反PARK变换 TI和ST电机控制库的源码实现 park变换 该变换将平衡两相正交平稳系统中的矢量变换为正交旋转坐
  • 无刷电机驱动器

    0 0参考 FOC 看这篇文章就够了 志辉君 自制FOC驱动器 深入浅出讲解FOC算法与SVPWM技术 SPWM基本原理详解 图文并茂 公式推导 C程序实现 1 开源的FOC方案 1 SmipleFOC是比较常见的无刷驱动方案 因为其便宜的
  • svpwm之先把电机转起来

    学习FOC一段时间 怎是没有长进 一直看书 FOC框架比较复杂 我在想可不可以输出一个固定频率的SVPWM先把电机转动起来 FOC框架如上图 我先实现SVPWM部分 如下图框选的部分 生成7段式SVPWM 1 硬件平台选择 硬件平台 MCU

随机推荐

  • GAZEBO_PLUGIN_PATH 设置方法

    http answers gazebosim org question 13391 how to set gazebo plugin path correctly and add the plugin into gazebo ros Hi
  • Linux 0.11 系统调用的实现机制

    Linux 0 11 系统调用的实现机制 一 系统调用概述 系统调用本质上是一种中断 xff0c 中断号为0x80 xff0c 即128号中断 通常我们使用的是库函数 xff0c 而不是直接使用系统调用 xff0c 这主要是因为库函数一般都
  • 滤波算法及优缺点

    传感器比如关节力矩传感器采用滑动平均滤波算法 xff0c 滤波点数选1则为原始数据 xff0c 选点数100则采样100个求平均 点数越大滤波延迟越大 xff0c 越平滑 所以需要根据实际项目测试 在matlab中采用了三种滤波方法 xff
  • putty支持多标签,支持log每行加时间

    在现在的免费telnet 串口连接工具中 Tera Term 支持脚本ttl 且有每行时间记录 有一个不好的是个终端连接不友好 xff0c 也能用 xff0c 就是看起来不方便 xff0c 是一个外挂的补丁 putty 不支持多标签 不支持
  • Jetson xavier nx 入门系列—— jeston系列性能对比

    官方对比网址 xff1a https developer nvidia com embedded develop hardware family 算力对比 参考 xff1a https blog csdn net u013673476 ar
  • 在C语言中,字符串总是以‘\0‘作为结尾

    字符串结束标志 xff08 划重点 xff09 字符串是一系列连续的字符的组合 xff0c 要想在内存中定位一个字符串 xff0c 除了要知道它的开头 xff0c 还要知道它的结尾 找到字符串的开头很容易 xff0c 知道它的名字 xff0
  • cmake 学习笔记(一)

    最大的Qt4程序群 KDE4 采用cmake作为构建系统Qt4的python绑定 pyside 采用了cmake作为构建系统开源的图像处理库 opencv 采用cmake 作为构建系统 看来不学习一下cmake是不行了 xff0c 一点一点
  • 如何用github创建博客

    1 创建一个仓库 xff0c 设置名称为用户名 github io xff0c 不然会报404 2 在设置中找到github pages选项 xff0c 选择theme 3 将仓库使用github客户端克隆到本地 4 将克隆到本地仓库内容清
  • VS创建的aspx文件下没有设计-拆分-源 并且工具箱中的控件为灰色

    首先在视图中打开工具箱 这时是没有控件的 右键点击全部显示 但是仍然是灰色 没法使用 我的 Master文件夹里有设计 拆分 源 但是aspx文件里没有 解决方法
  • 【支线】输电杆塔识别-YOLO v5在Aidlux的部署

    目录 0 前言1 模型训练1 1 任务描述1 2 输电杆塔数据集采集1 3 输电杆塔数据集标注1 4 数据增强1 5 折腾1 6 训练1 7 测试 2 NX部署2 1 软硬件2 2 Tensor RT 优化推理2 3 ROS Topic发送
  • 程序员与厨师

    不管你信不信 反正我是信了 每一个程序员上辈子都是呆在厨房的厨子 好吧 你不信 我来证明给你看 1 下厨前 你得知道做的是早餐还是中晚餐 中晚餐的话 怎么也得走趟超市 如遇到好友聚会 怎么着也得做出一桌对得起朋友的饭菜 还有你得分析 朋友中
  • 用研扬科技的UP Square做软路由是不是杀鸡用牛刀啊?

    折腾了好几遍终于整踏实了 xff01
  • 炎炎夏日,看小Y重燃烈焰战火——Y450外接显卡

    xfeff xfeff 目录 前言 实际效果 预算VS结算 配件开箱 硬件连接 软件环境配置 xff08 重点 xff09 前言 我家小Y已经陪伴我4年多了 xff0c 四年里 xff0c 她带给我的欢乐是超值的 xff08 联保了4年多
  • 深度学习情感分类常用方法(综述)

    论文原文 xff1a Deep Learning for Sentiment Analysis A Survey 原文地址 xff1a https arxiv org ftp arxiv papers 1801 1801 07883 pdf
  • 嵌入式单片机之stm32串口你懂了多少!!

    stm32作为现在嵌入式物联网单片机行业中经常要用多的技术 xff0c 相信大家都有所接触 xff0c 今天这篇就给大家详细的分析下有关于stm32的出口 xff0c 还不是很清楚的朋友要注意看看了哦 xff0c 在最后还会为大家分享有些关
  • uC/OS-II 学习笔记之:消息邮箱

    更多原创 uC OS II学习笔记之 xff1a 系列 基础及嵌入式相关知识详解 xff0c 请访问可乐虎博客 xff1a http blog csdn net dcx1205 相信不会让您失望 xff01 xff01 一 消息邮箱的概念
  • uC/OS-II 学习笔记之:信号量、消息邮箱、消息队列之间的使用区别

    更多原创 uC OS II学习笔记之 xff1a 系列 基础及嵌入式相关知识详解 xff0c 请访问可乐虎博客 xff1a http blog csdn net dcx1205 相信不会让您失望 xff01 xff01 1 用信号量进行行为
  • Python3抓取糗百、不得姐、kanqu.com

    测试电脑配置有点低 xff0c 正常配置速度会比较快 有问题可以加群 xff1a 544471255 交流 使用必看 1 该代码使用Python3 6 43 版本 2 需要安装依赖库如下 可使用类似 pip install requests
  • 基于STM32F4实现FOC(磁场定向控制)一:电流采样和波形产生

    一 xff0e ADC的配置问题 1 GPIO初始化配置 开始ADC对应的GPIO口 xff0c 本驱动程序使用到五个GPIO xff0c 分别对应U V W三相电流及母线电压和温度采样 xff0c 统一配置为模拟输入 GPIO的配置代码如
  • 基于ADRC的FOC位置环控制

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