|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
位置式 PID 控制算法
2 q* n: C& N# `6 y1 ]& y0 k7 D t( i0 q' j' K
在使用单片机作为控制 cpu 时,请稍作简化,具体的 PID 参数必须由具体对象通过实验确定。由于单片机的处理速度和 ram 资源的限制,一般不采用浮点数运算,而将所有参数全部用整数,运算到最后再除以一个 2 的 N 次方数据(相当于移位) ,作类似定点数运算,可大大提高运算速度,根据控制精度的不同要求,当精度要求很高时,注意保留移位引起的 “余数 ”,做好余数补偿。这个程序只是一般常用 pid 算法的基本架构,没有包含输入输出处理部分。
: y) m" n4 k2 T1 v( _" O# K4 o0 G( F& L0 a- R$ |% T1 v- T
#include <string.h> 0 G0 A# L0 {# h# H
#include <stdio.h> : o, Z" i0 v- P2 ?/ f2 C
/ w5 ^+ q0 O, {- }, XPID Function
9 P+ V1 R1 f8 N# aThe PID function is used in mainly . D8 D% U; d) ]7 \
control applications. PID Calc peRForms one iteration of the PID % c! E1 U9 G7 O2 n1 P; ?
algorithm. 7 \; T% _" n0 u9 V
While the PID function works, main is just a dummy program showing
8 H! s y' @9 V: U; j' @6 j; Ja typical usage. 3 N0 y6 G4 L! D/ s
6 {2 E! p: t, f: m$ k
PID 功能
4 x0 p* @" f, N在 PID 功能主要用于控制应用。 PID 计算器执行一个 PID 的迭代算法。虽然 PID 功能的工程,
$ Q8 N/ S4 {8 N! X主要只是一个虚拟程序显示一个典型的使用。
% s W1 c7 j5 J) x" k- U$ ~typedef struct PID { - W8 Q9 a7 j, y& [8 e- K
double SetPoint; // 设定目标 Desired Value
& ~0 I, p9 I1 Y# P6 O, Rdouble Proportion; // 比例常数 Proportional Const : m; x# W2 V0 f, I+ C* J
double Integral; // 积分常数 Integral Const * x* O4 u4 ]2 F3 @/ R x
double Derivative; // 微分常数 Derivative Const
4 O$ G3 x, C$ p, adouble LastError; // Error[-1] 1 j' ^0 G9 `9 U
double PrevError; // Error[-2]
) \. W; {4 ]" adouble SumError; // Sums of Errors + m h) R3 q, E6 M4 y
} PID;
3 U" F! Q$ n% h$ cdouble PIDCalc( PID *pp, double NextPoint )
7 \0 X& [, z8 o5 q: ^{
2 F$ s4 [. T- o: \! \double dError, Error; 5 a D: f; w+ t: O/ o, b
Error = pp->SetPoint - NextPoint; // 偏差& @. ]* {9 o; c+ }* l7 `; j! C
9 R: B- P" a! @3 Z5 x8 t$ \" A) @
. @; X5 Q* s, o
pp->SumError += Error; // 积分2 H; ?2 Y4 X1 t( x* T
dError = pp->LastError - pp-> PrevError; // 当前微分" u6 @/ g! k. L3 g* Z, q) e5 |* O
pp-> PrevError = pp->LastError; + T6 d7 J7 V- `/ M
pp->LastError = Error; ! V9 k3 p/ d) D& z1 B7 N
return (pp-> Proportion * Error // 比例项 m1 Q$ [1 o6 D/ W' B3 v
+ pp->Integral * pp->SumError // 积分项
( O5 X* A3 G5 c- k: r+ L# H+ pp->Derivative * dError // 微分项
9 c1 {+ [# m% c6 Y0 \' J! ?);
3 a6 G2 z, m( _9 {} 8 W3 ?9 k- v7 |# Y
/*======================= 初始化的 PID 结构 Initialize PID % r$ b, e* `3 `. r% t# H6 c
Structure===========================*/ : @, {5 O( p1 t$ I( B
void PIDInit (PID *pp)
! v. V) B' N( j6 w+ ?{ - ], R q, g8 V- b
memset ( pp,0,sizeof(PID));
3 W8 e' v* z5 z: Z} " Y8 v& H" E }' M' A5 m* L
/*======================= 主程序 Main
' j" g+ a0 h0 J. yProgram=======================================*/
- y* K6 g$ S4 i: F4 l- l# Wdouble sensor (void) // 虚拟传感器功能 Dummy Sensor Function{ return 100.0;}
1 c5 Z/ R6 x9 p1 [6 @7 zvoid actuator(double rDelta) // 虚拟驱动器功能 Dummy Actuator Function{} ; k) ~3 N" A7 F% V/ S! C" M. P
void main(void) - x9 S/ k, ~( \' |
{ $ ?. k9 |) }5 v- y( x$ a
PID sPID; // PID 控制结构 PID Control Structure
% q- w* _" u! t# d+ S9 A4 }double rOut; // PID 响应(输出) PID Response (Output)
/ o X% N% ^0 z' r4 e8 edouble rIn; // PID 反馈(输入) PID Feedback (Input) + C2 g; `# H9 a
PIDInit ( &sPID ); // 初始化结构 Initialize Structure % Y3 E7 x4 z' g: W2 C0 @7 D
sPID.Proportion = 0.5; // 设置 PID 系数 Set PID Coefficients + J( `- h/ s* {( [- U
sPID.Integral = 0.5;
3 L9 s3 I5 G: h( bsPID.Derivative = 0.0;
' h1 m O( b! `! b4 U1 w# hsPID.SetPoint = 100.0; // 设置 PID 设定 Set PID Setpoint ' Y0 F; o) V# \, I: s
for (;;) , I1 F" X/ x& o0 I+ E
{ // 模拟最多的 PID 处理 Mock Up of PID Processing 3 O' `- N8 T+ G. f4 E& G2 V2 e
rIn = sensor (); // 读取输入 Read Input; @2 c' q# q1 B, d5 D) ?
- a: C7 W3 x" T+ i, f! ?+ Y) }
2 _6 L, X: R: x( W, p$ g1 Q. VrOut = PIDCalc ( &sPID,rIn ); // 执行的 PID 迭代 Perform PID Interation 7 q" S; l3 G0 v! z
actuator ( rOut ); // 所需的更改的影响 Effect Needed Changes4 X3 [. l9 O8 ~8 ^- Z; s1 M. }
7 h6 F* G5 Z5 v" z* h) f
9 r% B- }2 H4 B5 Q7 E+ p/ i0 c1 w# v3 O% O3 H3 H& K) J1 F
. F8 {/ h4 j. H, R
/ I; { h6 s' Y, V4 U7 r
" |# W/ O# }0 d( d! f0 M |
|