基于STM32的位置式PID控制器函数:
声明:本篇博客不会讲解PID的原理与定义(默认你会了),只提供一个stm32实现PID的函数,并分享另外一个大佬的PID调参经验
今天成功用差速PID驱动循迹小车了,非常高兴,所以很久没更新CSDN了,今天就把这次循迹小车的核心----PID控制器函数公开一下哈!
GuiStar_PID.h:
/**
****************************************************************************************
* @file GuiStar_PID.h
* @author GuiStar-李什么恩
* @version V1.1.0
* @date 2022-11-19
* @brief 该文件含有一个PID控制器函数,使用方法是:首先初始化一个叫做GuiStar_PIDTypedef
* 的结构体,结构体成员是P,I,D三个参数,你需要根据实际情况进行PID调参,然后使用
* 一个叫做GuiStar_P_PID的函数来完成闭环控制,详细使用方法请查看结构体和函数的说明
* 文档.
****************************************************************************************
*/
#ifndef __GUISTAR_PID_H__
#define __GUISTAR_PID_H__
#include "stm32f10x.h" // Device header
//PID调参结构体///
typedef struct
{
float KP;//PID比例参数(影响达到预期的速度)
float KI;//PID积分参数(消除由KP参数产生的静态误差)
float KD;//PID微分参数(消除达到预期过程中的震荡行为)
}GuiStar_PIDTypedef;
/*PID调参是重中之重,应用不同,参数也不同,并且还与经验有一定关系
很遗憾,这里帮不到大家了,自己努力钻研摸索吧!*/
/****************************PID控制器函数********************************/
float GuiStar_P_PID (int Current, int Target, GuiStar_PIDTypedef *PID);
#endif
GuiStar_PID.c:
#include "GuiStar_PID.h"
/**
* @brief PID控制器
* @param Current 当前值(反馈值或初始值)
* @param Target 目标值(预期达到的目标)
* @param GuiStar_PIDTypedef* PID参数结构体的地址,需要你自己去初始化以指定PID参数,
* 结构体的声明请在GuiStar_PID.h文件中查看
* @retval output 本次控制输出值(整型值)
* @suggestion 推荐这样使用PID控制器
* 定时中断,每次进入中断输入参数调用PID返回下一次输出值,
* 然后退出中断;最后在函数外部根据实际的逻辑,来
* 控制对象做相应的动作(例如:控制PWM占空比来控制电机)
*/
float GuiStar_P_PID (int Current, int Target, GuiStar_PIDTypedef* PID)
{
static float error,output,Integral_error,Last_error;
error=Target-Current;
Integral_error+=error;
output=(PID->KP)*error+(PID->KI)*Integral_error+(PID->KD)*(error-Last_error);
Last_error=error;
return output;
}
至于如何使用这两个文件,里面的注释已经很详尽了,但是不足之处就是PID调参没有具体说明,这也是我无奈的地方,因为PID调参真的很吃经验,不过基本的步骤还是有的:
请看这位大佬的博客
PID调参的步骤
OK今天就分享到这里,其实我写的PID控制器函数只是一个工具而已,PID的重中之重是调参,所以学习PID必须在实践中不断地总结经验。