/*==============================================================================
在使用單片機作為控制cpu時,請稍作簡化,具體的PID參數必須由具體對象通過實驗確定。
由於單片機的處理速度和ram資源的限制,壹般不采用浮點數運算,而將所有參數全部用整數,
運算到最後再除以壹個2的N次方數據(相當於移位),作類似定點數運算,可大大提高運算速度,
根據控制精度的不同要求,當精度要求很高時,註意保留移位引起的“余數”,做好余數補償。
這個程序只是壹般常用pid算法的基本架構,沒有包含輸入輸出處理部分。
==============================================================================*/
#include <string.h>
#include <stdio.h>
/*===============================================================================
PID Function
The PID function is used in mainly
control applications. PID Calc performs one iteration of the PID
algorithm.
While the PID function works, main is just a dummy program showing
a typical usage.
PID功能
在PID功能主要用於控制應用。 PID 計算器執行壹個PID的叠代算法。雖然PID功能的工程,
主要只是壹個虛擬程序顯示壹個典型的使用。
================================================================================*/
typedef struct PID {
double SetPoint; // 設定目標 Desired Value
double Proportion; // 比例常數 Proportional Const
double Integral; // 積分常數 Integral Const
double Derivative; // 微分常數 Derivative Const
double LastError; // Error[-1]
double PrevError; // Error[-2]
double SumError; // Sums of Errors
} PID;
/*================================ PID計算部分===============================*/
double PIDCalc( PID *pp, double NextPoint )
{
double dError, Error;
Error = pp->SetPoint - NextPoint; // 偏差
pp->SumError += Error; // 積分
dError = pp->LastError - pp->PrevError; // 當前微分
pp->PrevError = pp->LastError;
pp->LastError = Error;
return (pp->Proportion * Error // 比例項
+ pp->Integral * pp->SumError // 積分項
+ pp->Derivative * dError // 微分項
);
}
/*======================= 初始化的PID結構 Initialize PID Structure===========================*/
void PIDInit (PID *pp)
{
memset ( pp,0,sizeof(PID));
}
/*======================= 主程序 Main Program=======================================*/
double sensor (void) // 虛擬傳感器功能 Dummy Sensor Function{ return 100.0;}
void actuator(double rDelta) // 虛擬驅動器功能 Dummy Actuator Function{}
void main(void)
{
PID sPID; // PID控制結構 PID Control Structure
double rOut; // PID響應(輸出) PID Response (Output)
double rIn; // PID反饋(輸入) PID Feedback (Input)
PIDInit ( &sPID ); // 初始化結構 Initialize Structure
sPID.Proportion = 0.5; // 設置PID系數 Set PID Coefficients
sPID.Integral = 0.5;
sPID.Derivative = 0.0;
sPID.SetPoint = 100.0; // 設置PID設定 Set PID Setpoint
for (;;)
{ // 模擬最多的PID處理 Mock Up of PID Processing
rIn = sensor (); // 讀取輸入 Read Input
rOut = PIDCalc ( &sPID,rIn ); // 執行的PID叠代 Perform PID Interation
actuator ( rOut ); // 所需的更改的影響 Effect Needed Changes
}