【易客吧】_全网激活码总代_激活码商城

您现在的位置是:首页 > 热门资讯 > 正文

热门资讯

pid算法c程序 (pid算法C语言实现)

用户投稿2024-03-30热门资讯49
pid算法c程序 (pid算法C语言实现) 第1张

在计算机编程中,PID(Process ID)是进程标识符,是操作系统用来唯一标识每个运行中进程的数字。PID算法是用来生成这些进程标识符的算法之一。下面是一个使用C语言实现的PID算法程序:

```C#include #include #include int generate_pid() { srand(time(0)); int pid = rand() % 32767 + 32768; return pid;}int main() { int pid = generate_pid(); printf("Generated PID: %d ", pid); return 0;}```

这段代码首先包含了`stdio.h`、`stdlib.h`和`time.h`三个头文件,然后定义了一个函数`generate_pid()`用来生成PID,最后在`main()`函数中调用`generate_pid()`来获取PID并打印出来。

在`generate_pid()`函数中,首先调用`srand(time(0))`来用当前时间设置随机数种子,这样每次程序运行时生成的随机数序列都不同。然后使用`rand() % 32767 + 32768`生成一个范围在32768到65535之间的随机数作为PID,并返回给调用者。

这个PID算法的实现比较简单,它利用了C语言的随机数生成函数`rand()`和`time()`函数来保证每次生成的PID都是不同的。这种简单的实现也存在一些问题:

1. 范围限制:虽然本程序生成的PID在32768到65535之间,但这个范围仍然是有限的。在一个长时间的运行中,可能会出现PID重复的情况。为了提高独一性,可能需要引入更复杂的算法来生成更大范围的PID。

2. 随机性:本程序使用了时间作为随机数种子,但这样的方式并不能保证生成的随机数是真正随机的。在一些特定情况下,可能会出现随机数分布不均匀的情况。为了提高随机性,可以考虑引入更复杂的随机数生成算法。

3. 可读性:虽然本程序实现了PID生成的基本功能,但在实际应用中,PID的生成往往还需要考虑一些其他因素,比如PID的唯一性、稳定性等。这些因素可能需要更复杂的算法来实现。

虽然这个简单的PID算法C程序实现了基本的PID生成功能,但在实际应用中可能需要更复杂的算法来保证生成的PID的独一性、随机性和稳定性。需要根据具体的应用场景来选择适合的PID生成算法。


PID算法的C语言实现

基本流程

积分环节:主要是用来消除 静差 (系统稳定后输出值和设定值之间的差值,积分环节实际上就是偏差累积的过程,把累积的误差加到原来系统上以抵消系统造成的静差)

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

对上述公式进行离散化(采样):两个公式

增量型PID:

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

首先定义结构变量体:

然后初始化变量

最后编写控制算法

基本算法,没有考虑死区问题,没有设定上下限

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

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

abs :绝对值

令index=0使积分环节失效

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

采用梯形积分能够减小余差,提高精度

改变积分系数,若偏差大,积分作用减弱,系数减小;若偏差小,积分作用增强,系数增大。

变积分PID的基本思想是设法改变积分项的累加速度,使其与偏差大小对应。

使整个系统的稳定速度非常快

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

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

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

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

C语言编程,怎么计算PID控制

Step 7写的PID控制的FC模块。 带_IN与带_OUT的变量,如果前缀是一样的,要求连接同一个变量。 FUNCTION FC1 : VOID VAR_INPUT Run:BOOL; //True-运行,False-停止 Auto:BOOL; //True-自动,False-手动 ISW:BOOL; //True-积分有效,False-积分无效 DSW:BOOL; //True-微分有效,False-微分无效 SetMV:REAL; //手动时的开度设定值 SVSW:REAL; //当设定值低于SVSW时,开度为零 PV:REAL; //测量值 SV:REAL; //设定值 DeadBand:REAL; //死区大小 PBW:REAL; //比例带大小 IW:REAL; //积分带大小 DW:REAL; //微分带大小 dErr_IN:REAL; //误差累积 LastPV_IN:REAL; //上一控制周期的测量值 END_VAR VAR_OUTPUT MV:REAL; //输出开度 dErr_OUT:REAL; //误差累积 LastPV_OUT:REAL;//上一控制周期的测量值 END_VAR VAR Err:REAL; //误差 dErr:REAL; //误差累积 PBH:REAL; //比例带上限 PBL:REAL; //比例带下限 PVC:REAL; //测量值在一个控制周期内的变化率,即测量值变化速率 P:REAL; //比例项 I:REAL; //积分项 D:REAL; //微分项 END_VAR IF Run=1 THEN IF Auto=1 THEN IF SV>=SVSW THEN Err:=SV-PV; PBH:=SV+PBW; PBL:=SV-PBW; IF PV<PBL THEN MV:=1; ELSIF PV>PBH THEN MV:=0; ELSE P:=(PBH-PV)/(PBH-PBL); //计算比例项//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////以下为积分项的计算////////////////////////////////////////////////////////////// IF ISW=1 THEN dErr:=dErr_IN; IF (PV<(SV-DeadBand)) OR (PV>(SV+DeadBand)) THEN IF (dErr+Err)<(0-IW) THEN dErr:=0-IW; ELSIF (dErr+Err)>IW THEN dErr:=IW; ELSE dErr:=dErr+Err; END_IF; END_IF; I:=dErr/IW; dErr_OUT:=dErr; ELSE I:=0; END_IF;/////////////////////////////////////////////以上为积分项的计算////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////以下为微分项的计算////////////////////////////////////////////////////////////// IF DSW=1 THEN PVC:=LastPV_IN-PV; D:=PVC/DW; LastPV_OUT:=PV; ELSE D:=0; END_IF;/////////////////////////////////////////////以上为微分项的计算/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// IF (P+I+D)>1 THEN MV:=1; ELSIF (P+I+D)<0 THEN MV:=0; ELSE MV:=P+I+D; END_IF; END_IF; ELSE MV:=0; END_IF; ELSE MV:=SetMV; END_IF; ELSE MV:=0; END_IF;END_FUNCTION进行整定时先进行P调节,使I和D作用无效,观察温度变化曲线,若变化曲线多次出现波形则应该放大比例(P)参数,若变化曲线非常平缓,则应该缩小比例(P)参数。 比例(P)参数设定好后,设定积分(I)参数,积分(I)正好与P参数相反,曲线平缓则需要放大积分(I),出现多次波形则需要缩小积分(I)。 比例(P)和积分(I)都设定好以后设定微分(D)参数,微分(D)参数与比例(P)参数的设定方法是一样的。 当初写这段程序的就是为了使用调功器来控制炉子的温度的,已经在我单位的调功器上运行成功了,还有就是我单位的调功器没有使用微分(D),只是用了比例(P)和积分(I)。

8位单片机PID控制PWM的算法如何实现,C语言计算?

PID控制在8位单片机中仍然有广泛的应用,比如温度控制,利用比例、积分、微分补偿来做恒温补偿控制,当然由于有这些数学处理,用C语言相对方便一些,以下是一个具体的实例。

struct PID {

unsigned int SetPoint; // 设定目标 Desired Value

unsigned int Proportion; // 比例常数 Proportional Const

unsigned int Integral; // 积分常数 Integral Const

unsigned int Derivative; // 微分常数 Derivative Const

unsigned int LastError; // Error[-1]

unsigned int PrevError; // Error[-2]

unsigned int SumError; // Sums of Errors

struct PID spid; // PID Control Structure

unsigned int rout; // PID Response (Output)

unsigned int rin; // PID Feedback (Input)

sbit cellpadding=0 cellspacing=0>

若对本页面资源感兴趣,请点击下方或右方图片,注册登录后

搜索本页相关的【资源名】【软件名】【功能词】或有关的关键词,即可找到您想要的资源

如有其他疑问,请咨询右下角【在线客服】,谢谢支持!

pid算法c程序 (pid算法C语言实现) 第2张

发表评论

评论列表

  • 这篇文章还没有收到评论,赶紧来抢沙发吧~
你上次访问网站的时间为:24-05-20,15:32:44 你第10访问网站的时间为:24-05-20 15:32:47