直接用于项目开发的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:\ti\controlSUITE\libs\app_libs\motor_control\math_blocks\v4.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 words

typedef 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的信号流图,具体如下所示:

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 下面给出野火PID调试助手标准的一个例程: ```c #include <stdio.h> #include "pid.h" int main() { PID pid = {0}; // 定义一个PID结构体并初始化 float setpoint = 50.0; // 设定目标值为50.0 float input = 0.0; // 初始化输入值为0.0 float output = 0.0; // 初始化输出值为0.0 // 设置PID参数 pid_set_params(&pid, 1.0, 0.1, 0.05); // 循环运行PID控制器 while(1) { input = get_input(); // 获取输入值 output = pid_compute(&pid, setpoint, input); // 计算输出值 set_output(output); // 输出控制信号 } return 0; } ``` 在上述代码中,首先定义了一个PID结构体并初始化。然后设定目标值为50.0,并初始化输入值和输出值。接着调用 `pid_set_params` 函数设置PID参数。最后进入一个无限循环,在每次循环中,获取输入值,计算输出值,输出控制信号。其中 `get_input` 和 `set_output` 函数需要根据具体的应用进行实现。 需要注意的是,PID参数的设置需要根据具体的系统进行调整,以达到最佳的控制效果。 ### 回答2: 野火pid调试助手标准例程是用于野火单片机上的PID控制算法的调试工具,它提供了一系列的标准例程,方便用户进行PID参数的调试和优化。 PID控制算法是一种常用的控制算法,它通过比较实际输出值与期望输出值的差异,并根据比例、积分和微分三个参数来调节控制器的输出,从而实现对系统的精确控制。野火pid调试助手标准例程实现了这个算法,便于用户在单片机上进行PID控制器的开发和调试。 这个标准例程提供了一些常见的PID算法实现函数,比如输入输出初始化函数、PID参数初始化函数、计算PID输出函数等。用户可以根据自己的需求,选择合适的函数来进行PID参数的设置和反馈值的计算,从而实现对控制过程的调试和优化。 使用野火pid调试助手标准例程,用户只需简单调用相应的函数,就能够完成对PID控制器的建立和运行。通过不断调节PID参数,并观察系统的响应和输出,用户可以快速找到最佳的PID参数组合,从而实现对系统的精确控制。 总之,野火pid调试助手标准例程为用户提供了一套简单易用的PID调试工具,帮助用户快速搭建PID控制器并进行参数的调试和优化,为控制系统的稳定性和精确性提供了很大的帮助。 ### 回答3: 野火PID调试助手标准例程是一套针对PID控制算法的开发工具,用于帮助开发者快速实现PID控制算法并进行调试。该标准例程提供了一组预先定义好的函数,通过调用这些函数,开发者可以方便地使用PID控制算法。 例程中包含的函数主要包括PID初始化、设定目标值、设置参数、执行控制计算等。开发者可以通过调用这些函数,按照自己的需求进行PID控制算法的实现。通过这些函数的合理使用,开发者可以更加高效地进行PID控制的调试。 例如,开发者可以使用PID初始化函数来初始化PID控制器的相关参数,包括比例系数、积分系数和微分系数等。然后,可以使用设定目标值函数来设定PID控制器的目标值。接着,可以使用设置参数函数来调整PID控制器的参数,以达到更好的控制效果。 在进行PID控制计算时,开发者可以调用执行控制计算函数,根据实际的反馈信号和目标值进行PID计算,并得到输出的控制量。通过不断地调试和优化,开发者可以实现有效的PID控制算法。 总之,野火PID调试助手标准例程提供了一套方便易用的函数,帮助开发者快速实现PID控制算法,并进行调试。通过合理利用这些函数,开发者可以更加高效地进行PID控制的开发工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值