最近有朋友问到有没有现成的c语言pid库。
当然有了!现在我就准备给大家安利一下了。一般同学会去某度上搜,看到各种各样版本的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的信号流图,具体如下所示:
动力电池强劲需求拉动,热管理供应链企业迎利好
华为p10,除了速度和颜值,还能主打什么呢?
主板芯片组代码大全
六百左右的蓝牙耳机哪款好?四款音质好的蓝牙耳机推荐
通过电源线窃取隔离电脑数据的攻击手段
一个直接用于项目开发的PID库分享
集成电路产业再次成为关注的焦点
Vishay推出反向恢复性能达到业界先进水平的 FRED Pt® 第五代600 V Hyperfast恢复整流器
微波雷达感应模组在智能垃圾桶的应用
谷歌最新推出云存储服务Google One
承德科胜蠕动泵灌装机|芥末油灌装机|河北灌装机
场效应管的特点及作用
一波未平一波又起,中兴危机何时了?
工业4G路由器:实现AGV小车通信畅通的秘密武器
中科院物理研究所实现8英寸碳化硅生长的突破
日本锂电
未来医疗芯片的四大发展趋势
SAW LC振荡器原理分析
PLC编程技术在电气设备中的应用
锂电池快充带来了什么风险?锂电池快充的风险有哪些?