0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

硬件攻城狮 来源:小麦大叔 作者:小麦大叔公众号 2022-09-07 14:39 次阅读

最近有朋友问到有没有现成的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进行搜索,就可以找到相应的安装包。

15162312-243c-11ed-ba43-dac502259ad0.png

这里有离线安装包,和在线安装包。直接基于在线安装包进行操作即可。我们先下载安装包。

152afbb6-243c-11ed-ba43-dac502259ad0.png

下面就是一路疯狂点击Next即可;

153ee9fa-243c-11ed-ba43-dac502259ad0.png界面 1154ffede-243c-11ed-ba43-dac502259ad0.png界面 21558b0e2-243c-11ed-ba43-dac502259ad0.png界面 315645122-243c-11ed-ba43-dac502259ad0.png界面 41573424a-243c-11ed-ba43-dac502259ad0.png耐心等待15847a1a-243c-11ed-ba43-dac502259ad0.png安装成功

源码和文档

进入主界面,这里基本的例子都是基于TI的C2000系列的MCU进行开发的,具体如下图所示;

15932344-243c-11ed-ba43-dac502259ad0.png主界面

进入主界面之后,我们可以看到左侧这边包含了软硬件文档,项目示例还有相应的文档。


15a72560-243c-11ed-ba43-dac502259ad0.png

其实我们要找的是基于C2000系列MCU的数学算法库,可以在下列列表中找到;

15b7bcb8-243c-11ed-ba43-dac502259ad0.png

当然也可以在安装目录C: icontrolSUITElibsapp_libsmotor_controlmath_blocksv4.2下面找到相应的PID算法;

15d219a0-243c-11ed-ba43-dac502259ad0.png

至于如何使用这几个文件,这里也提供了相应的文档,在Docs中找到,

15e380b4-243c-11ed-ba43-dac502259ad0.png

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

160a2412-243c-11ed-ba43-dac502259ad0.png16169ea4-243c-11ed-ba43-dac502259ad0.png

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    146

    文章

    16840

    浏览量

    349715
  • PID
    PID
    +关注

    关注

    35

    文章

    1467

    浏览量

    85138
  • C语言
    +关注

    关注

    180

    文章

    7588

    浏览量

    135734

原文标题:分享一个直接用于项目开发的PID库!很好用,附下载!

文章出处:【微信号:mcu168,微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    直接I/O

    电子发烧友网站提供《直接I/O.pdf》资料免费下载
    发表于 10-14 10:55 0次下载
    <b class='flag-5'>直接</b>I/O<b class='flag-5'>库</b>

    第九章-PID整定方法 STM32PID驱动编码器 STM32PID控制电机转速

    ://www.bilibili.com/video/BV16x4y1M7EN/?spm_id_from=333.337.search-card.all.click V3:HAL开发、功能:PID速度
    的头像 发表于 08-21 16:37 854次阅读
    第九章-<b class='flag-5'>PID</b>整定方法 STM32<b class='flag-5'>PID</b>驱动编码器 STM32<b class='flag-5'>PID</b>控制电机转速

    第13章-循迹功能 STM32智能小车循迹教程 PID循迹算法分析

    第13章-循迹功能 循迹小车讲解 原理分析 STM32智能小车循迹教程 红外对管使用 PID循迹算法分析V3:HAL开发、功能:PID速度控制、P
    的头像 发表于 08-21 16:27 898次阅读
    第13章-循迹功能 STM32智能小车循迹教程 <b class='flag-5'>PID</b>循迹算法分析

    ESP8266需要烧录固件

    需要。ESP8266是款非常流行的Wi-Fi模块,广泛应用于物联网项目中。它具有低成本、低功耗、易于编程等特点,因此受到了许多开发者的喜爱。在开发
    的头像 发表于 08-19 17:30 578次阅读

    请问下,网上购买的硬件设备是否是可以用于直接当做我们的需求使用?还是说这个只能用于特定的调音的功能?

    我有需求是: 但是, 1)因为这个算是很简单的需求。是否有现有的产品可以直接使用呢? 2)因为如果自己进行
    发表于 08-07 15:45

    位置式PID与增量式PID的区别

    PID(比例-积分-微分)控制器作为工业自动化领域中的核心控制算法,广泛应用于各种需要精确控制的系统中。在PID控制器的实现中,有两种主要的控制模式:位置式PID和增量式
    的头像 发表于 06-05 16:23 5499次阅读

    STM32L471RE同样的硬件使用LL和HAL编译的工程运行功耗不样?为什么?

    项目在使用STM32L471RE开发,涉及到低功耗的处理。在测试过程中发现同样的硬件结构(PCB上仅焊接mcu的最小系统),使用LL和HAL生产的两
    发表于 03-21 06:17

    寻找能够PID调节的仿真软件

    最近想学习些有关PID调节的知识,有没有些相关资料推荐?文章书籍什么随便都可以;还有就是寻找几款有关PID在线调节的网址或者软件,能够使我对PI
    发表于 02-29 22:44

    什么是pid控制原理 pid各个参数对系统的影响

    PID(Proportional-Integral-Derivative)控制是种常见的控制算法,广泛应用于工业过程控制、机器人控制、自动驾驶等领域。本文将详细介绍PID控制的原理以
    的头像 发表于 01-22 15:35 4716次阅读

    pid参数分别起到什么作用

    在计算机科学中,PID(进程标识符)是用于标识运行中的进程的整数值。PID主要具有以下三
    的头像 发表于 01-16 14:56 1.1w次阅读

    mysql怎么新建个数据库

    mysql怎么新建个数据库 如何新建个数据库在MySQL中 创建个数据库是MySQL中的基
    的头像 发表于 12-28 10:01 823次阅读

    何为PID?为何需要PIDPID能达到什么作用?

    何为PID?为何需要PIDPID能达到什么作用? PID是英文Proportional-Integral-Derivative的缩写,即比例-积分-微分控制器。它是
    的头像 发表于 12-07 13:37 1326次阅读

    硅光电倍增管用于直接飞行时间测距应用():直接ToF测距系统的设计

    硅光电倍增管用于直接飞行时间测距应用():直接ToF测距系统的设计
    的头像 发表于 12-07 10:23 596次阅读
    硅光电倍增管<b class='flag-5'>用于</b><b class='flag-5'>直接</b>飞行时间测距应用(<b class='flag-5'>一</b>):<b class='flag-5'>直接</b>ToF测距系统的设计

    mysql是什么类型的数据

    MySQL是种关系型数据管理系统(RDBMS),用于存储和管理大量结构化数据。它被广泛用于各种应用程序和网站的后端,包括电子商务平台、社交媒体网站、金融系统等等。MySQL的特点是
    的头像 发表于 11-16 14:43 1617次阅读

    MATLAB如何实现PID

    MATLAB是种非常强大的工具,用于实现和分析PID(比例-积分-微分)控制器。在MATLAB中,您可以使用控制系统工具箱来设计、模拟和调整PID控制系统。以下是
    的头像 发表于 11-04 08:00 2672次阅读
    MATLAB如何实现<b class='flag-5'>PID</b>?