PID控制算法原理，并用python实现演示

1. PID算法控制运用在哪些地方？

PID：比列(Proportion)，积分(Integral)，微分(Differential)

PID算法可以用来控制温度，压强，流量，化学成分，速度等等。汽车的定速巡航；伺服驱动器中的速度位置控制；冷却系统的温度；液压系统的压力等都可以通过PID算法实现，很好的保证系统的稳定性。

2. PID算法的原理

Kp: 比列系数

Ki: 积分系数

Kd: 微分系数

Ti: 积分时间

Td: 微分时间

PID的公式原理：

3. PID算法的python实现

#this code refer to CSDN and do some minor change.
import time

class PID:
def __init__(self, P, I, D):
self.Kp = P
self.Ki = I
self.Kd = D
self.sample_time = 0.00
self.current_time = time.time()
self.last_time = self.current_time
self.clear()
def clear(self):
self.SetPoint = 0.0
self.PTerm = 0.0
self.ITerm = 0.0
self.DTerm = 0.0
self.last_error = 0.0
self.int_error = 0.0
self.output = 0.0
def update(self, feedback_value):
error = self.SetPoint - feedback_value
self.current_time = time.time()
delta_time = self.current_time - self.last_time
delta_error = error - self.last_error
if (delta_time >= self.sample_time):
self.PTerm = self.Kp * error#比例
self.ITerm += error * delta_time#积分
self.DTerm = 0.0
if delta_time > 0:
self.DTerm = delta_error / delta_time#微分
self.last_time = self.current_time
self.last_error = error
self.output = self.PTerm + (self.Ki * self.ITerm) + (self.Kd * self.DTerm)

def setSampleTime(self, sample_time):
self.sample_time = sample_time

import PID #导入上面的PID算法
import time
import matplotlib.pyplot as plt
import numpy as np
from scipy.interpolate import spline

def test_pid(P, I , D, L):

pid = PID.PID(P, I, D)

pid.SetPoint=1.1
pid.setSampleTime(0.01)

END = L
feedback = 0
feedback_list = []
time_list = []
setpoint_list = []

for i in range(1, END):
pid.update(feedback)
output = pid.output
feedback +=output #PID控制系统的函数
time.sleep(0.01)
feedback_list.append(feedback)
setpoint_list.append(pid.SetPoint)
time_list.append(i)

time_sm = np.array(time_list)
time_smooth = np.linspace(time_sm.min(), time_sm.max(), 300)
feedback_smooth = spline(time_list, feedback_list, time_smooth)
plt.figure(0)
plt.grid(True)
plt.plot(time_smooth, feedback_smooth,'b-')
plt.plot(time_list, setpoint_list,'r')
plt.xlim((0, L))
plt.ylim((min(feedback_list)-0.5, max(feedback_list)+0.5))
plt.xlabel('time (s)')
plt.ylabel('PID (PV)')
plt.title('PythonTEST PID--xiaomokuaipao',fontsize=15)

plt.ylim((1-0.5, 1+0.5))

plt.grid(True)
plt.show()

if __name__ == "__main__":
test_pid(1.2, 1, 0.001, L=100)

4. PID调试的一些经验

PID调试的一般原则：

PID调节口诀：

0 条评论

• Github 项目推荐 | SpaceX Falcon 9 Box2D 回收降落动作模拟器

这是一款 SpaceX Falcon 9 第一级火箭的垂直火箭着陆模拟器，该模拟器用 Python 3.5 开发并且在 OpenAI Gym 环境中编写。该模拟...

• 鸿蒙系统(Harmony OS)开发工具DevEco Studio初体验

愿有朝一日用上国产的IDE、编译器、数据库系统、OS、光刻机、芯片等等，以形成闭环。

• softmax分类算法原理(用python实现)

逻辑回归神经网络实现手写数字识别 如果更习惯看Jupyter的形式，请戳Gitthub_逻辑回归softmax神经网络实现手写数字识别.ipynb 1 -...

• 热传导问题的数值解法Edition4

关于本科《传热学》简单温度场数值求解，早先有2018年的视频： 一维常物性无内热源无穷大平板温度场数值模拟(基于基于HTML5编程)。2019年重新录...

• [python从入门到放弃]安装Anaconda python求解方程(组)

1 https://www.anaconda.com/ 下载对应的anaconda安装包，一路下一步完成安装；

• MathJax实现在网页中植入数学公式

《传热学》相关小程序演示动画如下（其中下图1D非稳态导热计算发散，调小时间步长后重新计算，结果收敛！）：

• 用 Python 实现并行计算

注：不少学过点编程语言的人，都会抱怨 Python 语言的程序执行速度慢，因此对学习和使用此语言嗤之以鼻。暂且不论程序的执行速度是否是开发者追求的唯一目标（有意...

• 电机控制进阶——PID速度控制

之前的几篇文章（电机控制基础篇），介绍的电机编码器原理、定时器输出PWM、定时器编码器模式测速等。

• 数字PID控制示例，原来是这样！以液位控制为例

完整代码请点击阅读原文，也可体验贫道的PID控制演示小程序，（PID控制相关视频见：基础/整定/重要补充）。

• 电机控制进阶1——PID速度控制

之前的几篇文章（电机控制基础篇），介绍的电机编码器原理、定时器输出PWM、定时器编码器模式测速等。

• [机器学习]基于tensorflow.js的k-means聚类分析

A Simple JavaScript Library to make it easy for people to use KMeans algorithms ...

• 深入Python多进程编程基础

多进程编程知识是Python程序员进阶高级的必备知识点，我们平时习惯了使用multiprocessing库来操纵多进程，但是并不知道它的具体实现原理。下面我对多...

• 深入Python多进程编程基础——图文版

多进程编程知识是Python程序员进阶高级的必备知识点，我们平时习惯了使用multiprocessing库来操纵多进程，但是并不知道它的具体实现原理。下面我对多...

• 热传导问题的数值解法Edition3

特别注意：由于视频结束时下课停止录制，视频公式没有推导完成，最终请参考后边草稿：

• PID的那些事——位置式PID

首先要知道，很多时候PID算法都是通过一个控制器进行编程实现，可以是一台计算机，也可以是一个微处理器，但不管怎样，他们处理的信号都已经不再是模拟信号，而是对模拟...

• Sanlock原理与基本使用

Sanlock是一个基于共享存储的分布式锁管理器，集群中的每个节点都各自运行sanlock服务，锁的状态都被写到了共享存储上，所有节点都能访问共享存储，共同维护...

• 如何通过网页超链接控制电脑应用程序

我们通过手机端可以管理电脑进程资源，上一篇推文已经实现对电脑进程资源查看，本次介绍如何实现对电脑应用程序的启停管理。