当前位置:   article > 正文

基于STM32的位置式PID控制器函数_stm32 微分函数

stm32 微分函数

基于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

  • 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

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;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

至于如何使用这两个文件,里面的注释已经很详尽了,但是不足之处就是PID调参没有具体说明,这也是我无奈的地方,因为PID调参真的很吃经验,不过基本的步骤还是有的:

请看这位大佬的博客
PID调参的步骤

OK今天就分享到这里,其实我写的PID控制器函数只是一个工具而已,PID的重中之重是调参,所以学习PID必须在实践中不断地总结经验。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小桥流水78/article/detail/929607
推荐阅读
相关标签
  

闽ICP备14008679号