当然有了!现在我就准备给大家安利一下了。一般同学会去某度上搜,看到各种各样版本的PID示例,或者去GitHub上白嫖。
其实一些芯片公司会提供一些控制领域的解决方案了,这里面就会包括PID库。
比如ST的"ST Motor Control Sdk",或者TI的C2000系列的control suite。
不过目前TI官方对于control suite已经不再提供相应的更新,可以继续下载这个套件.
目前control suite已经更新为C2000WARE-MOTORCONTROL-SDK.
那本文主要介绍TI的control suite,这里面除了PID外有很多控制类算法,并且配置了丰富的文档。
如何安装?
进入ti的官网,输入control suite进行搜索,就可以找到相应的安装包。
这里有离线安装包,和在线安装包。直接基于在线安装包进行操作即可。我们先下载安装包。
下面就是一路疯狂点击Next
即可;
源码和文档
进入主界面,这里基本的例子都是基于TI的C2000系列的MCU进行开发的,具体如下图所示;
主界面进入主界面之后,我们可以看到左侧这边包含了软硬件文档,项目示例还有相应的文档。
其实我们要找的是基于C2000系列MCU的数学算法库,可以在下列列表中找到;
当然也可以在安装目录C: icontrolSUITElibsapp_libsmotor_controlmath_blocksv4.2
下面找到相应的PID算法;
至于如何使用这几个文件,这里也提供了相应的文档,在Docs
中找到,
例如pid_grando.h
文件,这里介绍了对应的平台,当然是TI系列的MCU,并且依赖于IQMath
库,其实这里我们做一些简单的改动,就可以移植到自己所需的平台上去了,具体源码如下:
/*=================================================================================
Filename:PID_GRANDO.H
===================================================================================*/
#ifndef__PID_H__
#define__PID_H__
typedefstruct{_iqRef;//Input:referenceset-point
_iqFbk;//Input:feedback
_iqOut;//Output:controlleroutput
_iqc1;//Internal:derivativefiltercoefficient1
_iqc2;//Internal:derivativefiltercoefficient2
}PID_TERMINALS;
//note:c1&c2placedheretokeepstructuresizeunder8words
typedefstruct{_iqKr;//Parameter:referenceset-pointweighting
_iqKp;//Parameter:proportionalloopgain
_iqKi;//Parameter:integralgain
_iqKd;//Parameter:derivativegain
_iqKm;//Parameter:derivativeweighting
_iqUmax;//Parameter:uppersaturationlimit
_iqUmin;//Parameter:lowersaturationlimit
}PID_PARAMETERS;
typedefstruct{_iqup;//Data:proportionalterm
_iqui;//Data:integralterm
_iqud;//Data:derivativeterm
_iqv1;//Data:pre-saturatedcontrolleroutput
_iqi1;//Data:integratorstorage:ui(k-1)
_iqd1;//Data:differentiatorstorage:ud(k-1)
_iqd2;//Data:differentiatorstorage:d2(k-1)
_iqw1;//Data:saturationrecord:[u(k-1)-v(k-1)]
}PID_DATA;
typedefstruct{PID_TERMINALSterm;
PID_PARAMETERSparam;
PID_DATAdata;
}PID_CONTROLLER;
/*-----------------------------------------------------------------------------
DefaultinitalisationvaluesforthePIDobjects
-----------------------------------------------------------------------------*/
#definePID_TERM_DEFAULTS{
0,
0,
0,
0,
0
}
#definePID_PARAM_DEFAULTS{
_IQ(1.0),
_IQ(1.0),
_IQ(0.0),
_IQ(0.0),
_IQ(1.0),
_IQ(1.0),
_IQ(-1.0)
}
#definePID_DATA_DEFAULTS{
_IQ(0.0),
_IQ(0.0),
_IQ(0.0),
_IQ(0.0),
_IQ(0.0),
_IQ(0.0),
_IQ(0.0),
_IQ(1.0)
}
/*------------------------------------------------------------------------------
PIDMacroDefinition
------------------------------------------------------------------------------*/
#definePID_MACRO(v)
/*proportionalterm*/
v.data.up=_IQmpy(v.param.Kr,v.term.Ref)-v.term.Fbk;
/*integralterm*/
v.data.ui=_IQmpy(v.param.Ki,_IQmpy(v.data.w1,(v.term.Ref-v.term.Fbk)))+v.data.i1;
v.data.i1=v.data.ui;
/*derivativeterm*/
v.data.d2=_IQmpy(v.param.Kd,_IQmpy(v.term.c1,(_IQmpy(v.term.Ref,v.param.Km)-v.term.Fbk)))-v.data.d2;
v.data.ud=v.data.d2+v.data.d1;
v.data.d1=_IQmpy(v.data.ud,v.term.c2);
/*controloutput*/
v.data.v1=_IQmpy(v.param.Kp,(v.data.up+v.data.ui+v.data.ud));
v.term.Out=_IQsat(v.data.v1,v.param.Umax,v.param.Umin);
v.data.w1=(v.term.Out==v.data.v1)?_IQ(1.0):_IQ(0.0);
#endif//__PID_H__
这里面不仅仅做了积分抗饱和,还有对微分环节的滤波处理,所以应用到项目中是没有问题的。
代码中需要了解Q格式的相关的知识,可以参考一下我的这篇文章《一文教你搞懂C语言的Q格式》;
另外,这个路径下的文档中,还提供了相应的Example
,以及PID的信号流图,具体如下所示:
审核编辑 :李倩
-
mcu
+关注
关注
146文章
16840浏览量
349715 -
PID
+关注
关注
35文章
1467浏览量
85138 -
C语言
+关注
关注
180文章
7588浏览量
135734
原文标题:分享一个直接用于项目开发的PID库!很好用,附下载!
文章出处:【微信号:mcu168,微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论