赞
踩
今天成功用差速PID驱动循迹小车了,非常高兴,所以很久没更新CSDN了,今天就把这次循迹小车的核心----PID控制器函数公开一下哈!
/** **************************************************************************************** * @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
#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必须在实践中不断地总结经验。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。