PID转电机(1、PID知识)

  一、原理

e(t)为误差值,Kp为比例系数,Kp/Ti为积分系数,Kp/TD为微分系数
 

比例项Kp控制器比例项输出值和误差值保持线性关系,误差值放大一倍则输出值也同样放大一倍,误差值缩小一倍则输出值也缩小一倍。只依靠比例项进行控制的方法称为比例控制,比例控制可以很简单的实现控制器的基本功能,但往往存在静差以及过大引起系统振荡的问题。

积分项Ki控制器积分项输出值与误差值的积分值成线性关系,即误差值的累计值乘以一个常数。积分项可以加速系统趋近设定值的过程,但积分增益过大容易引起积分超调的现象

微分项Kd微分项的大小和输出值的变化量成正相关,微分项计算误差的一阶导数,并和一个常数相乘,得到微分项的输出值。微分项可以对系统的改变做出反应,对系统的短期改变很有帮助。

二、离散化PID(位置型PID

由于数字系统是离散的,在单片机中实现PID控制算法时,需要将PID控制器的输出表达式改写成离散形式,其具体的做法就是将输出u(t)和误差e(t)由函数改成数组u(k)e(k),积分换成求和,微分换成差分。离散化后的PID表达式如下:

三、差分PID

  • PID控制器可以分为增量式PID控制器位置式PID控制器

位置式PID控制器:误差值直接决定最后的输出

增量式PID控制器:用误差值来控制每次输出的改变量∆u

       ∆u(k)=u(k)-u(k-1)

表达式为:

  • 相比位置式PID,增量式PID控制有以下优点:
  1. 不需要累加计算累加,输出增量只和前三次误差采样值有关,参数更容易调节
  1. 每次只输出控制增量,故发生故障时产生的影响较小

使用增量式PID时需要记忆上一次的输出值,将上一次的输出值和增量相加才能得到本次输出值。

四、代码(以C板历程为例)

pid.h文件

该枚举用于表示PID的模式(一个位置型PID、一个差分型PID)

C
enum PID_MODE
{
    PID_POSITION = 0,
    PID_DELTA
};

该结构体用于储存PID相关的参数

C
typedef struct
{
    uint8_t mode;  //PID
模式
    //PID 三个参数
    fp32 Kp;
    fp32 Ki;
    fp32 Kd;

    fp32 max_out;  //最大输出的限制
    fp32 max_iout; //最大积分输出的限制

    fp32 set;  //设定的目标值
    fp32 fdb;  //当前的PID值

    fp32 out;  //输出的控制值
    fp32 Pout; //Pout Iout Dout 为中间三项的阶段成果
    fp32 Iout;
    fp32 Dout;
    fp32 Dbuf[3];  //微分项 0最新 1上一次 2上上次
    fp32 error[3]; //误差项 0最新 1上一次 2上上次

} pid_type_def;

PID初始化函数

C
extern void PID_init(pid_type_def *pid, uint8_t mode, const fp32 PID[3], fp32 max_out, fp32 max_iout);

PID计算函数

C
extern fp32 PID_calc(pid_type_def *pid, fp32 ref, fp32 set);

PID清空函数

C
extern void PID_clear(pid_type_def *pid);

pid.c文件

用于保障输出值不会越界

C
#define LimitMax(input, max)   \
    {                          \
        if (input > max)       \
        {                      \
            input = max;       \
        }                      \
        else if (input < -max) \
        {                      \
            input = -max;      \
        }                      \
    }

PID初始化函数

C
void PID_init(pid_type_def *pid, uint8_t mode, const fp32 PID[3], fp32 max_out, fp32 max_iout)
{
    if (pid == NULL || PID == NULL)
    {
        return;
    }
    pid->mode = mode;
    //
以后调参数,主要以调Kp、Ki、Kd为主
    pid->Kp = PID[0];
    pid->Ki = PID[1];
    pid->Kd = PID[2];
    pid->max_out = max_out;
    pid->max_iout = max_iout;
    pid->Dbuf[0] = pid->Dbuf[1] = pid->Dbuf[2] = 0.0f;
    pid->error[0] = pid->error[1] = pid->error[2] = pid->Pout = pid->Iout = pid->Dout = pid->out = 0.0f;
}

pid->Kp的含义为pid.h文件中的Kp(其他代码含义与此相同)

PID计算函数

运行过程中,如果PID结构体指针不存在将直接返回0;

如果存在,首先将更新误差值目标值参考值

之后当使用普通PID时将直接计算PID的值,对应计算其比例项、微分项、积分项。积分项会限制范围,加起来后得到输出,输出也有范围限制

使用差分PID时,同样计算比例项、微分项、积分项,在对应加起来得到输出

C
fp32 PID_calc(pid_type_def *pid, fp32 ref, fp32 set)  //1.PID结构体指针  2.读取到的参考值  3.设定的目标值
{
    if (pid == NULL)
    {
        return 0.0f;
    }

    pid->error[2] = pid->error[1];
    pid->error[1] = pid->error[0];
    pid->set = set;
    pid->fdb = ref;
    pid->error[0] = set - ref;
    if (pid->mode == PID_POSITION)
    {
        pid->Pout = pid->Kp * pid->error[0];
        pid->Iout += pid->Ki * pid->error[0];
        pid->Dbuf[2] = pid->Dbuf[1];
        pid->Dbuf[1] = pid->Dbuf[0];
        pid->Dbuf[0] = (pid->error[0] - pid->error[1]);
        pid->Dout = pid->Kd * pid->Dbuf[0];
        LimitMax(pid->Iout, pid->max_iout);
        pid->out = pid->Pout + pid->Iout + pid->Dout;
        LimitMax(pid->out, pid->max_out);
    }
    else if (pid->mode == PID_DELTA)
    {
        pid->Pout = pid->Kp * (pid->error[0] - pid->error[1]);
        pid->Iout = pid->Ki * pid->error[0];
        pid->Dbuf[2] = pid->Dbuf[1];
        pid->Dbuf[1] = pid->Dbuf[0];
        pid->Dbuf[0] = (pid->error[0] - 2.0f * pid->error[1] + pid->error[2]);
        pid->Dout = pid->Kd * pid->Dbuf[0];
        pid->out += pid->Pout + pid->Iout + pid->Dout;
        LimitMax(pid->out, pid->max_out);
    }
    return pid->out;
}

举例:ref可以是从电调中读取的电机转速,set是目标的电机转速

PID清空函数

C
void PID_clear(pid_type_def *pid)
{
    if (pid == NULL)
    {
        return;
    }

    pid->error[0] = pid->error[1] = pid->error[2] = 0.0f;
    pid->Dbuf[0] = pid->Dbuf[1] = pid->Dbuf[2] = 0.0f;
    pid->out = pid->Pout = pid->Iout = pid->Dout = 0.0f;
    pid->fdb = pid->set = 0.0f;
}

 

PID电机控制目录 第1 章 数字PID 控制 1.1 PID 控制原理 1.2 连续系统的模拟PID 仿真 1.3 数字PID 控制 1.3.1 位置式PID 控制算法 1.3.2 连续系统的数字PID 控制仿真 1.3.3 离散系统的数字PID 控制仿真 1.3.4 增量式PID 控制算法及仿真 1.3.5 积分分离PID 控制算法及仿真 1.3.6 抗积分饱和PID 控制算法及仿真 1.3.7 梯形积分PID 控制算法 1.3.8 变速积分PID 算法及仿真 1.3.9 带滤波器的PID 控制仿真 1.3.10 不完全微分PID 控制算法及仿真 1.3.11 微分先行PID 控制算法及仿真 1.3.12 带死区的PID 控制算法及仿真 1.3.13 基于前馈补偿的PID 控制算法及仿真 1.3.14 步进式PID 控制算法及仿真 第2 章 常用的PID 控制系统 2.1 单回路PID 控制系统 2.2 串级PID 控制 2.2.1 串级PID 控制原理 2.2.2 仿真程序及分析 2.3 纯滞后系统的大林控制算法 2.3.1 大林控制算法原理 2.3.2 仿真程序及分析 2.4 纯滞后系统的Smith 控制算法 2.4.1 连续Smith 预估控制 2.4.2 仿真程序及分析 2.4.3 数字Smith 预估控制 2.4.4 仿真程序及分析 第3 章 专家PID 控制和模糊PID 控制 3.1 专家PID 控制 3.1.1 专家PID 控制原理 3.1.2 仿真程序及分析 3.2 模糊自适应整定PID 控制 3.2.1 模糊自适应整定PID 控制原理 3.2.2 仿真程序及分析 3.3 模糊免疫PID 控制算法 3.3.1 模糊免疫PID 控制算法原理 3.3.2 仿真程序及分析 第4 章 神经PID 控制 4.1 基于单神经元网络的PID 智能控制 4.1.1 几种典型的学习规则 4.1.2 单神经元自适应PID 控制 4.1.3 改进的单神经元自适应PID 控制 4.1.4 仿真程序及分析 4.1.5 基于二次型性能指标学习算法的单神经元自适应PID 控制 4.1.6 仿真程序及分析 4.2 基于BP 神经网络整定的PID 控制 4.2.1 基于BP 神经网络的PID 整定原理 4.2.2 仿真程序及分析 4.3 基于RBF 神经网络整定的PID 控制 4.3.1 RBF 神经网络模型 4.3.2 RBF 网络PID 整定原理 4.3.3 仿真程序及分析 4.4 基于RBF 神经网络辨识的单神经元PID 模型参考自适应控制 4.4.1 神经网络模型参考自适应控制原理 4.4.2 仿真程序及分析 4.5 基于CMAC(神经网络)与PID 的并行控制 4.5.1 CMAC 概述 4.5.2 CMAC 与PID 复合控制算法 4.5.3 仿真程序及分析 4.6 CMAC 与PID 并行控制的Simulink 仿真 4.6.1 Simulink 仿真方法 4.6.2 仿真程序及分析 第5 章 基于遗传算法整定的PID 控制 5.1 遗传算法的基本原理 5.2 遗传算法的优化设计 5.2.1 遗传算法的构成要素 5.2.2 遗传算法的应用步骤 5.3 遗传算法求函数极大值 5.3.1 遗传算法求函数极大值实例 5.3.2 仿真程序 5.4 基于遗传算法的PID 整定 5.4.1 基于遗传算法的PID 整定原理 5.4.2 基于实数编码遗传算法的PID 整定 5.4.3 仿真程序 5.4.4 基于二进制编码遗传算法的PID 整定 5.4.5 仿真程序 5.5 基于遗传算法摩擦模型参数辨识的PID 控制 5.5.1 仿真实例 5.5.2 仿真程序 第6 章 先进PID 多变量解耦控制 6.1 PID 多变量解耦控制 6.1.1 PID 解耦控制原理 6.1.2 仿真程序及分析 6.2 单神经元PID 解耦控制 6.2.1 单神经元PID 解耦控制原理 6.2.2 仿真程序及分析 6.3 基于DRNN 神经网络整定的PID 解耦控制 6.3.1 基于DRNN 神经网络参数自学习PID 解耦控制原理 6.3.2 DRNN 神经网络的Jacobian 信息辨识 6.3.3 仿真程序及分析 第7 章 几种先进PID 控制方法 7.1 基于干扰观测器的PID 控制 7.1.1 干扰观测器设计原理 7.1.2 连续系统的控制仿真 7.1.3 离散系统的控制仿真 7.2 非线性系统的PID 鲁棒控制 7.2.1 基于NCD 优化的非线性优化PID 控制 7.2.2 基于NCD 与优化函数结合的非线性优化PID 控制 7.3 一类非线性PID 控制器设计 7.3.1 非线性控制器设计原理 7.3.2 仿真程序及分析 7.4 基于重复控制补偿的高精度PID 控制 7.4.1 重复控制原理 7.4.2 基于重复控制补偿的PID 控制 7.4.3 仿真程序及分析 7.5 基于零相差前馈补偿的PID 控制 7.5.1 零相差控制原理 7.5.2 基于零相差前馈补偿的PID 控制 7.5.3 仿真程序及分析 7.6 基于卡尔曼滤波器的PID 控制 7.6.1 卡尔曼滤波器原理 7.6.2 仿真程序及分析 7.6.3 基于卡尔曼滤波器的PID 控制 7.6.4 仿真程序及分析 7.7 单级倒立摆的PID 控制 7.7.1 单级倒立摆建模 7.7.2 单级倒立摆控制 7.7.3 仿真程序及分析 7.8 吊车-双摆系统的控制 7.8.1 吊车-双摆系统的建模 7.8.2 吊车-双摆系统的仿真 第8 章 灰色PID 控制 8.1 灰色控制原理 8.1.1 生成数列 8.1.2 GM 灰色模型 8.2 灰色PID 控制 8.2.1 灰色PID 控制的理论基础 8.2.2 连续系统灰色PID 控制 8.2.3 仿真程序及分析 8.2.4 离散系统灰色PID 控制 8.2.5 仿真程序及分析 8.3 灰色PID 的位置跟踪 8.3.1 连续系统灰色PID 位置跟踪 8.3.2 仿真程序及分析 8.3.3 离散系统灰色PID 位置跟踪 8.3.4 仿真程序及分析 第9 章 伺服系统PID 控制 9.1 伺服系统低速摩擦条件下PID 控制 9.1.1 Stribeck 摩擦模型描述 9.1.2 一个典型伺服系统描述 9.1.3 仿真程序及分析 9.2 伺服系统三环的PID 控制 9.2.1 伺服系统三环的PID 控制原理 9.2.2 仿真程序及分析 9.3 二质量伺服系统的PID 控制 9.3.1 二质量伺服系统的PID 控制原理 9.3.2 仿真程序及分析 第10 章 PID 实时控制的C++语言设计及应用 10.1 M 语言的C++化 10.2 基于C++的三轴飞行模拟台伺服系统PID 实时控制 10.2.1 控制系统构成 10.2.2 系统各部分功能的软件设计 10.2.3 仿真程序及分析 参考文献
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值