PID控制器开发笔记之九:基于前馈补偿的PID控制器的实现

对于一般的时滞系统来说,设定值的变动会产生较大的滞后才能反映在被控变量上,从而产生合理的调节。而前馈控制系统是根据扰动或给定值的变化按补偿原理来工作的控制系统,其特点是当扰动产生后,被控变量还未变化以前,根据扰动作用的大小进行控制,以补偿扰动作用对被控变量的影响。前馈控制系统运用得当,可以使被控变量的扰动消灭在萌芽之中,使被控变量不会因扰动作用或给定值变化而产生偏差,它较之反馈控制能更加及时地进行控制,并且不受系统滞后的影响。

1、前馈控制基本思想

在高精度伺服控制中,前馈控制可用来提高系统的跟踪性能。经典控制理论中的前馈控制设计是基于复合控制思想的,当闭环系统为连续系统时,使前馈环节与闭环系统的传递函数之积为1,从而实现输出完全复现输入。其系统结构图如下:

从上图中,我们可以发现前馈环节的传递函数是被控对象的倒数。那么就是在使用前馈控制前我们需要对被控对象的模型有了解,才能有针对性的设计出合适的前馈控制器。也就说,每个系统的前馈控制器都是不一样的,每个前馈控制器都是专用的。

要实施前馈控制,首先我们必须得到被控系统的近似模型,这个模型越接近真实的系统,控制的效果就越明显。在这里我们假定一个被控对向的模型为:

那么前馈控制器是被控对象的倒数,于是我们可以推导出前馈控制器的输入输出表达式为:

我们将其离散化,就可以得到我们想要实现的前馈控制器的输出公式。前馈控制器的输入是设定值,所以表示如下:

2、算法实现

经过上面的分析我们可以实现一个前馈控制器,前馈控制器的输出与设定值当前值、前一拍的值以及前两拍的只有关。也就是说如果设定值长时间不变化,该前馈控制器是不起作用的。当然每一个前馈控制器都是不一样的。

由于A、B、T均为常数于是我们为了书写方便,令α=A/(B*T),β=1/(B*T*T)于是我们可以先实现前馈控制器。定义一个前馈控制器的结构体:

/*定义前馈控制器的结构体*/
typedef struct{float rin;float lastRin;float perrRin;
}FFC/*实现前馈控制器*/
float FeedforwardController(FFC vFFC)
{float result;result=α*(vFFC->rin-vFFC->lastRin)+β*(vFFC->rin-2*vFFC->lastRin+vFFC->perrRin);vFFC->perrRin= vFFC->lastRin;vFFC->lastRin= vFFC->rin;return result;
}

有了这个前馈控制器,只需要与PID控制器的输出合并在一起就好了U(k)=Up(k)+Uf(k),而PID控制器采用位置型还是增量型都没有关系。不过在调用这两个控制器时需:

vFFC->rin=vPID-> setpoint

3、总结

前馈控制器是一种补偿控制,或者说模型控制,其特点就是必须能得到被控对象的精确模型或者近似模型才能起到较好的控制效果。对于时滞系统的模型控制有很多方法,前馈控制是其中比较简单和应用较广的算法。

系统中存在频率高、幅度大、可测量而不可控的扰动时,可选用前馈控制。当控制系统控制通道滞后时间长、反馈控制又不能获得良好效果时,可选用前馈控制。

欢迎关注:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499481.shtml

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

相关文章

借助百度识图爬取数据集

背景 一个能够实际应用的深度学习模型,背后的数据集往往都花费了大量的人力财力,通过聘用标注团队对真实场景数据进行标注生产出来,大多数情况不太可能使用网络来源的图片。但在项目初期的demo阶段,或者某些特定的场合下&#xf…

通过printf从目标板到调试器的输出

最近在SEGGER的博客上看到Johannes Lask写的一篇关于在调试时使用printf函数从目标MCU输出信息到调试器的文章,自我感觉很有启发,特此翻译此文并推荐给各位同仁。当然限于个人水平,有不当之处恳请指正。原文网址:https://blog.seg…

小心使用tf.image.resize_images,填坑经验分享给你

上上周,我在一个项目上线前对模型进行测试时出现了问题,这个问题困扰了我近两周,终于找到了问题根源,做个简短总结分享给你,希望对大家有帮助。 问题描述: 线上线下测试结果不一致,且差异很大…

PID控制器开发笔记之十:步进式PID控制器的实现

对于一般的PID控制系统来说,当设定值发生较大的突变时,很容易产生超调而使系统不稳定。为了解决这种阶跃变化造成的不利影响,人们发明了步进式PID控制算法。 1、步进式PID的基本思想 所谓步进式PID算法,实际就是在设定值发生阶跃…

AutoML 与 Bayesian Optimization 概述

1. AutoML 概述 AutoML是指对于一个超参数优化任务(比如规定计算资源内,调整网络结构找到准确率最高的网络),尽量减少人为干预,使用某种学习机制,来调节这些超参数,使得目标问题达到最优。 这…

使用Eclipse进行Makefile项目

最近在MCU on Eclipse网站上看到Erich Styger所写的一篇有关在Eclipse中使用Makefile创建项目的文章,文章讲解清晰明了非常不错,所以呢没人将其翻译过来供各位同仁参考。当然限于个人水平,有不当之处恳请指正。原文网址:https://m…

C语言学习及应用笔记之一:C运算符优先级及使用问题

C语言中的运算符绝对是C语言学习和使用的一个难点,因为在2011版的标准中,C语言的运算符的数量超过40个,甚至比关键字的数量还要多。这些运算符有单目运算符、双目运算符以及三目运算符,又涉及到左结合和右结合的问题,真…

使用FreeRTOS进行性能和运行时分析

在MCU on Eclipse网站上看到Erich Styger在2月25日发的博文,一篇关于使用FreeRTOS进行性能和运行分析的文章,本人觉得很有启发,特将其翻译过来以备参考。当然限于个人水平,有描述不当之处恳请指正。原文网址:https://m…

生成微信公众号对应二维码的两种简单方法

方法1 在浏览器中打开下面的链接 https://open.weixin.qq.com/qr/code?usernameName 其中Name替换为对应公众号的微信号 例如,我们打算生成公众号 AI算法联盟 的二维码 只需首先关注这个公众号 在其详细信息中,查找到微信号信息:AIReport…

在Amazon FreeRTOS V10中使用运行时统计信息

在MCU on Eclipse网站上看到Erich Styger在8月2日发的博文,一篇关于在Amazon FreeRTOS V10中使用运行时统计信息的文章,本人觉得很有启发,特将其翻译过来以备参考。原文网址:https://mcuoneclipse.com/2018/08/02/tutorial-using-…

github无法加载图片的解决办法

最近发现我的github上面项目README里面的图片全裂了,一直以为是github最近服务器不稳定。今天通过简单的查询,发现原来这个问题可以解决,但是不能永久有效,之后还会用到,因此记录在这里, 也分享给大家。 解…

C语言学习及应用笔记之二:C语言static关键字及其使用

C语言有很多关键字,大多关键字使用起来是很明确的,但有一些关键字却要相对复杂一些。我们这里要说明的static关键字就是如此,它的功能很强大,相应的使用也就更复杂。 一般来说static关键字的常见用法有三种:一是用作局…

μCUnit,微控制器的单元测试框架

在MCU on Eclipse网站上看到Erich Styger在8月26日发布的博文,一篇关于微控制器单元测试的文章,有很高的参考价值,特将其翻译过来以备学习。原文网址:https://mcuoneclipse.com/2018/08/26/tutorial-%CE%BCcunit-a-unit-test-fram…

PID控制器开发笔记之十一:专家PID控制器的实现

前面我们讨论了经典的数字PID控制算法及其常见的改进与补偿算法,基本已经覆盖了无模型和简单模型PID控制经典算法的大部。再接下来的我们将讨论智能PID控制,智能PID控制不同于常规意义下的智能控制,是智能算法与PID控制算法的结合&#xff0c…

Modbus协议栈开发笔记之七:Modbus ASCII Slave开发

与Modbus RTU在串行链路上分为Slave和Master一样,Modbus ASCII也分为Slave和Master,这一节我们就来开发Slave。对于Modbus ASCII从站来说,需要实现的功能其实与Modbus RTU的Slave是一样的。其操作过程也是一样的。首先接收到主站的访问命令&a…

Modbus协议栈开发笔记之八:Modbus ASCII Master开发

这一节我们来封装Modbus ASCII Master应用,Modbus ASCII主站的开发与RTU主站的开发是一致的。同样的我们也不是做具体的应用,而是实现ASCII主站的基本功能。我们将ASCII主站的功能封装为函数,以便在开发具体应用时调用。 对于ASCII主站我们主…

在Eclipse中使用Git

本文原文出自MCU on Eclipse网站,作者为Erich Styger,原文网址:https://mcuoneclipse.com/2018/09/30/tutorial-git-with-eclipse/。本人翻译了此篇文章,有些短语难以找到准确表达的中文词语,所以保持了原文。限于个人…

C语言学习及应用笔记之三:C语言const关键字及其使用

在C语言程序中,const关键字也是经常会用到的一个关键字,那么使用const关键字的目的是什么呢?事实上,在程序中使用const关键字的主要目的就是为了向使用者传递设计者的一些意图。 事实上,无论我们是使用const关键字声明…

nlp cs224n 学习笔记1 Introduction and Word Vectors

注:个人笔记,价值有限,不建议逗留。 word embedding 的意义和目的? 通过一种映射,将自然语言中的单词,嵌入到n维欧式空间中,得到可以用数学语言表达并用计算机计算的“词向量”。 同时我们希望…

Modbus协议栈开发笔记之一:实现功能的基本设计

Modbus作为开放式的工业通讯协议,在各种工业设备中应用极其广泛。本人也使用Modbus通讯很多年了,或者用现成的,或者针对具体应用开发,一直以来都想要开发一个比较通用的协议栈能在后续的项目中复用,而不必每次都写一遍…