目录
[1 效果图](#1 效果图)
[2 PID简介](#2 PID简介)
[3 PID控制原理](#3 PID控制原理)
[4 PID控制性能指标](#4 PID控制性能指标)
[5 代码实现](#5 代码实现)
[6 工程代码](#6 工程代码)
1 效果图
2 PID简介
PID控制,全称为比例-积分-微分控制(Proportional-Integral-Derivative Control),是一种经典且广泛应用的自动控制方法。以下是对PID控制的详细解析:
PID控制是最早发展起来的控制策略之一,由于其算法简单、鲁棒性好和可靠性高,被广泛应用于工业过程控制。PID控制通过结合比例(P)、积分(I)和微分(D)三种控制方式来调整被控对象的输出,使其尽可能接近设定值。
3 PID控制原理
PID控制器的设计基于对被控对象的测量值与设定值之间的差异进行调整。具体来说,PID控制器根据给定值r(t)与实际输出值y(t)构成偏差e(t)=r(t)-y(t),然后将偏差的比例、积分和微分通过线性组合构成控制量,对被控对象进行控制。
- 比例控制(P) :
- 原理:根据误差信号的大小产生一个与误差成比例的控制量,使被控对象的输出向期望值靠近。
- 特点:快速响应,但可能产生静态误差和振荡。
- 积分控制(I) :
- 原理:根据误差信号的积分值产生一个控制量,用于消除系统的静态误差,提高系统的无差度。
- 特点:能够消除静态误差,但可能引起系统的超调和振荡。
- 微分控制(D) :
- 原理:根据误差信号的变化率来调整控制量,以预测未来的误差发展趋势,从而提前采取控制动作。
- 特点:提高系统的稳定性,但可能引起系统的抖动和噪声。
4 PID控制性能指标
衡量一个PID控制系统性能好坏的指标主要有:
- 上升时间:系统实际输出从正常输出的10%上升到90%所需的时间。
- 调节时间:系统实际输出值稳定在正常输出值的5%或2%范围以内所需的时间。
- 超调量:系统实际输出的最大值与正常值的差与正常值的比值。
- 稳态误差:系统达到稳态时的输出值与正常值差的绝对值与正常值的比值。
5 代码实现
使用QT实现一个简单的PID控制曲线
编译器 minGW64
通过控件改变参数实时绘制曲线
主要代码如下
pidcontrol.cpp
cpp
#include "pidcontrol.h"
#include <QDebug>
PIDControl::PIDControl(QObject *parent) : QObject(parent)
{
mPID.Kp = 0.2;
mPID.Ki = 0.05;
mPID.Kd = 0.2;
}
void PIDControl::initPID()
{
mPID.m_SetValue = 0.0;
mPID.m_ActualValue = 0.0;
mPID.m_Err = 0.0;
mPID.m_ErrLast = 0.0;
mPID.u_t = 0.0;
mPID.integral = 0.0;
mPID.differential = 0.0;
}
void PIDControl::runPID(float target_value, QVector<double> &keys, QVector<double> &values)
{
double epsilon = 1e-5;
int i = 0;
initPID();
keys.clear();
values.clear();
keys.append(i);
values.append(mPID.m_ActualValue);
while(qAbs(mPID.m_ActualValue - target_value) >= epsilon){
i++;
mPID.m_SetValue = target_value;
mPID.m_Err = mPID.m_SetValue - mPID.m_ActualValue;
mPID.integral += mPID.m_Err;
mPID.differential = (mPID.m_Err - mPID.m_ErrLast) / 1.0;
mPID.u_t = mPID.Kp * mPID.m_Err + mPID.Ki * mPID.integral + mPID.Kd * mPID.differential;
mPID.m_ErrLast = mPID.m_Err;
mPID.m_ActualValue += mPID.u_t * 1.0;
keys.append(i);
values.append(mPID.m_ActualValue);
/** qDebug()<< "mPID.m_ActualValue:"<<mPID.m_ActualValue
<<"mPID.m_Err:"<<mPID.m_Err
<<"mPID.integral:"<<mPID.integral
<<"mPID.differential:"<<mPID.differential
<<"mPID.u_t:"<<mPID.u_t
<<"mPID.m_ErrLast:"<<mPID.m_ErrLast; */
}
}
pidcontrol.h
cpp
#ifndef PIDCONTROL_H
#define PIDCONTROL_H
#include <QObject>
#include <QVector>
struct PID{
double m_SetValue; // 定义设定值
double m_ActualValue; // 定义实际值
double m_Err; // 定义偏差值
double m_ErrLast; // 定义上一个偏差值
double Kp, Ki, Kd; // 定义比例、积分、微分系数
double u_t; // 控制执行器
double integral; // 定义积分值
double differential; // 定义微分值
};
class PIDControl : public QObject
{
Q_OBJECT
public:
explicit PIDControl(QObject *parent = nullptr);
PID mPID;
void initPID();
void runPID(float target_value, QVector<double> &keys, QVector<double> &values);
signals:
public slots:
};
#endif // PIDCONTROL_H