PID算法简单剖析如下:

1、首先我们来看一下PID系统的基本组成模块:

如图所示,图中相关参数的表示如下:

r(t):系统实际上需要的输出值,这是一个标准值,在我们设定了之后让这个系统去逼近的一个值(随时间变化的原因是,我们对系统的需求不同才会改变!)

y(t):系统当前的输出值,这个值应该需要趋近于我们设定的值,当我们没有增加PID控制模块之前,它是由被控对象通过r(t)输入直接产生的。

e(t):系统由于某些扰动,导致的系统产生的偏差,实际输出的值和想要设定的初始值r(t)的差值。

u(t):系统通过PID控制器输出的新的输入值,实际上他是在r(t)的基础上,针对当前的实际情况做出的改变。

Kp比例模块:系统PID比例因子,Kp能够对于产生的偏差e(t)能够迅速的作出反应,减少偏差。

Ki积分模块:系统PID积分因子,Ki能够用于消除静差,由于前面的误差有正有负,所以当前偏差的加入能够抵消部分,保持系统的稳定性,让系统有记忆功能。

Kd微分模块:系统微分因子,Kd能够体现出当前误差的变化趋势,引入有效早期修正信号,从而加快系统的动作速度,减少调节时间。

图中所示的信号关系公式如下所示:

信号误差公式:

模拟信号的PID控制器公式: 

离散信号的PID控制器公式:

被控对象的信号公式:(简单的线性系统,比如电机的PWM调速系统)

上述公式参数描述:

Kp控制器比例系数、Ti控制器积分时间(积分系数)、Td控制器微分时间(微分系数)

k采样序列号,k=0,1,2,3...、Uk第k次采样时刻系统输出值、ek第k次采样时刻偏差值、ek-1第k-1次采样时刻偏差值、Ki=Kp*T/Ti、Kd=Kp*Td/T

2、离散信号的PID控制器算法仿真:

1、位置式PID算法:

PID系统产生的值,完全作为系统的输入参数,即采用u(k)代替了r(k),如果计算机出现故障时,位置式PID控制将导致Uk的剧烈变化,这会引起执行机构的大幅度变化,造成巨大损失。

仿真代码如下(python):

import matplotlib.pyplot as plt
import numpy as np
import random
import sys
import os time_length = 600
time_sample = 100
time_interval = float(time_length/time_sample)
error_coeff = 3
t = np.linspace(0,time_length,time_sample)
Slope = 1
Intercept = 0
standard_in = 20 # The system model
system_model = lambda i : Slope*i + Intercept
standard_out = system_model(standard_in)
print("The Standard Output:%d" % standard_out) Kp = 0.08 # average
Ki = -0.7 # intergre
Kd = 0.01 # diff error_bef = []
real_out_ajust = []
real_out_ajust.append(70)
real_out_ajust.append(75)
error_bef.append(real_out_ajust[0]-standard_out)
Out_plt = np.linspace(standard_out,standard_out,time_sample) # 标准直接计算公式1:Pout=Kp*e(t) + Ki*Sum[e(t)] + Kd*[e(t) - e(t-1)]
def PID_Controller_Direct_Mem(standard_out,t):
global time_sample,Kp,Ki,Kd,error_bef,real_out_ajust
if t > time_sample:
print("Time Out! Quit!")
return -1
error_now = real_out_ajust[t] - standard_out
error_bef.append(error_now) # 记录了所有的误差
integrate_res = np.sum(error_bef)
Diffirent_res = error_now - error_bef[t-1]
return Kp*error_now + Ki*integrate_res + Kd*Diffirent_res for t_slice in range(1,time_sample-1):
Pout = PID_Controller_Direct_Mem(standard_out,t_slice)
real_out_ajust.append(system_model(Pout)) plt.figure('PID_Controller_Direct_Mem')
plt.xlim(0,time_length)
plt.ylim(0,2*standard_out)
plt.plot(t,real_out_ajust)
plt.plot(t,Out_plt)

仿真结果如下所示:

图中所示,系统最终收敛于我们设定的红线的位置r(t)

2、增量式PID算法:

当执行机构需要的控制量是增量而不是位置量的绝对数值是,可以采用增量式PID控制算法。

代码如下(python):

import matplotlib.pyplot as plt
import numpy as np
import random
import sys
import os class PID_Prama:
def __init__(self):
self.Kp = 0
self.Ki = 0
self.Kd = 0
self.set_val = 0
self.error_last = 0
self.error_prev = 0
self.error_sum = 0 # 增量计算公式:
# Pout=Kp*[e(t) - e(t-1)] + Ki*e(t) + Kd*[e(t) - 2*e(t-1) +e(t-2)]
def PID_Controller_Increa(pid,out_now):
error = pid.set_val - out_now
Res = pid.Kp*(error-pid.error_last) + pid.Ki*error + \
pid.Kd*(error-2*pid.error_last+pid.error_prev)
pid.error_prev = pid.error_last
pid.error_last = error
return Res standard_out = 100
PID_val = PID_Prama() # PID参数
PID_val.Kp = 0.01
PID_val.Ki = 0.1
PID_val.Kd = 0.05
PID_val.set_val = standard_out # 标准输出值
# 增量型PID控制器输出值
PID_Controller_Increa_Out = []
Sys_In = []
# 0时刻系统输入值
Sys_In.append(5)
# 系统响应函数
SystemFunc = lambda x : 5*x + np.random.normal(0,0.5,1)[0] Sys_Out = []
# 0时刻系统输出值
Sys_Out.append(SystemFunc(Sys_In[0])) for t_slice in range(Time):
Diff = PID_Controller_Increa(PID_val,Sys_Out[t_slice]) #系统误差
PID_Controller_Increa_Out.append(Diff) # 记录所有的系统误差
Sys_In.append(Sys_In[0]+np.sum(PID_Controller_Increa_Out)) # 计算增量之后的新的系统输入
Sys_Out.append(SystemFunc(Sys_In[t_slice+1])) # 计算下一时刻系统新的输出值 standard = np.linspace(PID_val.set_val,PID_val.set_val,Time) plt.figure('PID_Controller_Increa')
plt.xlim(0,Time)
plt.ylim(0,2*standard_out)
plt.plot(Sys_Out)
plt.plot(standard) plt.show()

这里对增量式PID算法进行深入的分析和计算:

No1:class PID_Param类保存了PID算法中的三个参数,Kp Ki Kd,同时类当中也记录了上一次系统存在的误差error_last,以及上上一次系统的误差error_prev,这样就能够完成增量式误差的公式计算。

No2:上述算法中在循环体中记录了所有的误差变量PID_Controller_Increa_Out,这是为了仿真的目的,实际上我们比不需要存储所有的误差参数。

No3:系统的响应system_model:,系统后面添加了高斯噪声,这表示了系统在运行过程中的不稳定的过程,同时系统本身是一个线性系统,例如控制电机转速的系统:PWM--ctl--Speed

系统仿真结果:

其他的相关参考资料见我的cnblog文件中,下一篇介绍PID实战,基于STM32微控制器的C语言控制PWM电机力矩调节系统!

https://www.cnblogs.com/uestc-mm/p/10513131.html

PID控制算法的简单分析和仿真!的更多相关文章

  1. PID控制算法的C语言实现

    参考: PID控制器开发笔 浅谈位置式PID 专家PID控制在快速系统中的仿真及应用(这篇了论文介绍的积分分离PID.专家PID(脚本实现和simulink实现)很详细) PID控制算法的C语言实现一 ...

  2. PID控制算法的C语言实现十 专家PID与模糊PID的C语言实现

    本节是PID控制算法的C语言实现系列的最后一节,前面8节中,已经分别从PID的实现到深入的过程进行了一个简要的讲解,从前面的讲解中不难看出,PID的控制思想非常简单,其主要问题点和难点在于比例.积分. ...

  3. [转]PID控制算法原理

    PID控制算法是工业界使用极其广泛的一个负反馈算法,相信这个算法在做系统软件时也有用武之处,这里摘录了知乎上的一篇文章,后面学习更多后自己总结一篇 以下为原文: PID控制应该算是应用非常广泛的控制算 ...

  4. PID控制算法的C语言实现十一  模糊算法简介

    在PID控制算法的C语言实现九中,文章已经对模糊PID的实质做了一个简要说明.本来打算等到完成毕业设计,工作稳定了再着力完成剩下的部分.鉴于网友的要求和信任,抽出时间来,对模糊PID做一个较为详细的论 ...

  5. x264源代码简单分析:概述

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  6. FFmpeg源代码简单分析:av_find_decoder()和av_find_encoder()

    ===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...

  7. PID控制算法

    PID控制算法 四轴如何起飞的原理 四轴飞行器的螺旋桨与空气发生相对运动,产生了向上的升力,当升力大于四轴的重力时四轴就可以起飞了. 四轴飞行器飞行过程中如何保持水平: 我们先假设一种理想状况:四个电 ...

  8. PID控制算法的C语言实现一 PID算法原理

    本系列是转载............. 全部的程序有一个共同点:就是我没认真去调pid的参数 在工业应用中PID及其衍生算法是应用最广泛的算法之一,是当之无愧的万能算法,如果能够熟练掌握PID算法的设 ...

  9. 杂谈PID控制算法——第二篇:调·三个量

    上面一篇文章讲了一下PID算法中的三个常量大致的在PID算法中起的一个作用,但在实际的使用中,究竟应该如何调节(或者用更加专业的话说是整定)PID控制算法的三个.首先可以将KP,KI,KD三个常量全部 ...

随机推荐

  1. 【XSY2925】cti 网络流

    题目描述 有一个 \(n\times m\)的网格,每个格子里面可能有一些炮塔,或者有几个人. 每个炮塔可以在给定的方向(上下左右)上选一个点作为它的攻击位置,然后消灭这个格子里面的所有人.当然也可以 ...

  2. Node.js修改全局安装默认路径

    因为苦于C盘不够的烦恼,不想把全局安装包的路径弄在C盘,于是有了这篇文章: 查看设置 npm config ls //查看设定信息,,找到prefix一行,默认是一般是在C盘 修改命令如下 npm c ...

  3. Calendar 使用

    Calendar 类是一个抽象类,在java.util.Calendar包中,它为特定瞬间与一组诸如 YEAR.MONTH.DAY_OF_MONTH.HOUR 等 日历字段之间的转换提供了一些方法,并 ...

  4. PMP备考资料和备考经验分享(基于PMP第六版)

    之前有不少小伙伴私信我说,你PMP考过了,有没有报班呢,有没有自己看的资料,有没有一些经验分享,今天在这里,就统一给大家分享一下,以便大家备考和学习PMP. 先说我自己的情况,我本身是从事项目管理的, ...

  5. prometheus 配置介绍

    prometheus 配置介绍 prometheus 配置分global.alerting.rule_files.scrape_configs 1.global(全局配置) scrape_interv ...

  6. HTML词法和语法

    1. 词 token 专业不是计算机的博主比较尴尬,一直以为token就是验证身份用的标识 token —— 表示 “最小有意义的单元” 以这个简单的p标签为例,我们分析哪些是token: <p ...

  7. kubernetes云平台管理实战: 故障自愈实战(四)

    一.创建实验文件 [root@k8s-master ~]# cat myweb-rc.yml apiVersion: v1 kind: ReplicationController metadata: ...

  8. 将matlab数据保存为excel文件

    摘录网址:https://blog.csdn.net/wangh0802/article/details/70312415 参考网址:https://jingyan.baidu.com/article ...

  9. netCore2.0 Api 跨域(Cors)

    1.在使用netCore2.0 使用WebApi的过程中涉及到了跨域处理. 在Microsoft.AspNetCore.All包中包含跨域Cors的处理,不必单独添加. 2.打开Startup.cs文 ...

  10. 微星X470主板装机

    记录一下装机过程,以作纪念 配置 机箱:先马黑洞3 电源:先马金牌500w CPU:AMD 锐龙5:2600X 主板:微星 X470 暗黑版 显卡:七彩虹 RTX2060 内存:科赋 3200,2条8 ...