基于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 无名似乎17年就开始弄ADRC了 http www docin com p 2101934503 html ACfly和无名他们确实早就认识 https blog csdn net wang2012113132
  • (ADRC)自抗扰控制器学习总结(一)

    蓝色字体是我的评注 摘自 xff1a https blog csdn net qq 27270029 article details 78937854 ADRC自抗扰控制基本思想要点 xff1a 1 标准型与总扰动 xff0c 扩张状态与扰
  • 我的ADRC调参经验总结

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

    ADRC Adaptive Dynamic Range Control 算法是一种用于自动调节动态范围的方法 在 C 语言中实现 ADRC 算法 xff0c 您需要首先了解 ADRC 算法的基本原理 xff0c 然后根据公式把算法按照 C
  • FOC控制之小A小B小C是如何追求小D的

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

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

    文章目录 一 什么是无刷电机 xff1f 1 长什么样 xff1f 2 怎么工作 xff1f 二 试着让它转起来1 STM32CubeMX配置2 keil Clion代码编写3 结果分析 参考的资料 写这个是为了记录学习过程 xff0c 为
  • 自抗扰控制ADRC之三种微分跟踪器TD仿真分析

    目录 前言 1 全程快速微分器 1 1仿真分析 1 2仿真模型 1 3仿真结果 1 4结论 2 Levant微分器 2 1仿真分析 2 2仿真模型 2 3仿真结果 3 非线性跟踪微分器 韩教授 3 1仿真分析 3 2小结 4 总结 前言 工
  • 自抗扰控制ADRC之扩张观测器

    目录 前言 1 被控对象 被观测对象 2 非线性观测器 2 1仿真分析 2 2仿真模型 2 3仿真结果 3 线性观测器 3 1仿真模型 3 2仿真结果 4 总结和学习问题 前言 什么叫观测器 xff1f 为什么该类观测称为扩张观测器 xff
  • 【控制理论】用ADRC控制倒立摆

  • 【ADRC】跟踪微分器

    在上一篇文章中 xff0c 分析了PID算法的基本数学原理 xff0c 从PID算法的原理与实际应用 xff0c 是可以看出其PID的优点与缺点的 xff0c ADRC算法 自抗扰控制 也可以说是针对PID算法的一些缺点 xff0c 或者说
  • dsp2812 pmsm foc之速度环电流环

    61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 速度环PI 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
  • ADRC控制算法在多旋翼飞行器上的应用

    基础理论知识 xff1a 程序中涉及的部分知识点参考如下链接 xff1a ADRC算法以及参数整定 xff1a 关于ADRC算法以及参数整定 xff08 调参 xff09 的一些心得体会 西涯先生的博客 CSDN博客 adrc控制算法 AD
  • ADRC学习

    学习ADRC先从提出这个算法的论文 从 PID 技术到 自抗扰控制 技术 开始 https download csdn net download qq 34445388 10309935 调试四轮智能车 xff0c 板球控制系统 xff0c
  • FOC观测器之龙伯格观测器

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

    ADRC位置环控制 ADRC介绍1 非线性跟踪微分器2 非线性ESO观测器3 非线性状态误差反馈控制律原理 NLSEF 4 调参流程 xff1a 1 调TD2 调ESO3 调NLSEF 5 基于ADRC的位置环设计ADRC框图基于ADRC的
  • FOC中的PARK变换_TI和ST电机控制库的源码实现

    FOC中的Clarke变换 TI和ST电机控制库的源码实现 FOC中的PARK变换 TI和ST电机控制库的源码实现 FOC中的反PARK变换 TI和ST电机控制库的源码实现 park变换 该变换将平衡两相正交平稳系统中的矢量变换为正交旋转坐
  • PMSM FOC位置环S曲线控制算法(恒定急动度)

    文章目录 一 原理 二 代码 之前做FOC位置环控制的时候 简单地加了一个S曲线控制 参考链接如下 FOC 单电阻采样 位置环控制伺服电机 这里面代码实现其实就是在每step个ADC中断中 根据函数 f x
  • ODrive踩坑(四)AS5047P-SPI绝对值磁编码器,不需每次上电校准无刷电机,直接上电可用

    前几篇介绍了ODrive在Windows下的使用环境搭建 以及TLE5012B AS5047P的ABI配置 ODrive教程资源导航 ODrive踩坑 一 windows下使用环境的搭建 odrivetool及USB驱动的安装 ODrive
  • ODrive踩坑(五)ODrive驱动云台电机、低齿槽转矩电机实现高精度定位

    前几篇介绍了ODrive在Windows下的使用环境搭建 驱动3508 5008无刷电机 TLE5012B AS5047P的ABI编码器配置 AS5047P SPI绝对值编码器配置 ODrive踩坑 一 windows下使用环境的搭建 od

随机推荐

  • 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的