<二>带积分限幅的PID控制算法

该文章已生成可运行项目,

目录

<二>带积分限幅的PID控制算法

开发环境

一、PID控制算法常用优化方式

二、积分限幅

三、带积分限幅的PID控制算法

<二>带积分限幅的PID控制算法

开发环境

主控芯片:STM32F103C8T6

一、PID控制算法常用优化方式

基础的位置式PID及增量式PID算法只是最基本的算法控制,
在实际应用时里面会存在很多问题。因此在使用中往往需要根据实际需求对PID控制算法进行优化。
常用的PID控制算法有积分限幅、积分分离、变速积分、微分先行、
不完全微分、输出偏移及输入死区等优化方式。

二、积分限幅

如果执行器因为卡住、断电、损坏等原因不能消除误差,
则误差积分会随着时间无限制加大,进而达到深度饱和状态。
此时PID控制器会持续输出最大的调控力,即使后续执行器恢复正常,
PID控制器在短时间内也会维持最大的调控力,直到误差积分从深度饱和状态退出。
积分限幅就是限制积分的幅度,防止积分深度饱和。
积分限幅实现思路:我们可以对误差积分或积分项输出进行判断,
如果幅值超过指定阈值,则进行限制。

三、带积分限幅的PID控制算法

#include "stm32f10x.h"
#include "timer.h"
​
//====================定义位置式PID算法的相关变量====================
//目标值、实际值、输出值
float target, actual, output;   
​
//比例控制系数、积分控制系数、微分控制系数
float Kp, Ki, Kd;
​
//当前误差值、前一次误差值、误差值的积分
float error0, error1, errorInt;
​
//积分项输出
float Intoutput;
​
int main(void)
{
   //配置系统时钟及各种外设初始化
   //=====================
   //系统时钟及各种外设初始化
   //===================== 
    
   //配置定时器初始化(这里省略定时器的具体配置)
   Timer_Init();
    
   //设定目标值及控制系数 
   target = 目标值;
   Kp = 比例控制系数;
   Ki = 积分控制系数;
   Kd = 微分控制系数;
   
   while(1)
   {
      //===================== 
      //用户程序
      //===================== 
   }
}
​
//定时器中断处理函数(这里以TIM2为例)
void TIM2_IRQHandler(void)
{
    //定时器2溢出中断触发后,进行一次PID控制
    if(TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
    {
        //================PID控制算法================
        //1、读取实际值(一般从各种传感器中获得)
        actual = Get_Value_From_Sensor();
        
        //2、获取前一次误差值及当前误差值
        //前一次误差值就是上一轮的当前误差值(新的误差值到下一轮会变成旧的误差值,即前一次的误差值)
        error1 = error0;
        //当前误差值 = 目标值 - 当前从传感器读取的实际值
        error0 = target - actual;
        
        //########################积分限幅算法实现##################################
        //积分限幅实现可以有两种方式:(两种方式选择其一即可)
        //方法1、单独对误差积分进行限幅
        //方法2、对积分项的输出进行限幅
        
        //======================方法1、单独对误差积分进行限幅========================
        //3、计算误差积分
        errorInt += error0;
        
        //4、误差积分限幅
        if(errorInt > 误差积分上限值)
            errorInt = 误差积分上限值;
        if(errorInt < 误差积分下限值)
            errorInt = 误差积分下限值;
            
        //5、带入位置式PID公式进行计算
        output = Kp * error0 + Ki * errorInt + Kd * (error0 - error1); 
        //======================================================================
        
        //======================方法2、对积分项的输出进行限幅========================
        //3、计算积分项输出
        Intoutput += Ki * error0;
        
        //4、积分项输出限幅
        if(Intoutput > 积分项输出上限值)
            Intoutput = 积分项输出上限值;
        if(Intoutput < 积分项输出下限值)
            Intoutput = 积分项输出下限值;
            
        //5、带入位置式PID公式进行计算
        output = Kp * error0 + Intoutput + Kd * (error0 - error1);  
        //======================================================================
        
        //#######################################################################
​
        //6、输出限幅(通常会设置PID输出的上下限,避免超出范围)
        if(output > 上限值)
            output = 上限值;
        if(output < 下限值)
            output = 下限值;
        //7、使用PID输出的新值控制被控对象
        将最新调控值输出给被控对象(output);
        
        //清除溢出中断标志位
        TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
    } 
}
本文章已经生成可运行项目
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牧以南歌〆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值