PID控制

目录

[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),然后将偏差的比例、积分和微分通过线性组合构成控制量,对被控对象进行控制。

  1. 比例控制(P)
    • 原理:根据误差信号的大小产生一个与误差成比例的控制量,使被控对象的输出向期望值靠近。
    • 特点:快速响应,但可能产生静态误差和振荡。
  2. 积分控制(I)
    • 原理:根据误差信号的积分值产生一个控制量,用于消除系统的静态误差,提高系统的无差度。
    • 特点:能够消除静态误差,但可能引起系统的超调和振荡。
  3. 微分控制(D)
    • 原理:根据误差信号的变化率来调整控制量,以预测未来的误差发展趋势,从而提前采取控制动作。
    • 特点:提高系统的稳定性,但可能引起系统的抖动和噪声。

4 PID控制性能指标

衡量一个PID控制系统性能好坏的指标主要有:

  1. 上升时间:系统实际输出从正常输出的10%上升到90%所需的时间。
  2. 调节时间:系统实际输出值稳定在正常输出值的5%或2%范围以内所需的时间。
  3. 超调量:系统实际输出的最大值与正常值的差与正常值的比值。
  4. 稳态误差:系统达到稳态时的输出值与正常值差的绝对值与正常值的比值。

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

6 工程代码

https://download.csdn.net/download/weixin_44270564/89543499

相关推荐
南宫萧幕1 天前
MATLAB/Simulink 从零打通:HEV 能量管理 GA 联合仿真保姆级建模指南
开发语言·算法·matlab·汽车·控制·pid
南宫萧幕2 天前
HEV能量管理控制算法实战:从MPC/RL理论基础到Simulink闭环建模
算法·matlab·汽车·控制·pid
南宫萧幕7 天前
车辆控制基础:从 EKF 状态估计到非线性 MPC 轨迹跟踪的闭环实现
算法·matlab·汽车·控制·pid
南宫萧幕11 天前
从零构建飞行汽车混合动力能量管理系统(含电池、增程器与EMS策略)
matlab·汽车·控制·pid
南宫萧幕11 天前
自控PID+MATLAB仿真+混动P0/P1/P2/P3/P4构型
算法·机器学习·matlab·simulink·控制·pid
reset202118 天前
GPU调试
gpu·pid
星马梦缘24 天前
运动控制系统(四)-转速闭环系统的反馈控制规律
自动化·pid·自动控制·传递函数·比例控制·劳斯-赫尔维茨稳定性判据
波诺波1 个月前
p3项目-模拟 PID 控制器用来调节直流电机的转速
python·pid
BestOrNothing_20151 个月前
从C++结构体、类到 PID 控制器:运动控制初学者如何理解 C++ 工程代码
c++·面向对象·pid·运动控制·.h与.cpp·struct与class
Evand J1 个月前
【MATLAB例程】多无人机协同巡逻仿真:基于长机-僚机模型的编队保持与串级PID控制
开发语言·matlab·无人机·控制·pid·串级pid