串级pid就是两个pid放在一块
这个博客讲的很全,里边讲了普通pid和串级pid
(19条消息) PID超详细教程——PID原理+串级PID+C代码+在线仿真调参_skythinker616的博客-CSDN博客_pid在线仿真软件
这个串级pid对于会用增量式pid的来说没什么可讲的,pid是闭环的最低要求,这个学不会估计也没以后了,简短说一下pid,这个东西是一个不需要模型的闭环算法,有位置pid是用来搞舵机打角的,增量式pid速度闭环可以用。
下面上串级pid的代码,串级用的是两个pid,去掉一个就是增量式pid了。
这个是.c的
/*
* chuanji_pid.c
*
* Created on: 2022年12月29日
* Author: dell
*/
#include "chuanji_pid.h"
//用于初始化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_dange(_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;
}
//CascadePID mypid;//创建一个PID结构体变量,下面进行使用
//PID pid_;
/*******************************************/
//float feedbackValue=...;//这里获取到被控对象的反馈值
//float targetValue=...;//这里获取到目标值
//PID_Init(&mypid,10,1,5,800,1000);//初始化PID参数
//PID_Calc(&mypid,targetValue,feedbackValue);进行PID计算,结果在output成员变量中
/*******************************************/
//串级PID的计算函数
//参数(PID结构体,外环目标值,外环反馈值,内环反馈值)
void PID_chuanji(CascadePID *pid,float outerRef,float outerFdb,float innerFdb)
{
PID_dange(&pid->outer,outerRef,outerFdb);//计算外环
PID_dange(&pid->inner,pid->outer.output,innerFdb);//计算内环
pid->output=pid->inner.output;//内环输出就是串级PID的输出
//把内环计算出来的输出值放入到CascadePID结构体的output中
}
//CascadePID mypid;//创建串级PID结构体变量
/*************************************************************/
//PID_Init(&mypid.inner,10,0,0,0,1000);//初始化内环参数
//PID_Init(&mypid.outer,5,0,5,0,100);//初始化外环参数
//float outerTarget=...;//获取外环目标值
//float outerFeedback=...;//获取外环反馈值
//float innerFeedback=...;//获取内环反馈值
//PID_CascadeCalc(&mypid,outerTarget,outerFeedback,innerFeedback);//进行PID计算
//delay(10);//延时一段时间
/*******************************************************/
这个是.h的
/*
* chuanji_pid.h
*
* Created on: 2022年12月29日
* Author: dell
*/
#ifndef CODE_CHUANJI_PID_H_
#define CODE_CHUANJI_PID_H_
//首先定义PID结构体用于存放一个PID的数据
typedef struct _PID
{
float kp,ki,kd;//三个系数
float error,lastError;//误差、上次误差
float integral,maxIntegral;//积分、积分限幅
float output,maxOutput;//输出、输出限幅
}_PID;
//串级PID的结构体,包含两个单级PID
typedef struct CascadePID
{
_PID inner;//内环
_PID outer;//外环
float output;//串级输出,等于inner.output
}CascadePID;
void PID_Init(_PID *pid,float p,float i,float d,float maxI,float maxOut);
void PID_dange(_PID *pid,float reference,float feedback);
void PID_chuanji(CascadePID *pid,float outerRef,float outerFdb,float innerFdb);
#endif /* CODE_CHUANJI_PID_H_ */