關注、星標公眾號,不錯過精彩內容
大家好,我是小麥,最近有朋友問到有沒有現成的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即可;
原始碼和檔案
進入主界面,這里基本的例子都是基于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的信號流圖,具體如下所示:
所以,整體來說,這個部分的原始碼以及資料都非常有參考價值,由于離線檔案太大,后臺回復【control】獲取相應安裝檔案,
—— The End ——
推薦好文 點擊藍色字體即可跳轉
? 簡易PID演算法的快速掃盲
? 油管超火的PID視頻教程
? 到底什么是串級PID?
? 三面大疆慘敗,因為不懂PID的積分抗飽和
? PID系統穩定性與零極點的關系
原創不易,歡迎轉發、留言、點贊、分享給你的朋友,感謝您的支持!

長按識別二維碼關注我

你點的每個好看,我都認真當成了喜歡
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/293212.html
標籤:其他
