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

相关推荐
吐泡泡科技14 天前
MATLAB直流电机模型,直流电机控制
pid·电机控制·直流电机
不脱发的程序猿4 个月前
MATLAB实现PID参数自动整定
matlab·pid
教练、我想打篮球4 个月前
53 mysql pid 文件的创建
mysql·pid·start·stop
蔚蓝慕4 个月前
Arduino 控制理论(3)- 如何在 Arduino 中调节 PID 控制器
pid
不知道是谁25 个月前
控制程序确定执行步长,也就是输出信号更新频率
算法·控制·pid·现代控制理论·自动控制原理
Mr.Cssust5 个月前
【研发日记】Matlab/Simulink技能解锁(十)——PID调参技巧
仿真·pid·嵌入式软件·matlab/simulink·嵌入式处理器·ecu控制器·基于模型开发
TENET-6 个月前
串级PID控制算原理及法详解
嵌入式硬件·算法·pid
shadow3D6 个月前
嵌入式PID算法总结
嵌入式·pid·电机控制·cmsis-dsp·温度控制
幻想时刻@6 个月前
杂项——编码器控制小车走固定距离(stm32)
stm32·单片机·嵌入式硬件·pid