今天给大家安利一下了。一般同学会去某度上搜,看到各种各样版本的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即可;
界面 1界面 2界面 3界面 4耐心等待安装成功
源码和文档
进入主界面,这里基本的例子都是基于ti的c2000系列的mcu进行开发的,具体如下图所示;
主界面
进入主界面之后,我们可以看到左侧这边包含了软硬件文档,项目示例还有相应的文档。
其实我们要找的是基于c2000系列mcu的数学算法库,可以在下列列表中找到;
当然也可以在安装目录c: icontrolsuitelibsapp_libsmotor_controlmath_blocksv4.2下面找到相应的pid算法;
至于如何使用这几个文件,这里也提供了相应的文档,在docs中找到,
例如pid_grando.h文件,这里介绍了对应的平台,当然是ti系列的mcu,并且依赖于iqmath库,其实这里我们做一些简单的改动,就可以移植到自己所需的平台上去了,具体源码如下:
/* =================================================================================
file name: pid_grando.h
===================================================================================*/#ifndef __pid_h__#define __pid_h__typedef struct { _iq ref; // input: reference set-point
_iq fbk; // input: feedback
_iq out; // output: controller output
_iq c1; // internal: derivative filter coefficient 1
_iq c2; // internal: derivative filter coefficient 2
} pid_terminals;
// note: c1 & c2 placed here to keep structure size under 8 wordstypedef struct { _iq kr; // parameter: reference set-point weighting
_iq kp; // parameter: proportional loop gain
_iq ki; // parameter: integral gain
_iq kd; // parameter: derivative gain
_iq km; // parameter: derivative weighting
_iq umax; // parameter: upper saturation limit
_iq umin; // parameter: lower saturation limit
} pid_parameters;
typedef struct { _iq up; // data: proportional term
_iq ui; // data: integral term
_iq ud; // data: derivative term
_iq v1; // data: pre-saturated controller output
_iq i1; // data: integrator storage: ui(k-1)
_iq d1; // data: differentiator storage: ud(k-1)
_iq d2; // data: differentiator storage: d2(k-1)
_iq w1; // data: saturation record: [u(k-1) - v(k-1)]
} pid_data;
typedef struct { pid_terminals term;
pid_parameters param;
pid_data data;
} pid_controller;
/*-----------------------------------------------------------------------------
default initalisation values for the pid objects
-----------------------------------------------------------------------------*/
#define pid_term_defaults {
0,
0,
0,
0,
0
}#define pid_param_defaults {
_iq(1.0),
_iq(1.0),
_iq(0.0),
_iq(0.0),
_iq(1.0),
_iq(1.0),
_iq(-1.0)
}#define pid_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)
}/*------------------------------------------------------------------------------
pid macro definition
------------------------------------------------------------------------------*/#define pid_macro(v)
/* proportional term */
v.data.up = _iqmpy(v.param.kr, v.term.ref) - v.term.fbk;
/* integral term */
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;
/* derivative term */
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);
/* control output */
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的信号流图,具体如下所示:
所以,整体来说,这个部分的源码以及资料都非常有参考价值,由于离线文件太大,后台回复【618】获取相应安装文件。
原文标题:分享一个直接用于项目开发的pid库!很好用!
文章出处:【微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。
孙杨担任华为荣耀V9产品特使,诠释极致科技的速度与激情
Materials Today:界面调控和电极输运优化,共筑高性能锂固态电池
高效办公妙招:华为Mate40 Pro一碰连电脑,应用三开效率翻倍
TD标准抢占3G先机 独立组网声音渐强
基于超声波的定位系统研究与实现
control suite如何安装
推挽输出能当电源输出使用吗
360N5:骁龙653+6GRAM+1399元,不能等了!
索尼下一代游戏主机或将采用锐龙3600G处理器
什么是光储能电站 光储融合仍沦为“纸上谈兵”
连续激光焊接机的保护气对焊缝形状的影响
aigo双接口高速固态U盘 拯救小容量手机
PLC控制的基本电路
Python 模拟键盘鼠标的方式实现自动化
如何在iPhone上使用神经网络和人工智能技术?
外卖小哥面临失业?外国开始使用机器人送外卖
开关模式转换器NB680
考量运算放大器在Type-2补偿器中的动态响应(第一篇)
高效率的内存拷贝函数memcpy
笔记本声卡和音箱