pid介绍
一控制器的输出。
一控制器输入,它是给定值和被控对象输出值的差,称偏差信号。
一控制器的比例系数。
一控制器的积分时间。
一控制器的微分时间。
偏差量 = 目标量-反馈值
比例P:数值固定
需要限幅最大值和最小值 出现故障会导致无限累加
不运行时清零
积分I(增幅比例小了增幅) :求导之前的函数 偏差量的累加
微分D(抑制比例大了抑制): 求导函数,然后再乘以dx 预测下一次的偏差量,加到结果中
离散状态下的积分计算其实就是把过去采样得到的所有误差加在一起
微分计算其实就是把这一轮计算得到的误差与上一轮的误差相减。
- 比例环节:起主要控制作用,使反馈量向目标值靠拢,但可能导致振荡
- 积分环节:消除稳态误差,但会增加超调量
- 微分环节:产生阻尼效果,抑制振荡和超调,但会降低响应速度
被控对象:需要控制的对象
目标值:期望被控对象达到的状态量
反馈值:被控对象当前时刻的状态量
输出量:PID的计算结果
误差:目标值-反馈值
稳态误差:系统稳定状态下仍存在的误差
pid c语言代码
//首先定义PID结构体用于存放一个PID的数据
typedef struct
{
float kp,ki,kd;//三个系数
float error,lastError;//误差、上次误差
float integral,maxIntegral;//积分、积分限幅
float output,maxOutput;//输出、输出限幅
}PID;
//用于初始化pid参数的函数
void PID_Init(PID *pid,float p,float i,float d,float maxI,float maxOut)
{
pid->kp=p;
pid->ki=i;
pid->kd=d;
pid->maxIntegral=maxI;
pid->maxOutput=maxOut;
}
//进行一次pid计算
//参数为(pid结构体,目标值,反馈值),计算结果放在pid结构体的output成员中
void PID_Calc(PID *pid,float reference,float feedback)
{
//更新数据
pid->lastError=pid->error;//将旧error存起来
pid->error=reference-feedback;//计算新error
//计算微分
float dout=(pid->error-pid->lastError)*pid->kd;
//计算比例
float pout=pid->error*pid->kp;
//计算积分
pid->integral+=pid->error*pid->ki;
//积分限幅
if(pid->integral > pid->maxIntegral) pid->integral=pid->maxIntegral;
else if(pid->integral < -pid->maxIntegral) pid->integral=-pid->maxIntegral;
//计算输出
pid->output=pout+dout+pid->integral;
//输出限幅
if(pid->output > pid->maxOutput) pid->output=pid->maxOutput;
else if(pid->output < -pid->maxOutput) pid->output=-pid->maxOutput;
}
PID mypid;//创建一个PID结构体变量
int main()
{
PID_Init(&mypid,10,1,5,80,100);//初始化PID参数
while(1)//进入循环运行
{
float feedbackValue=...;//这里获取到被控对象的反馈值
float targetValue=...;//这里获取到目标值
PID_Calc(&mypid,targetValue,feedbackValue);//进行PID计算,结果在output成员变量中
设定执行器输出大小(mypid.output);
delay(10);//等待一定时间再开始下一次循环
}
}
matlab自动计算pid参数
导入数据input和output的
simulink中调整这三个模块