|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
位置式 PID 控制算法 / P) q% P, q0 ^9 z8 d# u
- W# Q* `4 ?4 D) x2 f/ _/ i) N
在使用单片机作为控制 cpu 时,请稍作简化,具体的 PID 参数必须由具体对象通过实验确定。由于单片机的处理速度和 ram 资源的限制,一般不采用浮点数运算,而将所有参数全部用整数,运算到最后再除以一个 2 的 N 次方数据(相当于移位) ,作类似定点数运算,可大大提高运算速度,根据控制精度的不同要求,当精度要求很高时,注意保留移位引起的 “余数 ”,做好余数补偿。这个程序只是一般常用 pid 算法的基本架构,没有包含输入输出处理部分。/ L0 M- e; A8 p
' r( J% k- N( n: W# e4 G, ^* ~#include <string.h> $ v9 t0 b( E: q1 t! A* H v' t
#include <stdio.h> 0 |$ F: y, I# }: a, j
0 g* n: P9 T6 y
PID Function
0 _' C6 M% S# B5 A6 o, N+ yThe PID function is used in mainly 8 A2 {1 o- J8 s' c& o' N
control applications. PID Calc peRForms one iteration of the PID
* k6 Z) A6 Y! f6 }& J, v8 malgorithm.
& y. K- r: G$ ]' a% i: D8 I# N6 uWhile the PID function works, main is just a dummy program showing 6 p1 _0 ~ R: G
a typical usage.
* T# a' E% s+ _, o3 g& ~# z) A7 [- c- `4 H
PID 功能
" a% v! d/ {( E" [' H在 PID 功能主要用于控制应用。 PID 计算器执行一个 PID 的迭代算法。虽然 PID 功能的工程,$ a3 G" v; S* G3 ?- H/ z
主要只是一个虚拟程序显示一个典型的使用。
9 I& m1 F x, Y5 stypedef struct PID {
1 l& ^8 m5 d. P; j- y. ~! v" fdouble SetPoint; // 设定目标 Desired Value
$ D. @/ W2 S3 l) k+ zdouble Proportion; // 比例常数 Proportional Const : [2 y+ V: C2 g4 _
double Integral; // 积分常数 Integral Const 8 e' y: S9 S) T( j, U* E
double Derivative; // 微分常数 Derivative Const
* \+ k+ l- r. r' Xdouble LastError; // Error[-1] / `2 _( x: M8 Y7 }2 D( ]' V
double PrevError; // Error[-2]
* U, m# w9 f) J& H `/ tdouble SumError; // Sums of Errors
- H Y$ d0 x" i1 p- C9 E5 Q} PID; 1 W( |% Q% m8 }3 P
double PIDCalc( PID *pp, double NextPoint ) $ a* d) y1 {) F( D u* h& u4 t$ i( r6 W
{ ) x0 N. M7 z3 ?* k
double dError, Error; 3 p, o9 M6 J% b$ U2 p
Error = pp->SetPoint - NextPoint; // 偏差
7 ?4 A$ V- U- C4 ]) _
% H0 B4 w- V1 D( z* o: U
6 v5 w! r- D& l$ qpp->SumError += Error; // 积分
9 i; W/ X/ H) d. S. E6 m. w( VdError = pp->LastError - pp-> PrevError; // 当前微分
3 I8 L# @% a7 E* T% Wpp-> PrevError = pp->LastError; 9 ?# @ t4 Y: i& H. l
pp->LastError = Error;
: J# q8 c: a sreturn (pp-> Proportion * Error // 比例项+ F5 M7 B% ]: H* X" h
+ pp->Integral * pp->SumError // 积分项8 y" W! ]& p$ F. K. l+ J
+ pp->Derivative * dError // 微分项0 t9 A3 `' ?+ H/ T* D
); . a `4 B* G* J, v/ i
}
( B/ u- n6 s& X- H- d% o/*======================= 初始化的 PID 结构 Initialize PID 0 l6 |1 D4 D/ s* v
Structure===========================*/
, a( o$ G6 j6 o, qvoid PIDInit (PID *pp)
/ ]% l1 H" Q' o$ U{ 4 o. Z4 l" D# E
memset ( pp,0,sizeof(PID)); 5 v' ~1 b1 o3 I. |
}
q) m- v+ U. V2 q j7 k @( A/*======================= 主程序 Main
4 \, }. }3 H; @) \' N! M; |0 WProgram=======================================*/ 2 T0 d* q1 l; b3 t
double sensor (void) // 虚拟传感器功能 Dummy Sensor Function{ return 100.0;} 2 }+ L* _- [! i0 ?; \* e
void actuator(double rDelta) // 虚拟驱动器功能 Dummy Actuator Function{} 7 \, Z5 ~9 L- m1 y4 ?- Y! g
void main(void)
8 _, J. F2 K9 s{
- U, I( R+ e, \( gPID sPID; // PID 控制结构 PID Control Structure
0 o6 l J6 p$ t K6 E$ tdouble rOut; // PID 响应(输出) PID Response (Output)
+ ]/ O) O9 l! r2 O7 q( f. C- Edouble rIn; // PID 反馈(输入) PID Feedback (Input) ! G: [) D/ |: f
PIDInit ( &sPID ); // 初始化结构 Initialize Structure
( k0 Q8 m4 T' m1 T4 C7 |6 ^" B nsPID.Proportion = 0.5; // 设置 PID 系数 Set PID Coefficients
% l& n9 j0 T( j, ^sPID.Integral = 0.5; 3 W) i9 u- w# g- r/ H6 G
sPID.Derivative = 0.0;
/ W I0 ^+ O( ]sPID.SetPoint = 100.0; // 设置 PID 设定 Set PID Setpoint 6 W* Y, U" s" f
for (;;) . j! t3 l# h p- B
{ // 模拟最多的 PID 处理 Mock Up of PID Processing 2 t* c- p( z) z% k: y3 R/ S+ N
rIn = sensor (); // 读取输入 Read Input
1 g- i* E7 c0 g( C' R6 W5 K5 @ M/ ~, g
' o1 G+ s$ t, b( v* n, c
rOut = PIDCalc ( &sPID,rIn ); // 执行的 PID 迭代 Perform PID Interation , ]$ s$ r# G' q0 y' Y
actuator ( rOut ); // 所需的更改的影响 Effect Needed Changes
* y4 b' T }, [6 K* R; o7 t/ B/ g' N" Q% C* O! \
0 K: X4 y5 W% A2 X
( N7 K* b' z3 h% z2 l' X
- ~5 ?6 Z4 u2 G" M$ Q, F! f6 t
$ T% K' p7 [$ F5 Z; a& |# {0 ^- n# }
|
|