|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
位置式 PID 控制算法 3 y! v- g# _$ _! [- W5 ?6 _
! t6 t' a8 [/ E. b$ m* L在使用单片机作为控制 cpu 时,请稍作简化,具体的 PID 参数必须由具体对象通过实验确定。由于单片机的处理速度和 ram 资源的限制,一般不采用浮点数运算,而将所有参数全部用整数,运算到最后再除以一个 2 的 N 次方数据(相当于移位) ,作类似定点数运算,可大大提高运算速度,根据控制精度的不同要求,当精度要求很高时,注意保留移位引起的 “余数 ”,做好余数补偿。这个程序只是一般常用 pid 算法的基本架构,没有包含输入输出处理部分。
% ?! N P4 I& |& w( f; C0 ~
t) K$ E* o2 U) f z6 T, ?( A2 @#include <string.h>
7 M3 d% u) H4 i! u' @+ K% ^#include <stdio.h>
1 t, A# h! g+ n
' I. x9 H# w/ j/ OPID Function % {/ {: B" H3 S! P: _
The PID function is used in mainly
# e4 M* i$ V4 Vcontrol applications. PID Calc peRForms one iteration of the PID $ L8 R. G8 a9 v9 W# d
algorithm. ( g) m( ?0 @5 v# r
While the PID function works, main is just a dummy program showing $ o- u4 r8 i- a4 r7 ~# |: w
a typical usage. 6 s4 J. \7 ^' j" g; r- z
* p3 Z- K3 _( p! I: t& qPID 功能- k7 D2 x5 |' x1 y9 c% \2 S
在 PID 功能主要用于控制应用。 PID 计算器执行一个 PID 的迭代算法。虽然 PID 功能的工程,- R1 b: K# _4 y2 ^4 b
主要只是一个虚拟程序显示一个典型的使用。
3 L0 d8 I6 Q: Otypedef struct PID { : }+ c* e5 \ c; l& k( q- D
double SetPoint; // 设定目标 Desired Value
# Y7 h$ N8 `+ g+ w! Gdouble Proportion; // 比例常数 Proportional Const
+ t/ H6 A# s: f: o( g6 @double Integral; // 积分常数 Integral Const
, F$ F- U9 B. Q+ Edouble Derivative; // 微分常数 Derivative Const J( u+ d, t% l. n% @, P3 R2 R
double LastError; // Error[-1] + S$ T. \: p! m8 I- o! p( k
double PrevError; // Error[-2] 6 x, f V( z6 m3 |) K6 F
double SumError; // Sums of Errors
3 l. u% v0 g" S' g; i* L* V} PID; + t8 i4 Z) I) V/ B0 X( S4 O
double PIDCalc( PID *pp, double NextPoint ) + y8 {: T1 I7 p( s* W$ n* v* B
{
8 w, j! D9 \% E# Gdouble dError, Error; - c3 z+ C1 D5 Z) d. J& E# N d% ^" y
Error = pp->SetPoint - NextPoint; // 偏差2 b' r: X* y" D* Y K% ~
: l: M; ?) l4 m
9 S: u" i2 s0 v- D/ A2 c: ~
pp->SumError += Error; // 积分
9 A4 a' n/ ?- i8 DdError = pp->LastError - pp-> PrevError; // 当前微分
1 A( T- v, ^8 N* e6 `pp-> PrevError = pp->LastError;
9 @, \( S* W0 Y- A; ]pp->LastError = Error;
3 o3 b! f0 R. O. V0 I( vreturn (pp-> Proportion * Error // 比例项- S2 y9 e& X: |6 W, w6 f
+ pp->Integral * pp->SumError // 积分项' m1 t* w4 V/ K2 f7 B( _
+ pp->Derivative * dError // 微分项8 z$ o, o# _( a
); S {2 ~1 G8 V& V% ]7 ~
}
3 m5 c' @3 Y7 g) C$ j; Z/*======================= 初始化的 PID 结构 Initialize PID ( a( P" H9 ? [5 |: f& |
Structure===========================*/
! F# M I' x4 o( [9 x& Yvoid PIDInit (PID *pp) 3 S: H( v' |. U( S
{
8 a4 N4 z' B: {3 K3 ~memset ( pp,0,sizeof(PID)); 7 c. T. J* @6 l6 X+ D% s' G* q
}
' ^2 b. O$ J- l/*======================= 主程序 Main
2 A8 L2 |* ?5 X9 EProgram=======================================*/ & i6 W: u2 L' ]& Y( p
double sensor (void) // 虚拟传感器功能 Dummy Sensor Function{ return 100.0;} ( z5 V$ _/ F) M( ~$ B0 X
void actuator(double rDelta) // 虚拟驱动器功能 Dummy Actuator Function{} ( ^9 N( m, M) V2 m- ]8 s7 K
void main(void)
* J5 v) X- o* U3 G: F{ 9 G0 D: I; w. [
PID sPID; // PID 控制结构 PID Control Structure e9 b3 d0 o1 z- K) q" x/ P
double rOut; // PID 响应(输出) PID Response (Output) 1 ?3 O! _: M9 c1 G* E, e5 ?5 e
double rIn; // PID 反馈(输入) PID Feedback (Input)
+ `% M, e; F# P& J- nPIDInit ( &sPID ); // 初始化结构 Initialize Structure
! m, T. n. {2 v( SsPID.Proportion = 0.5; // 设置 PID 系数 Set PID Coefficients 2 [ I# _& H# b' y& y1 z7 ?9 B
sPID.Integral = 0.5;
8 T3 Q# w5 i5 P8 P: _# Z% f( o0 msPID.Derivative = 0.0; / j" H1 S& V1 `- w0 x/ F
sPID.SetPoint = 100.0; // 设置 PID 设定 Set PID Setpoint
; B K( i1 r# z% Vfor (;;)
8 m, d* j( ~. k' W5 R{ // 模拟最多的 PID 处理 Mock Up of PID Processing + \+ N9 ]# b; x$ T
rIn = sensor (); // 读取输入 Read Input1 h4 K7 |/ D9 p) N$ \
# o# C8 M$ N& i9 P" ~& G* }; F% p$ f. u# V9 @/ v! P
rOut = PIDCalc ( &sPID,rIn ); // 执行的 PID 迭代 Perform PID Interation ; \- w% Q& D3 v2 \
actuator ( rOut ); // 所需的更改的影响 Effect Needed Changes# r9 g u y9 l3 r# t
- p" t5 z4 V* f$ H/ ^2 S6 y Y; ~& I3 _' D
4 M t- N" U+ T0 o6 Y- X; W3 {4 `1 M) z7 ^
3 t% J* }2 L: h; P4 O
/ A; w! l0 @/ E+ c, c2 k9 |% g$ X |
|