我的编程空间,编程开发者的网络收藏夹
学习永远不晚

何为串级PID

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

何为串级PID

这篇文章主要讲解了“何为串级PID”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“何为串级PID”吧!

什么是串级PID?

什么是串级PID?顾名思义就是两个串起来的PID,下面是一个双闭环的例子,外环是位置环,内环是速度环,最终的执行器是电机,电机输出产生了速度和位置;具体框图如下图所示;

何为串级PID

当然执行器也可以是四轴飞行器,整体过程如下:

  • 我们在外环给定相应的位置高度,外环PID的输出就是内环PID的期望值;

  • 内环PID的输出将产生相应的油门大小,最终飞行器会产生上升的速度;

  • 内环反馈值为速度,控制相应的速度达到外环所需的速度期望值;

  • 最终外环达到期望的位置;

可能这里比较抽象,好吧,下面继续细化一下硬件的细节;

PID的算法控制其实是一种无系统模型的控制,可以根据参数经验经验去调试系统;

但是实际的物理对象的模型其实早就确定好了,PID的输入量和输出量的物理意义也会因为实际的被控对象而改变;

换句话说,PID的输入基本上和系统的反馈量相关,而实际的反馈量是什么,从一开始就因为系统而确定下来了;

内环和外环

如果外环是因,那内环就是果。万物皆有因果。

比如伺服控制器的三环:

  • 位置环

  • 速度环

  • 电流环

外环的变化会直接导致内环的变化,而内环是直接导致执行器变化的关键,如果这里依然使用飞行器作为例子,对于整个四轴飞行系统而言;

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2. 我们通过控制电机的电流,从而决定电机的输出扭矩;

  3. 扭矩和负载一起决定电机转速;

  4. 螺旋桨快速旋转从而产生了飞行器的升力,于是也决定了上升的速度;

  5. 最终也导致了飞行器的位置变化;

这是整个的控制过程。

如果只用单环的PID去控制系统,可以在给定系统期望的情况下达到所需要的位置吗?

答案是可以。

那这样串级PID还有什么意义吗?

答案是有。

我们试想一下,如果单纯使用单环PID去控制系统。

那我们看一下单环的PID系统框图;

何为串级PID

我们设定了一个高度,并且希望飞行器达到预期位置高度,那么这时候系统的反馈值只有位置量;

那么飞行器是以什么样的速度去飞行?以什么样的加速度去启动?我们就无法去有效地控制飞行器的速度,让它去快速地到达期望的位置,具体位置曲线如下图所示;

何为串级PID

其实不难理解,因为一开始的高度差很大,所以PID计算输出的值就很大,因此初始速度会非常大,随着飞行器越来越接近期望位置,偏差越来越小,PID输出量逐渐减小,因此速度逐渐减小。

其实很多时候,PID只是底层,称之为内环PID,通过它可以先稳定某个系统,优化动态特性,然后在外层嵌套其他算法,当然,外面有好几层PID的控制系统是也很常见的。也就是我们介绍的串级PID的系统,具体如下所示;

何为串级PID

控制器的本质是出入跟输出的函数映射关系。

其实从这个角度来看,通常PID适用于低阶的线性时不变系统,在此基础上限制到P,I,D三个系数。

整体还需要根据具体的系统,有所变化,有的系统其实只需要两个系数(比如PD或PI),甚至有的系统只需要一个就行(比如P)。因此上面系统中,外环只需要使用P环节就足够了,另外可以对速度曲线进行规划。

假设这里使用了速度曲线规划,因为可以对飞行器的速度进行控制了;

所以我们期望它尽快达到最大速度,因此从最开始的阶段进行匀加速,达到最大速度后开始匀速上升,即将到达期望位置的时候,进行匀减速,最终悬停到目标位置;

那么整体的位置变化曲线如下所示;

何为串级PID

换句说话说,就是外环PID的输出作为内环PID的输入;

下面是单环PID的伪算法;

previous_error := 0  //上一次偏差 integral := 0   //积分和  //循环  //采样周期为dt loop:  //setpoint 设定值  //measured_value 反馈值     error := setpoint − measured_value //计算得到偏差     integral := integral + error × dt //计算得到积分累加和     derivative := (error − previous_error) / dt //计算得到微分     output := Kp × error + Ki × integral + Kd × derivative //计算得到PID输出     previous_error := error //保存当前偏差为下一次采样时所需要的历史偏差     wait(dt) //等待下一次采用     goto loop

那么改成串级PID需要如何操作呢?

具体伪算法如下所示;

previous_error := 0  //上一次偏差 integral := 0   //积分和      previous_error_inner := 0  //内环PID上一次偏差 integral_inner := 0   //内环PID积分和           //循环  //采样周期为dt loop:   //外环计算  //setpoint 外环设定值  //measured_value 外环反馈值     error := setpoint − measured_value //计算得到偏差     integral := integral + error × dt //计算得到积分累加和     derivative := (error − previous_error) / (n*dt) //计算得到微分     output := Kp × error + Ki × integral + Kd × derivative //计算得到PID输出     previous_error := error //保存当前偏差为下一次采样时所需要的历史偏差      setpoint_inner = output //外环的PID输出赋值给内环的PID输入              wait(n*dt) //等待下一次采样  goto loop  loop_inner:         //setpoint_inner 内环设定值  //measured_value_inner 内环反馈值     error_inner := setpoint_inner − measured_value_inner //计算得到偏差     integral_inner := integral_inner + error_inner × dt //计算得到积分累加和     derivative_inner := (error_inner − previous_error_inner) / dt //计算得到微分     //计算得到PID输出     output_inner := Kp_inner × error + Ki_inner × integral_inner + Kd_inner × derivative_inner      previous_error_inner := error_inner //保存当前偏差为下一次采样时所需要的历史偏差     wait(dt) //等待下一次采样     goto loop_inner

这里将内环PID的相关变量加了后缀  _inner,loop是外环PID进行周期控制,loop_inner是内环PID进行周期控制,两者相互独立,将外环PID的输出赋值给内环PID的输入即可;

遇到干扰的时候,内环控制器首先进行粗调,外环控制器再进一步细调。

因此控制效果必然优于单环的PID控制系统。

串级控制系统在结构上仅仅比简单控制系统多了一个内环回路,可是实践证明,对于相同的干扰,串级控制系统的控制质量是简单控制系统无法比拟的。

PID参数

串级PID的参数整定基本遵循从内到外,先整定内环PID的参数,再整定外环PID的参数;

根据经验法调试参数,通常来说先整定内环比例参数P,然后整定积分参数I,动态特性可以整理微分参数D,当然还需要对饱和的情况进行处理;

总之可以观察输入输出曲线;

何为串级PID

那到底什么样的响应曲线算好的呢?

一般来说并不存在最优的,比如有的对速度和加速度有限制,有的系统一定不能出现超调量等等,有的系统则是响应越快越好。所以还是那句话,我不要你觉得,我要我觉得,合适才是最好的。

感谢各位的阅读,以上就是“何为串级PID”的内容了,经过本文的学习后,相信大家对何为串级PID这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

何为串级PID

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

2024-04-02

php如何将字符串转为utf8

这篇文章给大家分享的是有关php如何将字符串转为utf8的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。php是什么语言php,一个嵌套的缩写名称,是英文超级文本预处理语言(PHP:Hypertext Prepro
2023-06-15

php如何将字符串转为timestamp

这篇文章主要介绍了php如何将字符串转为timestamp,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。php将字符串转为timestamp(时间戳)的方法:1、使用strt
2023-06-15

javascript如何将值转为字符串

这篇文章将为大家详细讲解有关javascript如何将值转为字符串,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。转换方法:1、使用“+”运算符结合空字符串,语法“值+”;2、使用模板字符串,语法“${值}
2023-06-15

php如何转换json为字符串

这篇“php如何转换json为字符串”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“php如何转换json为字符串”文章吧。一
2023-07-06

PHP如何打断字符串为指定数量的字串

本文章介绍了如何将PHP字符串打断为指定数量的子字符串。提供三种解决方案:str_split()函数将字符串按长度分割,explode()函数按分隔符分割,substr()函数提取指定数量的字符。还提供了一个示例函数,演示如何将字符串打断并将其重新组合成新的字符串。
PHP如何打断字符串为指定数量的字串
2024-04-02

PHP如何把字符串分割为更小的字符串

PHP字符串分割可将字符串分解为更小字符串。常见方法包括:explode():按指定分隔符分割。str_split():按字符分割。preg_split():按正则表达式分割。substr_count():无明显分隔符时分割。选择方法取决于需求和性能考虑。explode()和str_split()性能最佳,preg_split()适用于复杂分割规则,substr_count()用于没有明确分隔符的情况。
PHP如何把字符串分割为更小的字符串
2024-04-02

Java如何把字符串分割为更小的字符串

本文介绍了Java中字符串分割技术,重点介绍了String.split()方法、正则表达式和其他方法。理解这些技术对于有效处理字符串数据至关重要。String.split()方法使用正则表达式分割字符串,而正则表达式则使用特殊字符定义匹配模式。其他方法包括substring()、indexOf()和lastIndexOf(),可用于根据字符位置和子字符串位置分割字符串。最佳实践包括使用最适合需求的方法、编写明确的正则表达式模式和测试代码。
Java如何把字符串分割为更小的字符串
2024-04-02

Python如何把字符串分割为更小的字符串

Python字符串分割详解Python提供了多种字符串分割方法,满足不同需求。str.split():基于指定分隔符分割,默认空白字符。str.splitlines():基于换行符分割。str.partition():将字符串分割为分隔符之前、分隔符和分隔符之后三部分。str.rpartition():从末尾开始执行str.partition()。re.split():使用正则表达式分割字符串,提供复杂模式匹配。根据需求选择最佳方法:简单分隔符:str.split()换行符:str.splitlines(
Python如何把字符串分割为更小的字符串
2024-04-02

Java如何打断字符串为指定数量的字串

Java提供多种方法将字符串拆分成指定数量的单词,包括用正则表达式和String类的split()方法。正则表达式更灵活,split()方法更简单。使用正则表达式时,可使用模式"s+"匹配一个或多个空格字符。使用split()方法时,可使用参数""匹配单个空格字符。选择方法取决于特定需求。正则表达式更灵活,split()方法更简单。此外,还需考虑空白字符处理、不规则文本和效率等因素。
Java如何打断字符串为指定数量的字串
2024-04-02

php如何将字符串转为小写

这篇文章给大家分享的是有关php如何将字符串转为小写的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。php将字符串转为小写的方法:1、strtolower()函数,可以将字符串中的字母全部转换为小写,语法“strt
2023-06-15

delphi字符串如何转化为指针

在Delphi中,可以使用PChar类型来表示字符串的指针。要将一个字符串转换为指针,可以使用StrPCopy函数或者使用字符串变量的PChar属性。下面是两种方法的示例代码:方法一:使用StrPCopy函数```delphivarstr:
2023-09-16

python如何合并列表为字符串

这篇文章主要介绍python如何合并列表为字符串,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!合并列表为字符串str_list = [hello, world, good] str1 = "".join(str_li
2023-06-27

php如何将字符串转为小数

本文小编为大家详细介绍“php如何将字符串转为小数”,内容详细,步骤清晰,细节处理妥当,希望这篇“php如何将字符串转为小数”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。php将字符串转为小数的方法:1、使用nu
2023-06-29

编程热搜

目录