找回密码
 注册
关于网站域名变更的通知
查看: 386|回复: 1
打印 上一主题 下一主题

位置式 PID 控制算法

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-1-8 13:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

该用户从未签到

2#
发表于 2020-1-8 19:19 | 只看该作者
位置式 PID 控制算法
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-10-31 04:26 , Processed in 0.125000 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表