目录
<二>带积分限幅的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);
}
}

1115

被折叠的 条评论
为什么被折叠?



