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语言程序的推导)
最后更新于 2023-10-07 12:30:36 并被添加「」标签,已有 位童鞋阅读过。
本站使用「署名 4.0 国际」创作共享协议,可自由转载、引用,但需署名作者且注明文章出处
相关文章