PID控制

目录

1 效果图

2 PID简介

3 PID控制原理

4 PID控制性能指标

5  代码实现

 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

#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

#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

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值