找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 677|回复: 20
打印 上一主题 下一主题
收起左侧

请教什么是PID控制?有最简单的例程吗?能理解的那种

  [复制链接]
跳转到指定楼层
楼主
ID:891876 发表于 2024-3-19 09:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请教如题,谢谢!
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:69038 发表于 2024-3-19 14:06 | 只看该作者
有一个很好理解的“例程”。。。
你有没有过背上发痒,自己抓不到,请别人帮忙抓痒的经历?
“左边。”
“再左一点。”
“过了过了,返回去一点。”
“再返回去一小点。”
“对对对,就是这,使劲抓。。”
回复

使用道具 举报

板凳
ID:1112840 发表于 2024-3-19 14:26 来自手机 | 只看该作者
PID控制是一种常见的反馈控制算法,它通过比例(Proportional)、积分(Integral)、微分(Derivative)三个环节来调整控制器输出,以便让系统输出尽可能接近期望值。简单来说,PID控制就是一个调节过程,它可以根据当前值与目标值之间的差异(偏差),动态地调整输出,以达到控制目标。
回复

使用道具 举报

地板
ID:883242 发表于 2024-3-19 15:05 | 只看该作者
zhuls 发表于 2024-3-19 14:06
有一个很好理解的“例程”。。。
你有没有过背上发痒,自己抓不到,请别人帮忙抓痒的经历?
“左边。”

PID就是中间有大的时间延迟环节的控制方法,从发出命令到实际执行有很长时间的不响应,其目的就是为了防止你说的“过了过了,返回去一点。”这种事情的发生。如果允许“过了”,完全没必要用PID,直接反馈多简单啊!
回复

使用道具 举报

5#
ID:69038 发表于 2024-3-19 15:19 | 只看该作者
Hephaestus 发表于 2024-3-19 15:05
PID就是中间有大的时间延迟环节的控制方法,从发出命令到实际执行有很长时间的不响应,其目的就是为了防 ...

某些执行有惯量存在,一下子调整过头是很正常的。
而如果一味的延迟,又似乎达不到快速控制的目的。
所以,调节量在目标值附近往返拉锯、飘忽不定,也算是正常的。
记得做过一款U段射频产品,是PLL+VCO方式 ,PLL输出就是一个类似三角波叠加一个直流成分的波形。当然,这个三角波有幅度很小。

回复

使用道具 举报

6#
ID:961114 发表于 2024-3-19 16:55 | 只看该作者
四轴飞控里 都有PID的应用 四轴飞控-STC32G12K128-LQFP48.zip (219.1 KB, 下载次数: 19)
回复

使用道具 举报

7#
ID:517951 发表于 2024-3-20 07:40 | 只看该作者
PID 在车辆行驶中的应用: 定速巡航功能, 当车行驶途中有上坡时候, 单片机自动加油门; 下坡时候, 单片机自动减油门, 这样时钟保持速度恒定. 80km时速设定100km时速, 单片机会自动加油门加速到100km的时速后,维持100km速度保持恒速.
回复

使用道具 举报

8#
ID:420836 发表于 2024-3-20 08:24 | 只看该作者
这个论坛里有很多PID控制的例子。 可以搜索一些最好的并从中学习。
回复

使用道具 举报

9#
ID:458247 发表于 2024-3-20 08:41 | 只看该作者
rayin 发表于 2024-3-20 07:40
PID 在车辆行驶中的应用: 定速巡航功能, 当车行驶途中有上坡时候, 单片机自动加油门; 下坡时候, 单片机自动 ...

自适应巡航不是用的pid,是另一种算法;定速巡航不太清楚
回复

使用道具 举报

10#
ID:401564 发表于 2024-3-20 12:48 | 只看该作者
首先,你要把PID里的微积分之类的排除,虽然它是这么叫的,但它本质上只有加法和简洁,除法
以温度为例子
P就是比例,假设你设定的P为10,设定温度为100度,当前温度为50
那么,这个时候,P项的输出为: (100 - 50) * 10 = 500,这个500可能换算成PWM的占空比,或者是加热功率,这其中的换算过程,可以认为是在调试PID的过程
I就是积分项,就是把误差不断的累加,累加的结果可能是正数,也可能是负数,再*I,加上P项,就是一个PI输出的结果了
这就是PI控制,这里面没有说到D项,因为PI控制能解决大多的问题,一旦你理解了PI控制,自然就能理解PID控制了
回复

使用道具 举报

11#
ID:1110945 发表于 2024-3-20 13:32 | 只看该作者
以前在网上抄的一段,记不清在哪儿抄的了。

pid算法详细介绍
  一、PID算法简介
  在智能车竞赛中,要想让智能车根据赛道的不断变化灵活的行进,PID算法的采用很有意义。
  首先必须明确PID算法是基于反馈的。一般情况下,这个反馈就是速度传感器返回给单片机当前电机的转速。简单的说,就是用这个反馈跟预设值进行比较,如果转速偏大,就减小电机两端的电压;相反,则增加电机两端的电压。
  顾名思义,P指是比例(Proportion),I指是积分(Integral),D指微分(Differential)。在电机调速系统中,输入信号为正,要求电机正转时,反馈信号也为正(PID算法时,误差=输入-反馈),同时电机转速越高,反馈信号越大。要想搞懂PID算法的原理,首先必须先明白P,I,D各自的含义及控制规律:
  比例P:比例项部分其实就是对预设值和反馈值差值的发大倍数。举个例子,假如原来电机两端的电压为U0,比例P为0.2,输入值是800,而反馈值是1000,那么输出到电机两端的电压应变为U0+0.2*(800-1000)。从而达到了调节速度的目的。显然比例P越大时,电机转速回归到输入值的速度将更快,及调节灵敏度就越高。从而,加大P值,可以减少从非稳态到稳态的时间。但是同时也可能造成电机转速在预设值附近振荡的情形,所以又引入积分I解决此问题。
  积分I:顾名思义,积分项部分其实就是对预设值和反馈值之间的差值在时间上进行累加。当差值不是很大时,为了不引起振荡。可以先让电机按原转速继续运行。当时要将这个差值用积分项累加。当这个和累加到一定值时,再一次性进行处理。从而避免了振荡现象的发生。可见,积分项的调节存在明显的滞后。而且I值越大,滞后效果越明显。
  微分D:微分项部分其实就是求电机转速的变化率。也就是前后两次差值的差而已。也就是说,微分项是根据差值变化的速率,提前给出一个相应的调节动作。可见微分项的调节是超前的。并且D值越大,超前作用越明显。可以在一定程度上缓冲振荡。比例项的作用仅是放大误差的幅值,而目前需要增加的是“微分项”,它能预测误差变化的趋势,这样,具有比例+微分的控制器,就能够提前使抑制误差的控制作用等于零,甚至为负值,从而避免了被控量的严重超调。
  由各个参数的控制规律可知,比例P使反应变快,微分D使反应提前,积分I使反应滞后。在一定范围内,P,D值越大,调节的效果越好。
  二、PID调试一般原则
  a. 在输出不振荡时,增大比例增益P。
  b. 在输出不振荡时,减小积分时间常数Ti。
  c. 输出不振荡时,增大微分时间常数Td。
  三、pid算法参数调整一般步骤
  a.确定比例增益P
  确定比例增益P 时,首先去掉PID的积分项和微分项,一般是令Ti=0、Td=0,PID为纯比例调节。输入设定为系统允许的最大值的60%~70%,由0逐渐加大比例增益P,直至系统出现振荡;再反过来,从此时的比例增益P逐渐减小,直至系统振荡消失,记录此时的比例增益P,设定PID的比例增益P为当前值的60%~70%。比例增益P调试完成。
  b.确定积分时间常数Ti
  比例增益P确定后,设定一个较大的积分时间常数Ti的初值,然后逐渐减小Ti,直至系统出现振荡,之后在反过来,逐渐加大Ti,直至系统振荡消失。记录此时的Ti,设定PID的积分时间常数Ti为当前值的150%~180%。积分时间常数Ti调试完成。
  c.确定积分时间常数Td
  积分时间常数Td一般不用设定,为0即可。若要设定,与确定 P和Ti的方法相同,取不振荡时的30%。
  d.系统空载、带载联调,再对PID参数进行微调,直至满足要求
  找三个以上PID算法应用实例,结合实例明确参数调试的方法以及参数的意义,同时给小组成员做介绍
  四、pid算法应用环境
  当被控对象的结构和参数不能完全掌握,或得不到精确的数学模型时,控制理论的其它技术难以采用时,系统控制器的结构和参数必须依靠经验和现场调试来确定;(由于赛道的参数事先未知,所以只能根据实时采集到的赛道数据控制小车沿着赛道行进)。
  五、PID算法原理
  在工业应用中PID及其衍生算法是应用最广泛的算法之一,是当之无愧的万能算法,如果能够熟练掌握PID算法的设计与实现过程,对于一般的研发人员来讲,应该是足够应对一般研发问题了,而难能可贵的是,在我所接触的控制算法当中,PID控制算法又是最简单,最能体现反馈思想的控制算法,可谓经典中的经典。经典的未必是复杂的,经典的东西常常是简单的,而且是最简单的,想想牛顿的力学三大定律吧,想想爱因斯坦的质能方程吧,何等的简单!简单的不是原始的,简单的也不是落后的,简单到了美的程度。先看看PID算法的一般形式:
  PID的流程简单到了不能再简单的程度,通过误差信号控制被控量,而控制器本身就是比例、积分、微分三个环节的加和。这里我们规定(在t时刻):
  1.输入量为rin(t);
  2.输出量为rout(t);
  3.偏差量为err(t)=rin(t)-rout(t);
  pid的控制规律为
  理解一下这个公式,主要从下面几个问题着手,为了便于理解,把控制环境具体一下:
  1.规定这个流程是用来为直流电机调速的;
  2.输入量rin(t)为电机转速预定值;
  3.输出量rout(t)为电机转速实际值
  4.执行器为直流电机;
  5.传感器为光电码盘,假设码盘为10线;
  6.直流电机采用PWM调速转速用单位转/min表示;不难看出以下结论:
  1.输入量rin(t)为电机转速预定值(转/min);2.输出量rout(t)为电机转速实际值(转/min);3.偏差量为预定值和实际值之差(转/min)
  六、PID算法应用——线性控制原理
  PID控制的三要素:控制器,被控对象,反馈器。控制器就是一个数学模型,就PID来说,等同于PID算法。是对反馈量的一个处理与输出。通俗的说就是对于每个被控的量,我的输出量通过什么函数式算出,或者说,我如何描述我的输出量。现在我给定一个描述性的传递函数。从数学角度来看:它的自变量是反馈值,当这个函数的对应关系确定了之后,输出量就是个定值了。我的希望是:这个描述函数是一个透明的空箱——它既能反映系统外部特性,又可以看到其内部结构。
  就拿比赛来说:假设我现在要构建这样一个闭环系统,这个系统的反馈调节建立了一个描述函数,最根本的在于:
  1 这个系统的动态性从根本上讲取决于哪些因素;2这些因素如何决定系统的性能;
  数学模型的描述:1 描述函数-》微分方程。描述函数的自变量与因变量满足微分方程。(瞬间变化的关系式)
  2 将微分方程做一个处理,得出其特征方程,这个特征方程称作描述函数的极点。
  ps:下面简述一下极点和零点。对描述函数做拉普拉斯变换,将描述函数变换成一个与它本身相关的函数,并找出其通解和特解,通解是这个函数的开环特征,用来描述输出与输入的关系,零点是调节变量,用于闭环中对系统反馈参数的调节。(对函数做拉普拉斯变换事实上是针对描述大多函数是常微分方程的一种现象)
  我们有必要对这个描述函数的解进行研究,尽管在线性控制原理中并不关注并不要求去了解他,但是对于这个常微分方程的极点形式的了解有助于我们认识这个描述函数的物理意义。这是高数的知识,就不再累述。通过求解,可以看到极点其实就是这个经过拉普拉斯变换的描述函数的一次项的系数,零点是反馈量的相关函数的系数。也就是说,极点一旦确定,这个函数也就确定了,对于每一个输入函数,赋予零点变换,再进过极点变换 ,最后生成输出量。
  把我们现在得到的结论联系一下:对于一个闭环的系统我们通过对控制器一些参数的理论求解,或者说调试求解,最终改变输出变量,从而使这个系统持续稳定。也就是说,在控制器内,存储了有关于反馈值某种预期的实现方法,这些方法用一些固定的参数来描述,然后输出变量改变系统的状态。我的任务是调试这些具有物理意义的参数。
  下面是一个简单的PID程序设计:
  double kp,ki,kd;
  double resultfunc(void)
    {
    double error;
    double diff;
    double lasterror = 0;
    error = target - input;
    sumerror += error;
    diff = error - lasterror;
    lasterror = error;
    output = kp * error + ki * sumerror + kd * diff;
    return output;
    }
  你会发现其实想象中的PID要比现实中的PID复杂很多,这是理所当然的,因为经过PID数学计算之后,带入的公式只是一个近似量。但是这可不是随便瞎设的一个值,最重要的是,你需要数学计算。
  不得不说一下,对于一个完全的门外汉来说,PID是一个十分高神的名词,很多人一上手就接触PID,结果连输出输入的到底是什么都搞不明白,其实不妨接触一下线性控制的理论,这对于你的视野和思路有及其清晰的指导。
  参数整定寻最佳,从小到大顺序查;
  先是比例后积分,最后才把微分加;
  曲线振荡很频繁,比例度盘要放大;
  曲线漂浮绕大弯,比例度盘往小扳;
  曲线偏离回复慢,积分时间往下降;
  曲线波动周期长,积分时间再加长;
  曲线振荡变很快,先把微分降下来;
  动差大来波动慢,微分时间要加长;
  联想曲线两个波,前高后低4比1;
  一看二调多分析,调节质量不会低。
回复

使用道具 举报

12#
ID:883242 发表于 2024-3-20 17:17 | 只看该作者
楼上几位从网上抄资料的都不知道PID算法本身非常简单,但是找出P、I、D三个参数的值,才是最难的。
回复

使用道具 举报

13#
ID:1034262 发表于 2024-3-20 22:40 | 只看该作者
其实很简单。
error = SetPosition - position;  // 计算误差
Integral += error;    // 计算误差积分
pidTerm  = error * pGain + Integral * iGain - (position - PrePosition) * dGain; // 计算输出
PrePosition = position;    // 保存当前位置
回复

使用道具 举报

14#
ID:1113684 发表于 2024-3-21 13:43 | 只看该作者
PID控制,全称比例-积分-微分控制,是一种广泛应用于工业控制系统和需要连续调制控制的其他各种应用中的控制回路反馈机制。它的基本原理是根据被控对象的当前状态与设定值之间的差异来调整输出信号,使得差异趋近于零。PID控制器根据比例(P)、积分(I)、微分(D)三个部分的权重组合来计算输出信号,从而实现对被控对象的精确控制。

比例(P)控制:根据当前误差的大小来调整控制器的输出。当误差较大时,输出信号也较大,从而加快被控对象的响应速度。比例控制可以使系统快速接近设定值,但可能会引起超调和震荡。
积分(I)控制:根据误差随时间累积的量来调整控制器的输出。它能够消除系统的稳态误差,确保系统最终稳定在设定值附近。
微分(D)控制:根据误差变化的速率来调整控制器的输出。它能够预测系统未来的状态变化趋势,从而减小超调和提高系统的稳定性。微分控制的引入可以抑制系统的震荡,但同时也会增加系统对噪声的敏感性。
PID控制器能够自动对控制功能进行精确和及时的校正。例如,在汽车的巡航控制中,PID算法可以通过调整发动机的功率输出,以最小的延迟和过冲将测量的速度恢复到期望值。

总的来说,PID控制通过结合比例、积分和微分控制的特点,实现对被控对象的快速、准确和平稳的控制,广泛应用于机电、冶金、机械、化工等行业。
#include <stdio.h>  
  
// 定义PID控制器结构体  
typedef struct {  
    double setpoint;      // 设定值  
    double kp;            // 比例系数  
    double ki;            // 积分系数  
    double kd;            // 微分系数  
    double last_error;    // 上一次误差  
    double integral;      // 误差积分  
} PID_Controller;  
  
// PID控制函数  
double PID_Control(PID_Controller *pid, double feedback) {  
    double error = pid->setpoint - feedback;       // 计算误差  
    double derivative = error - pid->last_error;   // 计算误差的微分  
    pid->integral += error;                        // 累计误差的积分  
    double output = pid->kp * error + pid->ki * pid->integral + pid->kd * derivative; // 计算输出  
    pid->last_error = error;                       // 更新上一次误差  
    return output;  
}  
  
int main() {  
    PID_Controller pid;  
    pid.setpoint = 1.0;          // 设定值为1.0  
    pid.kp = 0.5;               // 比例系数  
    pid.ki = 0.1;               // 积分系数  
    pid.kd = 0.01;              // 微分系数  
    pid.last_error = 0.0;  
    pid.integral = 0.0;  
  
    double feedback = 0.2;     // 初始反馈值  
    double output;  
  
    // 进行PID控制  
    for (int i = 0; i < 10; i++) {  
        output = PID_Control(&pid, feedback);  
        printf("Step %d: Output = %f, Feedback = %f\n", i, output, feedback);  
        // 模拟系统响应,这里简单地假设系统响应是输出值的线性关系  
        feedback += output * 0.1;  
    }  
  
    return 0;  
}
回复

使用道具 举报

15#
ID:883242 发表于 2024-3-21 16:50 | 只看该作者
wdsoe 发表于 2024-3-21 13:43
PID控制,全称比例-积分-微分控制,是一种广泛应用于工业控制系统和需要连续调制控制的其他各种应用中的控 ...

还是没弄清楚P、I、D三个参数是怎么编出来的。
回复

使用道具 举报

16#
ID:891876 发表于 2024-3-21 20:19 | 只看该作者
晓得个大概了,但还没弄清楚原由,=不知道
回复

使用道具 举报

17#
ID:675030 发表于 2024-3-22 11:46 | 只看该作者
加油初步理解有帮助:http://www.51hei.com/bbs/dpj-86786-1.html
回复

使用道具 举报

18#
ID:401564 发表于 2024-3-22 12:54 | 只看该作者
芙蓉焊料 发表于 2024-3-21 20:19
晓得个大概了,但还没弄清楚原由,=不知道

不要去看网上那些带一堆微积分公式的教程,那大多是抄人的,可能讲解者自己都不知道什么叫PID
P就是比例控制,过大或者过小都不行
I就是误差累加,这个累加是在程序运行时候一直进行的
PI的参数调节是一个工作量很大的过程,多调节几次就能明白原理了
回复

使用道具 举报

19#
ID:883242 发表于 2024-3-22 15:30 | 只看该作者
Y_G_G 发表于 2024-3-22 12:54
不要去看网上那些带一堆微积分公式的教程,那大多是抄人的,可能讲解者自己都不知道什么叫PID
P就是比例控 ...

搜Ziegler-Nichols method,要求不是太高可以一次试出来。
回复

使用道具 举报

20#
ID:1055047 发表于 2024-3-26 12:48 | 只看该作者
在比例、积分和微分的线性组合,构成控制量u(t),称为:比例(Proportional)、积分(Integrating)和微分(Differentiation)控制,简称PID控制。比例作用P只与偏差成正比,积分作用I是偏差对时间的累积,而微分作用D是偏差的变化率。用一句形象的比喻,比例P代表着现在,积分I代表着过去,而微分D则代表着未来。
回复

使用道具 举报

21#
ID:993578 发表于 2024-3-26 17:05 | 只看该作者

PID控制是一种常见的反馈控制算法,它通过比例(Proportional)、积分(Integral)、微分(Derivative)三个环节来调整控制器输出,以便让系统输出尽可能接近期望值。简单来说,PID控制就是一个调节过程,它可以根据当前值与目标值之间的差异(偏差),动态地调整输出,以达到控制目标。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表