一个直接用于项目开发的PID库分享

最近有朋友问到有没有现成的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编程技术在电气设备中的应用
锂电池快充带来了什么风险?锂电池快充的风险有哪些?