位置式PID代码套用模板,学不会你打我

史上最简单的位置式PID套用代码

.h文件

PID.H文件 代码

#ifndef __PID_H
#define __PID_H
#include "stm32f10x.h"
typedef struct PID //PID算法的数据结构 
{
	//参数
  float P;         
  float I;
  float D;
  
  float Error;     //比例项
  float Integral;  //积分项
  float Differ;    //微分项
  float PreError;  //前一个误差值
  float PrePreError;//前前误差值
  //积分限幅
  float Ilimit; 
  float Irang;
  
  //P&I&D的输出
  float Pout;
  float Iout;
  float Dout;
  //总输出
  float OutPut;   
  //积分分离标志	
  uint8_t Ilimit_flag;    
}PID_TYPE;

//函数定义区
void PidPrg_init(void);
void PID_Pos(PID_TYPE*PID,float target,float measure);
#endif

PID_TYPE结构体用于存放PID的参数,以及带入PID计算的变量定义,外加PID的各类输出和总输出,同时定义的PID限幅的flag,用于是否加入或者调整积分的加入时间以及积分输出范围。

函数定义了两个函数,一个用于PID参数的初始化–PidPrg_init();以及位置式PID的主题函数PID_Pos();
函数传入三个值:PID_TYPE类型的结构体,target目标值,以及measure即测量值

.C文件

对应头文件的PID 内联代码片

#include "pid.h"
//PID调用函数,每个调用周期调用传参,然后将PID_TYPE的里面的OutPut总输出传出就行
void PID_Pos(PID_TYPE*PID,float target,float measure)
{
	PID->Error  = target - measure;              //误差
	PID->Differ = PID->Error - PID->PreError;    //微分量
	PID->Pout = PID->P * PID->Error;                        //比例控制
	PID->Iout = PID->Ilimit_flag * PID->I * PID->Integral;  //积分控制
	PID->Dout = PID->D * PID->Differ;                       //微分控制
	PID->OutPut =  PID->Pout + PID->Iout + PID->Dout;       //比例 + 积分 + 微分总控制
	
	PID->Integral += PID->Error;                        //对误差进行积分
	if(PID->Integral > PID->Irang)                      //积分限幅
		PID->Integral = PID->Irang;
	if(PID->Integral < -PID->Irang)                     //积分限幅
		PID->Integral = -PID->Irang;                    
	PID->PreError = PID->Error ;                            //前一个误差值
}
//PID的初始化函数,里面放上自己要初始化的值,然后在主函数里面调用初始化就完成了
void PidPrg_init(void) 
{}

进群下载源码

QQ群:773080352
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_45396672/article/details/109106216
今日推荐