[TOC]

.h文件

PID.H文件 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#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 内联代码片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#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
在这里插入图片描述

wechat