你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32直流电机中PID的控制

[复制链接]
攻城狮Melo 发布时间:2023-3-18 11:59
一.PID控制算法/ z- g6 |1 V9 R0 E5 K3 p" g
1.什么是PID

8 ~4 v4 f* _. L! D) aPID:Proportion-Integral-Differential
7 ^* f* |" J% R# F, S2 U/ G- Y1 v, s
在过程控制中,我们经常使用的一种算法就是PID算法了,所谓PID控制算法就是对偏差进行比例、积分、微分控制,来使偏差趋于某一固定的值,PID核心由三个单元组成:比例单元(P)、积分单元(I)、微分单元(D),PID实际上就是误差控制。
9 G2 J/ N0 c1 x) A
/ R: }& u+ ]4 ]( o" d7 ^
PID控制系统(模拟)的框图如下:' Y  w% \1 o9 q" H
) I6 j' u3 {, W7 @
20200428231808887.png ( O) R* u5 O1 P) G3 U& D

$ z' D" [6 {1 E/ Z: j, B; i

" q" V; ?# z8 y4 _/ x+ S4 G" |2.PID系数的理解

2 f9 E0 N0 Y) j- a理解PID的三个系数,可以结合PID调节时候的响应曲线,要使实际中的响应曲线趋近于理想状态下的响应曲线,无非就是三点灵魂:快速(P)、准确(I)、稳定(D),要想控制的变量保持在完美的状态,这三个灵魂就必须调整好。
- ~# Z5 v* x# b! a# @* Q- ^3 G, e# J4 ^" q$ k( i
以下分析中的:P、I、D都指的是PID的三个系数9 i' M- d- i7 l3 V* ~& ^+ y
! e8 p9 _8 q% e) x2 [
下面从三个系数对整体控制的影响做出分析2 F  }/ n2 U% c* m( G- K& T
; {, s; I& e( |$ q; S0 p
Ⅰ.比例(P)部分+ k1 V2 p" o  k/ n
输入值一旦与目标值产生偏差e,就需要缩小偏差,P就是用来缩小偏差的,使控制量向减少偏差的方向改变,而且P越大,偏差缩小的速度就越快,所以P的作用就是使控制量更快地接近目标值。
6 j! @+ s8 H+ z) f4 l, {, g% @, r" t2 R* Y/ K+ C( o) X
但是!十肇九快!!!P过大的时候,就容易刹不住,很容易超出目标值,当超出目标值时,又会反向朝目标值飞奔,然后又太快了,再次偏离目标值,然后又朝目标值…这样反反复复的在目标值附近震荡,这就是P太大的弊端:不够稳定。% W& x/ }1 M$ r% n2 m  @! p9 `% S
1 W2 E" x4 X, J$ G, y
所以,P大了虽然可以快速响应,但也容易产生震荡,破坏系统的稳定性,可以适当增大D来提高稳定性。! Z3 j" O& q2 b; G8 m6 v' q9 r

. ]: K/ `/ v; B& S% H

2 T2 d. n: I+ v0 f5 K( c0 d/ KⅡ.积分(I)部分; v" w+ ~1 q' H. [! i
积分的表达式如下:
$ n9 e5 |9 |2 p* @7 s
  n+ L3 T) A( C1 W- R) Q4 ?; M& Y
20200428231837441.png 4 u, f  J. I+ ^  X
8 P% g2 @6 m' g, \3 S
从其表达式中可以看出,只要存在偏差,积分结果就会不断增加,也就是控制作用会不断增加;当偏差为0时,积分结果是一个常数,此时控制作用才可能是一个稳定的值。
5 Q* b3 w% s5 T. d& M9 b' P
! x6 h; ?2 r* z, r' D) T
所以直观的来看,积分可以消除系统的静态偏差,因为一旦有误差,积分就会增加,系统就会做出反应,直到偏差为0,也就是积分保证了控制的准确性。
0 g1 H* b' c$ E) v* g5 c, f, E5 e
; \( j6 R4 @# N, P4 e8 W( y1 L4 A
积分的作用虽然会消除静态偏差,但是也会拉低系统的响应速度,就是说I对P有抑制作用。
4 W) a4 c2 Q0 x" W( }' e
6 C# q4 q, z1 ~- H" X

2 S* `1 O) f8 u. d  n% u! P$ CⅢ.微分(D)部分
8 e1 H4 G! L, s2 E( x* c" z上面说了,P过大会引起震荡,降低系统稳定性,可以通过提高D来减小震荡。
5 |$ R. B, f1 n, m8 S6 r( H+ X( r. L) {' D3 C; E) c8 Z
微分的作用就是根据偏差的变化趋势预先给出纠正!怎么个预先法呢?因为微分可以看作是求导,上过高中同鞋都知道:求导可以反映函数的变化趋势。所以,通过微分,可以对偏差的变化进行预判地抑制,防止 矫枉过。- K1 ]5 s' n1 r6 L; r/ ~% f
- _" _7 Q& n/ b1 h& J1 \7 J
微分的引入,有助于减小震荡,使系统趋于稳定,D越大,抑制P的效果就越强。9 O2 B& m2 `- ?" F2 |
& r: Y3 G) g3 @& h
' B7 M1 C0 N! A( Q
3.PID的数字化处理$ q. K9 [' z$ [( i8 f
由于计算机控制是一种采样控制,只能根据采样时刻的偏差值计算控制量,所以我们是通过软件实现控制算法的,要对PID进行离散化处理(也就是数字化处理),就是根据离散采样点的偏差值进行控制,在离散化处理后,相比于模拟控制由如下改变:
- K, p% _9 x+ E/ \6 r1 \由差分代替微分8 p/ o1 _- C3 _  @. e
由累加代替积分& }( t" K' S8 t, y, V+ L  ], s
数字化处理后的PID系统如下:& [, Y3 \* U9 q/ c9 D
/ \# E) j$ ~9 ^0 d! b
20200428231857511.png & W1 j9 I* D+ z
1 ?  c' a. V, P- U. K0 X
采样的周期越小,就越接近模拟控制,控制的效果也就越好。* m4 l4 V- ?. L* l: W
* H& o& G0 F2 {% W
+ k; X& |- l. v! M+ B, H
二.位置闭环控制/ U4 M4 Y+ @" k2 Z) v* _' V( |
位置闭环控制,也叫位置式PID控制,就是传统的PID控制,控制的偏差逐渐接近0,从而使控制量趋于目标值。
& }6 F! h. H& `* k! i9 j

+ L6 K1 w5 }0 F# J对电机使用位置闭环控制的时候,就是控制电机的转动位置,通过编码器的脉冲累加测量电机的位置信息,与目标位置进行比较,得到偏差值,通过比例、积分、微分的PID算法进行控制,使偏差趋于0。) W2 @) D* t0 Y# V4 {' z1 i0 f4 u

4 x% o  O6 ^, O% ^1 z, X& }& K6 o电机控制中,输出量就是电机控制模块输出的占空比,作用于电机转速,此时离散PID的公式如下:1 I5 I: d# Z! z( R" y8 E, b

1 W/ E! l9 C3 G; S9 U
20200428231914180.png
1 W$ W  s, L# J( b2 W8 [" t, z" M9 O8 [2 k
其控制框图如下:+ O* q8 s( n/ Y* g+ n; ~

1 q6 {/ y! E) u* w
2020042823193183.png 8 P$ B& H/ n# c& v) a/ \. u- h; d6 ~
# Q2 P/ ~- `: s
控制实现代码如下:; M( ]2 @% K8 L# b- B  K
  1. /* 返回输出
    3 u. E+ V' A  p1 w
  2. *  Encoder为输入(编码器测量的信号,也就是电机转速)  X! Z; `2 j; M7 b' I
  3. *  Target为目标值
    $ K8 t9 _- S3 E. `. S: p* J
  4. */# ?- O' r  b# O0 G/ q8 i
  5. //KP、KI、KD为PID的系数
    : r4 u. `: l' Y' z
  6. int Postition_PID( int Encoder, int Target )
      R% v5 k( ^0 J- \+ @
  7. {        //依次的变量代表:偏差、输出、偏差积分、偏差微分  r: Q6 E2 {. O7 l: J  }
  8.         static float Bias,Pwm,Integral_bias,Last_bias;  
    ' m  p9 S' g" g" u- Z7 C' L5 @
  9.     Bias = Encoder-Target;//计算偏差# F" z$ L8 [- H( G$ C' _( h
  10.     Integral_bias += Bias;//计算偏差积分,累加$ s5 j& d, |2 Q! f9 Q. i' Y3 Z5 ^! S
  11.     Pwm = KP*Bias+KI*Integral_bias+KD*(Bias-Last_bias);//计算输出,根据PID
    1 I9 y. _: H1 P( D7 s  T
  12.     Last_bias = Bias;//保存为上一次偏差
    / C& y3 u1 }- {, f2 ?; ?1 Q
  13.     return Pwm;//返回输出
    7 |; H) ~; u, C) m
  14. }
    3 g$ U* U0 ]. s; j

  15. " ]- t$ A, |( J$ d9 F; \
复制代码

/ M* K4 o" a" _' z& ?& w" y在定时中断里实现PID控制,定时中断相当于离散的采样点,中断服务函数中可调用控制函数:  T/ j9 ~5 h  E6 L" b6 \9 b$ Z
  1. //中断中如下调用
    ' D) T3 J; |9 \0 `. S& Y- `/ w
  2. Moto = Postition_PID( Encoder, Target );  t4 q( ^1 O' k* ]
  3. //最终的控制落回到控制电机转速上6 [3 s. O3 d' S) s% K0 z
  4. Set_Pwm( Moto );
    & M* w: ~3 \; H/ T+ v& s
复制代码
5 w- g3 K  f0 O* S, |( s6 H
最终的控制要落回到电机的控制上,也就是电机的转速控制——PWM控制。
5 b& ?& _* G& M$ M$ u+ t+ p# g
* z) I# s4 u) I1 c9 c位置控制的调节经验:先只使用P控制,逐渐增大P,系统震荡后加入微分控制D来抑制震荡,调整KD直至消除震荡,之后再根据系统对响应和静差的要求,调节P、I参数。
9 I# s. k! [' i1 R# B# M2 O* r, U+ l# ^% @7 e2 w; A' I3 j/ G

$ F+ u+ a2 f# l* T三.速度闭环控制

) [9 \. y. n( G速度闭环控制也可叫增量式PID控制,与位置式PID控制不同,位置式PID输出的是控制量新的状态,而增量式PID输出的是控制量的增值,增量式PID的离散公式如下:+ E* i+ j# l/ ~

7 m, L; E% A' B5 b; z
20200428232012760.png 3 i* Z* _$ K" {4 Z/ o' d/ `

" O( h1 T$ _- V3 U( u/ R/ O
1 o7 s  i7 w# h2 E6 C
位置闭环控制是使电机准确转到某一位置,速度闭环控制是使电机以某一速度转动,在速度闭环控制里,我们只需要使用PI控制即可,所以简化后的公式如下:
/ n! {8 P3 h& y1 t4 `9 u0 v' g$ R- k1 K4 u1 j( B% m
20200428232038432.png
6 L( O( T( U1 S+ ~/ w7 t注意:公式直接将控制量的增量加在上一次控制量的状态上了!!!+ }1 \- n  w4 M
7 D( n: v# j6 }! I
3 e* t7 K% c. ]& T* \# O4 b; g6 s
控制框图如下:
6 ]0 K3 U8 a, A4 n' }
9 H/ [6 r7 ~. M4 K; r
20200428232053460.png . t$ k" T; N! f8 s+ ~# M6 v

2 V+ X* i" _2 B5 c9 U6 F  K* H
  t$ B4 F  B+ B: v
控制代码如下:
- B: ?/ c) Q3 `: s# D: N! x
  1. /* 返回输出
    ) J6 X: m/ G- v3 j" N
  2. *  Encoder为输入(编码器测量的信号,也就是电机转速)! D' M$ W% e( E
  3. *  Target为目标值1 u3 t0 ~$ y- a" U3 ~1 V- y+ P
  4. */( [! t3 r/ \9 c2 A5 V1 z
  5. //KP、KI为PID的系数
    5 N" z1 D4 k2 E7 B
  6. int Incremental_PI( int Encoder, int Target )
    $ C1 u4 L$ X+ e1 K+ O
  7. {        //依次的变量代表:偏差、输出、偏差微分3 K9 t+ b/ V( I4 Z( o0 ?, r7 S
  8.         static float Bias,Pwm,Last_bias;  , F7 U3 [# `8 Q+ u; J+ E4 V
  9.     Bias = Encoder-Target;//计算偏差; t9 z7 e$ e1 j9 _( P* l
  10.     Pwm += KP*(Bias-Last_bias)+KI*Bias;//增量式PI
    3 V0 V; j9 x6 Z7 H- A, H
  11.     Last_bias = Bias;//保存为上一次偏差% w3 t% t- p  `7 G" i9 I& O, H" g
  12.     return Pwm;//返回输出
    ' V. R  K: l; t' ~" s5 j% ]0 w
  13. }
    ; F; P" ^( _. O( O7 @8 ^6 h) \. U
复制代码

7 G( l- ~4 Z/ h5 s. e在定时中断里实现PID控制,定时中断相当于离散的采样点,中断服务函数中可调用控制函数:$ O1 j6 L2 V5 W5 @; V
  1. //中断中如下调用
    & U) }8 D* N0 p6 r1 `
  2. Moto = Incremental_PI( Encoder, Target );; f- V$ l2 U: |& e
  3. //最终的控制落回到控制电机转速上
    0 ~# }1 n) v7 a6 T3 b
  4. Set_Pwm( Moto );
    0 k+ l& J% ?/ a  h  P
复制代码

: Y! q% a0 M" S要注意速度闭环控制采用PI控制,公式与PID有所不同,输出的也是控制量的增量,这里将增量直接加在了上一次的状态量上,所以输出的还是控制量的新状态。. G: K6 D% p! j1 @, K& I
0 J8 p, Q2 r# ]. d
最后附上我找到的PID参数调整口诀:
7 E9 {% d- B0 Y$ l- g( t( G) [0 x* A7 e5 @) C2 u+ G5 L
常用口诀:
/ n) r, ]# N% x* z4 k8 J7 i. F参数整定找最佳,从小到大顺序查! a5 v" I- H0 o* G/ h/ \
先是比例后积分,最后再把微分加
- I3 N* g( d6 r3 l* e3 C曲线振荡很频繁,比例度盘要放大! y+ L" ~" d' d) Q0 j* _! O- ^
曲线漂浮绕大湾,比例度盘往小扳2 B) P3 |. T& h' P$ q
曲线偏离回复慢,积分时间往下降; d$ s, j9 e4 l4 g. `
曲线波动周期长,积分时间再加长
4 G; \) _6 V4 q5 t曲线振荡频率快,先把微分降下来; J& v" ?$ l6 Q' M8 `  O
动差大来波动慢。微分时间应加长( [, n( B- l7 d
理想曲线两个波,前高后低4比1
% D7 y! G* Q. \2 \8 A/ ?( @一看二调多分析,调节质量不会低7 H1 O+ T4 t" ^2 x3 X
————————————————$ ?# J' E8 P# n3 h" w1 I
版权声明:Aspirant-GQ, x- b% G. {8 }0 F* k
如有侵权请联系删除
& \5 k* O+ @9 [( Z1 X, m' }1 Y( S3 ], F3 F9 w

' u. G/ p3 B0 m  C+ o6 _5 m" K% q
收藏 评论1 发布时间:2023-3-18 11:59

举报

1个回答
Panto 回答时间:2023-4-13 05:44:42

"PID control is implemented in the timing interrupt"

How often ?

Is it related with motor speed ?

Thanks

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版