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

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

热门资讯

pid算法CSDN (pid算法C语言实现)

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

对于pid算法CSDN以及pidC语言实现,这两个主题是围绕进程标识符(PID)算法展开的。PID是操作系统中用来唯一标识每个进程的数字,它在进程管理和调度中起着至关重要的作用。在CSDN的博客或者其他技术文章中,通常会介绍PID算法的原理、实现过程以及在C语言中的具体应用。

PID算法的选择对于系统的性能和稳定性有着直接的影响。常见的PID算法包括顺序分配、循环分配、索引分配等。不同的算法适用于不同的系统场景,因此了解各种PID算法的特点和优劣势是非常重要的。

在C语言中实现PID算法需要对进程管理和内存分配有深入的了解。需要考虑进程标识符的唯一性、有效性以及分配和回收的效率等方面。同时,要确保在多任务操作系统中,进程的PID不能重复,这需要一定的算法设计和实现技巧。

对于想要了解PID算法以及在C语言中具体实现的开发者来说,这些文章可以提供宝贵的参考和学习资源。通过阅读这些文章,开发者可以更加深入地理解进程管理和操作系统的底层原理,从而提升自身的编程技能和系统设计能力。

PID算法CSDN和PID算法C语言实现是值得开发者深入研究的技术话题,通过学习这些内容,可以帮助开发者更好地理解系统编程和操作系统内部机制。


c语言 程序 倒立摆 求助 pid应用

#include stc12.h#include <intrins.h># unsigned charuint8;typedef unsigned int uint16;typedef unsigned long intuint32;/*********************************函数声明******************结构体设定***********************************************************/typedef struct PIDValue{uint32Ek_Uint32[3];//差值保存,给定和反馈的差值uint8 EkFlag_Uint8[3]; //差值标志位符号,1则对应的为负数,0为对应的为正数uint8 KP_Uint8;//比例系数uint8 KI_Uint8;//积分系数uint8 KD_Uint8;//微分显示uint16Uk_Uint16; //上一时刻的控制电压uint16RK_Uint16; //设定值uint16CK_Uint16; //实际值uint8 Vaule_Flag; //输出的值正负标志位,0为正,1为负}PIDValueStr;PIDValueStrPID; //定义一个结P构体uint16out ; // 加热输出(PID运算后的输出值)/***********************************************************************************增量型PID算式:PID :Uk=KP*[E(k)-E(k-1)]+KI*E(k)+KD*[E(k)-2E(k-1)+E(k-2)]函数入口: RK(设定值),CK(实际值),KP,KI,KD PID比例参数函数出口: U(K)PID运算函数**************************************************************************************/uint16 PID_Calc(uint16 PIDinput){uint32Temp[3];//中间临时变量uint32PostSum;//正数和uint32NegSum; //负数和Temp[0] = 0;//给储存中间临时变量赋初值Temp[1] = 0;Temp[2] = 0;PostSum = 0;//给存储所有的正数变量赋初值NegSum= 0;//给存储所有的负值变量赋初值 _Uint16=180;//设定值为_Uint16=PIDinput; //输入值 if( _Uint16 > _Uint16 ) //如果设定值大于实际值,就是当前的值比设定值小 {if( _Uint16 - _Uint16 >10 )//计算偏差是否大于 piancha=10 ( 这里的10由 piancha 来设定大小,根据实际情况设定)//if( _Uint16 - _Uint16 >piancha ){//如果偏差大于 piancha=10 不在设定的PID调控范围之内就全速加热out = 100;//偏差大于piancha=10为上限幅值输出(全速加热)// _Uint16 = full_speed;//全速时的加热值,更具实际情况可自由设定 这里full_speed=100;}else//如果偏差小于 piancha=10 再调节的范围内就计算储存起来 { //下面就是PID算法Temp[0] = _Uint16 - _Uint16; // 计算出当前偏差值E(k)_Uint8[1]=0;//E(k)为正数 的标志位 0为正,1为负 //数值移位 _Uint32[2] = _Uint32[1];//存储E(k-2)_Uint32[1] = _Uint32[0];//储存E(k-1)_Uint32[0] = Temp[0];//存储E(k)/****************************************************************************************/ if( _Uint32[0] >_Uint32[1] )//E(k)>E(k-1)为正数{Temp[0]=_Uint32[0] - _Uint32[1];//E(k)-E(k-1) 保存_Uint8[0]=0;// 设定标志位 0为正,1为负}else //E(k)<E(k-1){Temp[0]=_Uint32[1] - _Uint32[0]; //E(k)-E(k-1)为负数_Uint8[0]=1;}/*****************************************************************************************/ Temp[2]=_Uint32[1]*2 ; // 2E(k-1)if( (_Uint32[0]+ _Uint32[2])>Temp[2] )//E(k-2)+E(k)>2E(k-1){Temp[2]=(_Uint32[0]+ _Uint32[2])-Temp[2];//E(k-2)+E(k)-2E(k-1)为正数_Uint8[2]=0;}else//E(k-2)+E(k)-2E(k-1)为负数 {Temp[2]=Temp[2]-(_Uint32[0]+ _Uint32[2]);//2E(k-1)-(E(k-2)+E(k))_Uint8[2]=1; }/**********************************************************************************************/Temp[0] = (uint32)_Uint8 * Temp[0];// KP*[E(k)-E(k-1)] Temp[1] = (uint32)_Uint8 * _Uint32[0]; // KI*E(k) Temp[2] = (uint32)_Uint8 * Temp[2];// KD*[E(k-2)+E(k)-2E(k-1)]/************************以下部分代码是讲所有的正数项叠加,负数项叠加**************************//**************************************KP*[E(k)-E(k-1)]********************************************/if(_Uint8[0]==0)PostSum += Temp[0];//正数和elseNegSum += Temp[0]; //负数和/*************************************** KI*E(k)*************************************************/if(_Uint8[1]==0) PostSum += Temp[1]; //正数和else;//空操作,E(K)>0/************************************KD*[E(k-2)+E(k)-2E(k-1)]*************************************/if(_Uint8[2]==0) PostSum += Temp[2]; //正数和else NegSum += Temp[2];//负数和/**********************************************U(K)*************************************************///PostSum += (uint32)_Uint16;if(PostSum > NegSum ) // 是否控制量为正数{out= PostSum - NegSum; _Flag=0;//PID调节值是正值}else //控制量输出为负数 {out=NegSum-PostSum;_Flag=1; //PID调节值是负值} }//return out;} else//如果设定值小于实际值,就是当前的值大于设定值,就不进行PID计算直接输出 0 { out = 0; }return out;}

菜鸟提问:PID如何应用到C语言编程中?

PID控制速度,网上资料不少。 你现在的情况是把速度换成角度。 如果电压与角度关系较好,用 P 控制就可以了。 测得若干数据点,得当前平均电压-平均角度。 当角度超目标值 误差大于定值(或值。 -- 或字外面有个门),按比例计算新的电压。 如此闭环控制。 先试P控制吧。

怎样用c语言实现理想微分pid简单的计算机绘图程序

这是C语言的程序用的的积分分离,增量式算法你可以看看~在我用的片子是89C52/*********************************************************//* 名称: float PIDprocess1*//* 功能: PID adjust*//* 说明: *//* 调用: *//* 输入: float xdata *Yn, float xdata *Rn*//* 返回值: deltaPn *//*********************************************************/float PIDprocess1(){int data E_0;float data deltaPn,deltaPi,deltaPp,deltaPd,PsumCopy;E_0=SetTemperature1-CurrentTemperature1;if(abs(E_0)>Emax){deltaPp=(float)Kp*(E_0-E_11);deltaPd=(float)Kd*(E_0-2*E_11+E_21);//if(deltaPd>=dPdmax) deltaPd=0;deltaPn=deltaPp+deltaPd;}else{if(abs(E_0)>E0){deltaPi=(float)Ki*E_0*(Emax-abs(E_0))/(Emax-E0);}else{//小误差时的处理deltaPi=(float)Ki*E_0;// if(fabs(deltaPi)<dPimin) deltaPi=0;}deltaPp=(float)Kp*(E_0-E_11);deltaPd=(float)Kd*(E_0-2*E_11+E_21);//if(deltaPd>=dPdmax) deltaPd=0;deltaPn=deltaPp+deltaPi+deltaPd;}/* if(fabs(deltaPn)>dPmax){if(deltaPn>0) deltaPn=dPmax;else deltaPn=-dPmax;} */Psum1+=deltaPn;PsumCopy=Psum1;if(PsumCopy>Pmax) PsumCopy=Pmax;if(PsumCopy<Pmin) PsumCopy=Pmin;E_21=E_11;E_11=E_0;return(PsumCopy);}/*********************************************************//* 名称: float PIDprocess2 *//* 功能: PID adjust*//* 说明: *//* 调用: *//* 输入: float xdata Yn, float xdata Rn*//* 返回值: Psum2 *//*********************************************************/float PIDprocess2(){int data E_0;float data deltaPn,deltaPi,PsumCopy;E_0=SetTemperature2-CurrentTemperature2;if(abs(E_0)>Emax){deltaPn=(float)Kp*(E_0-E_12)+(float)Kd*(E_0-2*E_12+E_22);}else{if(abs(E_0)>E0){deltaPi=(float)Ki*E_0*(Emax-abs(E_0))/(Emax-E0);}else{//小误差时的处理deltaPi=(float)Ki*E_0;}deltaPn=(float)Kp*(E_0-E_12)+deltaPi+(float)Kd*(E_0-2*E_12+E_22);}/* if(fabs(deltaPn)>dPmax){if(deltaPn>0) deltaPn=dPmax;else deltaPn=-dPmax;}*/Psum2+=deltaPn;PsumCopy=Psum2;if(PsumCopy>Pmax) PsumCopy=Pmax;if(PsumCopy<Pmin) PsumCopy=Pmin;E_22=E_12;E_12=E_0;return(PsumCopy);}

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

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

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

pid算法CSDN (pid算法C语言实现) 第2张

发表评论

评论列表

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