c语言模拟pid

这个问题属于PID的自整定,有简单的接力算法。我试过,效果不理想。

说了半天也没找到好的自调程序,呵呵。

如果发现有用的东西,希望大家分享。

PID算法的c语言实现 基本过程

积分环节:主要用于消除静态误差(系统稳定后输出值与设定值的差值,积分环节实际上是偏差积累的过程,将积累的误差加到原系统中,抵消系统引起的静态误差)。

微分环节:反映偏差信号的变化规律,根据偏差信号的变化规律进行超前调整,增加系统的快速性。

以上公式离散化(采样):两个公式。

增量PID:

通过增量式PID公式可以看出,最终的表达式结果与最后三次的偏差有关,最终的输出结果应该是:

首先,定义结构变量体:

然后初始化变量。

最后,写控制算法。

基本算法不考虑死区问题,不设置上下限。

当设定开始、结束或大幅度增减时,系统输出在短时间内有较大偏差,会引起PID运算的积分累加,导致控制量超过执行器可能允许的最大动作范围对应的极限控制量,从而引起大的超调,甚至振荡。

为了克服这一问题,引入了积分分离的概念,即当被控量与设定值偏差较大时,取消积分功能;当被控量接近设定值时,引入积分控制以消除静态误差,提高精度。

Abs:绝对值

使index=0会使积分链接无效。

积分饱和现象:如果系统有一个方向的偏差,由于积分作用的不断累积,PID控制器的输出会增大,导致执行器到达极限位置。此时,计算器的输出超过正常工作范围,进入饱和区。一旦系统出现反向偏差,输出会逐渐退出饱和区。进入饱和带越深,从饱和带退出的时间就越长。在此期间,执行机构仍然停留在极限位置,而没有随着反向偏差立即做出相应的改变,导致性能恶化。

采用梯形积分可以减小残差,提高精度。

改变积分系数,如果偏差较大,积分效果减弱,系数降低;如果偏差较小,则积分函数增强,系数增大。

变积分PID的基本思想是试图改变积分项的累加速度,使其与偏差相对应。

使得整个系统的稳定性非常快。

比例系数Kp的作用是加快系统的响应速度,提高系统的调节精度。

积分系数Ki的作用是消除系统的稳态误差。

微分系数Kd的作用是改善系统的动态特性。

反映系统性能的两个参数是系统误差和误差变化规律。

c语言编程,如何计算PID控制 由Step 7编写的PID控制的FC模块。如果前缀相同,带“_IN”和“_OUT”的变量必须连接到同一个变量。

功能FC1:无效

变量_输入

run:BOOL;//真-运行,假-停止。

auto:BOOL;//True-自动,False-手动。

ISW:布尔;//真积分有效,假积分无效。

DSW:布尔;//真-微分有效,假-微分无效。

SetMV:REAL;//手动开度设定值

SVSW:真实;//当设定值低于SVSW时,开度为零。

PV:真实;//测量值

SV:真实;//设置值

死区:真实;//死区大小

PBW:真实;//比例带大小

IW:真实;//整数带大小

DW:真实;//不同的波段大小

dErr _ IN:REAL;//误差累积

LastPV _ IN:REAL;//上一个控制周期的测量值

结束变量

VAR _输出

MV:真实;//输出开口

dErr _ OUT:REAL;//误差累积

LastPV _ OUT:REAL;//上一个控制周期的测量值

结束变量

增值转销公司

Err:真实;//错误

dErr:真实;//误差累积

PBH:真实;//比例带上限

PBL:真实;//比例带下限

PVC:真实;//一个控制周期内测量值的变化率,即测量值的变化率。

p:真实;//比例项

我:真实;//积分项

d:真实;//微分项

结束变量

如果Run=1,则

如果Auto=1,则

如果SV=SVSW,则

err:= SV-PV;

PBH:= SV PBW;

PBL:= SV-PBW;

如果PVPBL那么

MV:= 1;

ELSIF PVPBH然后

MV:= 0;

其他

p:=(PBH-PV)/(PBH-PBL);//计算比例项

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////

如果ISW=1,那么

dErr:= dErr _ IN;

如果(PV(SV死区))或(PV(SV死区)),则

IF (dErr Err)(0-IW)那么

dErr:= 0-IW;

然后是埃尔西夫·IW

dErr:= IW;

其他

dErr:= dErr Err;

END _ IF

END _ IF

我:=德尔/IW;

dErr _ OUT:= dErr;

其他

I:= 0;

END _ IF

/////////////////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////以下是微分项的计算。

如果DSW=1,那么

PVC:= LastPV _ IN-PV;

d:= PVC/DW;

LastPV _ OUT:= PV;

其他

d:= 0;

END _ IF

/////////////////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

如果(P I D)1,则

MV:= 1;

埃尔西弗(私人侦探)0然后

MV:= 0;

其他

MV:= P I D;

END _ IF

END _ IF

其他

MV:= 0;

END _ IF

其他

MV:= SetMV;

END _ IF

其他

MV:= 0;

END _ IF

结束功能

先调整P使I和D无效,观察温度变化曲线。如果变化曲线多次出现波形,比例(P)的参数要放大,如果变化曲线非常平缓,比例(P)的参数要减小。设置比例(P)参数后,设置积分(I)参数。积分(I)正好与P参数相反。如果曲线是平的,积分(I)需要放大,如果有多个波形,积分(I)需要缩小。设定好比例(P)和积分(I)后,再设定微分(D)参数,微分(D)参数的设定方法与比例(P)参数相同。

当初编写这个程序是为了用功率调节器来控制炉温,目前已经在我单位的功率调节器上成功运行。另外,我单位的功率调节器不用微分(D),只用比例(P)和积分(I)。

pid算法是什么,难学吗,如何用C语言和plc实现? 一、什么是PID:

PID是比例、积分、微分的缩写。顾名思义,PID控制算法是结合了比例、积分、微分三个环节的控制算法。它是连续系统中最成熟、应用最广泛的控制算法。这种控制算法出现于20世纪三四十年代,适用于被控对象模型不明确的情况。-百度百科

二、PID难学吗?

PID及其衍生算法是工业应用中最广泛的算法之一,是当之无愧的通用算法。如果能熟练掌握PID算法的设计和实现过程,普通R&D人员处理一般的R&D问题应该足够了。难能可贵的是,在我接触过的控制算法中,PID控制算法最简单,最能体现反馈思想,可谓经典。经典不一定复杂。经典往往是简单的,最简单的。想想牛顿的力学三定律,爱因斯坦的质能方程。多简单啊!简单不原始,简单不落后,简单就是美。- 【1】

PID算法的c语言源代码:

PID控制算法可分为位置PID和增量PID控制算法。

详见参考文献[1]和[2]。

参考:

[1] PID算法

[2]简单PID算法快速识字(超详细程序中C语言程序的推导)

相关文章

发表新评论