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

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

[复制链接]
攻城狮Melo 发布时间:2023-3-18 11:59
一.PID控制算法
3 q3 [, L  H9 o4 y( U( X! s1.什么是PID

1 g' ~6 Q8 d0 a" u) H: e+ MPID:Proportion-Integral-Differential% G3 S8 _* q' |' e' ^' j

, E9 F) e9 @! F在过程控制中,我们经常使用的一种算法就是PID算法了,所谓PID控制算法就是对偏差进行比例、积分、微分控制,来使偏差趋于某一固定的值,PID核心由三个单元组成:比例单元(P)、积分单元(I)、微分单元(D),PID实际上就是误差控制。
% I8 o6 N5 i4 Y) p& g% l/ U# F

; g& g, T8 j( f. J3 @: u2 oPID控制系统(模拟)的框图如下:
$ i. K7 h6 H( ^  Q2 z, g
8 r7 l3 H# J) S' B4 t6 ?( H
20200428231808887.png
/ K2 ~/ e2 d+ Y& }5 t  W% C9 v% I2 n" V) j* P: A" |  ?
; i# X* Z% p2 l2 b) W' T* L1 \
2.PID系数的理解

8 u1 C6 x0 `# q, A9 e5 f- C/ V理解PID的三个系数,可以结合PID调节时候的响应曲线,要使实际中的响应曲线趋近于理想状态下的响应曲线,无非就是三点灵魂:快速(P)、准确(I)、稳定(D),要想控制的变量保持在完美的状态,这三个灵魂就必须调整好。
' u. ^* ?' O- f+ I! J1 O5 s2 V9 w: H9 H+ R' c# P& {
以下分析中的:P、I、D都指的是PID的三个系数+ F( t8 j3 X7 e% `

  B$ y  p/ c; m. A
下面从三个系数对整体控制的影响做出分析
( j3 Y3 r$ Z' h. w! J- O; v" Z5 e5 w
Ⅰ.比例(P)部分, U6 I( A% N2 C4 c( E" T' I
输入值一旦与目标值产生偏差e,就需要缩小偏差,P就是用来缩小偏差的,使控制量向减少偏差的方向改变,而且P越大,偏差缩小的速度就越快,所以P的作用就是使控制量更快地接近目标值。/ u7 ~) E7 G" G! t; a# i. v
9 U, i! I2 X( L7 F# H( a
但是!十肇九快!!!P过大的时候,就容易刹不住,很容易超出目标值,当超出目标值时,又会反向朝目标值飞奔,然后又太快了,再次偏离目标值,然后又朝目标值…这样反反复复的在目标值附近震荡,这就是P太大的弊端:不够稳定。
+ @/ k* |2 ^* g2 T% n0 a. n
4 }$ ~) b7 p8 H. y
所以,P大了虽然可以快速响应,但也容易产生震荡,破坏系统的稳定性,可以适当增大D来提高稳定性。( r8 b; d0 \5 F- X% c  X3 k& I
1 N- E8 [- S% N; c# |( c7 ]
1 J* x5 d4 q4 ]3 G9 L7 s
Ⅱ.积分(I)部分0 ~; l6 f0 s* q- ^! E
积分的表达式如下:
$ K' @) {1 f8 w" U3 N0 m* v% q/ R
5 c: T* k+ x! }+ X
20200428231837441.png
: y) d: V- F+ _- G8 T) S! F9 k' a7 o7 j
从其表达式中可以看出,只要存在偏差,积分结果就会不断增加,也就是控制作用会不断增加;当偏差为0时,积分结果是一个常数,此时控制作用才可能是一个稳定的值。+ ^+ \7 v2 n+ l( G

2 I  p- O) u2 P
所以直观的来看,积分可以消除系统的静态偏差,因为一旦有误差,积分就会增加,系统就会做出反应,直到偏差为0,也就是积分保证了控制的准确性。! D2 R0 Z, U4 @- P
. W. H4 ^! H6 B- G, U. {7 o
积分的作用虽然会消除静态偏差,但是也会拉低系统的响应速度,就是说I对P有抑制作用。: q5 E4 D' b& U+ a- X
! B/ {, D' ^1 {7 i8 c: d9 R
5 X" x( m3 a% |  f! U
Ⅲ.微分(D)部分( p) l+ G1 w1 _# @3 _9 p6 A
上面说了,P过大会引起震荡,降低系统稳定性,可以通过提高D来减小震荡。- a" a: L6 ]& E* f. A
3 I  M% S5 W9 }% n6 @
微分的作用就是根据偏差的变化趋势预先给出纠正!怎么个预先法呢?因为微分可以看作是求导,上过高中同鞋都知道:求导可以反映函数的变化趋势。所以,通过微分,可以对偏差的变化进行预判地抑制,防止 矫枉过。! S4 I. H9 u8 S  l8 S4 n
: ^) a$ S/ O3 J
微分的引入,有助于减小震荡,使系统趋于稳定,D越大,抑制P的效果就越强。
$ r9 E4 r9 |0 c- R6 d- t  |9 ?6 v
7 J; y% l# q7 W" M
" S8 y  R2 t8 ?- d7 ]8 t
3.PID的数字化处理
6 f0 T4 I* Y/ q- }由于计算机控制是一种采样控制,只能根据采样时刻的偏差值计算控制量,所以我们是通过软件实现控制算法的,要对PID进行离散化处理(也就是数字化处理),就是根据离散采样点的偏差值进行控制,在离散化处理后,相比于模拟控制由如下改变:
* P' l8 t( w5 {) i  ?  ^# X. e由差分代替微分, J% D% x" B) _! `
由累加代替积分5 O% y( p* B; G
数字化处理后的PID系统如下:. ~" a0 |* m7 v0 i9 o4 I6 t' \
* C8 ?3 ~/ Z2 p+ s. H) l
20200428231857511.png ! \# K( K: y! M+ M& ^
/ T( }* i1 u% Z  h
采样的周期越小,就越接近模拟控制,控制的效果也就越好。; v, D& a% Q) `$ Y5 b7 W- T3 C

3 d) [/ U+ ?& ^8 `1 |9 w

/ l9 p  s: P! b9 b二.位置闭环控制' L5 X7 P/ D2 Z$ a: w+ Y, B
位置闭环控制,也叫位置式PID控制,就是传统的PID控制,控制的偏差逐渐接近0,从而使控制量趋于目标值。
: o4 j' P- ^: _# @0 c
" l, ?! X! w' M
对电机使用位置闭环控制的时候,就是控制电机的转动位置,通过编码器的脉冲累加测量电机的位置信息,与目标位置进行比较,得到偏差值,通过比例、积分、微分的PID算法进行控制,使偏差趋于0。
/ a' {: G. h0 ~) ^9 r  f
* _1 J* e/ m( g- g9 S电机控制中,输出量就是电机控制模块输出的占空比,作用于电机转速,此时离散PID的公式如下:0 Q+ C. {# N7 _

9 [4 o( [, P8 L* p3 E7 K2 D) ?% N
20200428231914180.png ; |1 x* E' h& N! K; ?

% q' c- o2 r  g其控制框图如下:
8 i2 u9 v3 n! D$ X2 C) R' o5 V: Q; Y" e% E/ e9 h' V+ L
2020042823193183.png
; O' H, n" ^$ u' A; g( n
4 v/ b2 l) T5 q控制实现代码如下:4 U8 v% g, s) W. a* B+ d1 Z1 B
  1. /* 返回输出/ a, d7 t( O( i
  2. *  Encoder为输入(编码器测量的信号,也就是电机转速)# l1 L1 n0 ?2 F- o3 _) \  S
  3. *  Target为目标值. W8 c' d" ]0 h" f$ f; Q5 ^
  4. */3 m1 \' {! i+ s/ a* ?" A  v
  5. //KP、KI、KD为PID的系数8 I8 h0 x0 }8 {. f
  6. int Postition_PID( int Encoder, int Target )$ a+ x3 M2 ~/ C3 \/ [; K' N' C
  7. {        //依次的变量代表:偏差、输出、偏差积分、偏差微分/ w. K9 P% P% i$ w- `2 B+ c$ F
  8.         static float Bias,Pwm,Integral_bias,Last_bias;  
    % x0 S# h) f4 f: Q* o! G7 m# [
  9.     Bias = Encoder-Target;//计算偏差
    8 m' P# b3 ?" W  a, i: ?9 \$ C
  10.     Integral_bias += Bias;//计算偏差积分,累加% x: m0 v7 Z6 a% A4 Y5 d* p- p
  11.     Pwm = KP*Bias+KI*Integral_bias+KD*(Bias-Last_bias);//计算输出,根据PID  W6 z/ v4 K$ S4 M; G: }
  12.     Last_bias = Bias;//保存为上一次偏差; y6 t0 t8 W. J2 I4 h. F# L3 d
  13.     return Pwm;//返回输出- a) ]: }6 O$ d
  14. }
    4 @0 G# ~. D2 W* X

  15. 6 d  x) I* U  m* w
复制代码

# ]2 _: P$ q3 j8 q6 R8 A, U- t  ^在定时中断里实现PID控制,定时中断相当于离散的采样点,中断服务函数中可调用控制函数:' T* v9 B0 U; e5 {, z8 m0 A
  1. //中断中如下调用8 {" o( U6 G# w& Q+ S" M2 G# C2 {* ~, G6 v
  2. Moto = Postition_PID( Encoder, Target );( ]7 \3 S" g; i7 D
  3. //最终的控制落回到控制电机转速上
    % l# q/ a' c3 B: n* Z( [& @
  4. Set_Pwm( Moto );. |5 C# H% I/ o
复制代码

0 x8 n9 K& F0 I$ e: t$ O8 J最终的控制要落回到电机的控制上,也就是电机的转速控制——PWM控制。* K% V" r/ o  C# f

( ?( r& t' t* k% g# L" d位置控制的调节经验:先只使用P控制,逐渐增大P,系统震荡后加入微分控制D来抑制震荡,调整KD直至消除震荡,之后再根据系统对响应和静差的要求,调节P、I参数。
/ @- Y6 }; V, `/ n" o0 }/ M
# L4 W7 v  q! m9 e9 e, ~
! k& H( W  `; O' G! j, w# f: n. i
三.速度闭环控制

( K/ W4 _2 v4 @) ]' I1 t- P( W" {速度闭环控制也可叫增量式PID控制,与位置式PID控制不同,位置式PID输出的是控制量新的状态,而增量式PID输出的是控制量的增值,增量式PID的离散公式如下:
% r& ]! C/ B- U0 N8 V. X, A6 p1 a7 u: R# l2 L& w' Y
20200428232012760.png
. [+ [, W4 j1 H, ?4 N8 [) B. s. C9 d' K7 A' i# ^* [

- h7 N3 o. z: \  r位置闭环控制是使电机准确转到某一位置,速度闭环控制是使电机以某一速度转动,在速度闭环控制里,我们只需要使用PI控制即可,所以简化后的公式如下:# w! i. I8 F; `+ E$ ^
* h0 p/ K& s  `6 _$ u$ d/ d$ J
20200428232038432.png 6 ]6 ^( T  r6 P& f6 W& Z
注意:公式直接将控制量的增量加在上一次控制量的状态上了!!!
4 i4 X' L! J3 q. }0 v/ y) u/ R: ~; u: H' ^- M6 J- X1 K

2 W: P9 t- Y- Z5 {3 Y6 I& o控制框图如下:
5 }, o( ~* M0 Z4 {% i/ o8 ]7 T& V0 K. N0 U0 H: n: w- o
20200428232053460.png : D2 l# Q! N. a  G, b* ^
8 X3 g0 U' j. C% T# x- E# U4 v4 L

" r9 I; F. O; e0 w控制代码如下:2 A; i( s* [/ V+ D" z
  1. /* 返回输出
    $ s" `5 B+ A1 f. H1 T% h
  2. *  Encoder为输入(编码器测量的信号,也就是电机转速)
    : V4 m( ]1 f. G6 }0 a' |1 N) w: a
  3. *  Target为目标值7 A# {) |1 W. f  m. ?* [
  4. */- [" I) D/ F% y3 w$ d+ o
  5. //KP、KI为PID的系数
    . {7 R6 k( u  ?; {1 d: V! h& x
  6. int Incremental_PI( int Encoder, int Target )! [# M# h& H- h
  7. {        //依次的变量代表:偏差、输出、偏差微分
    + h0 t  _4 u  J6 l/ D  @7 K# |
  8.         static float Bias,Pwm,Last_bias;  * W! A+ u4 q# @: q8 ^& A
  9.     Bias = Encoder-Target;//计算偏差+ \0 V0 r$ u: E: {
  10.     Pwm += KP*(Bias-Last_bias)+KI*Bias;//增量式PI4 v0 Q5 L$ B4 I, W$ Q. i0 Q
  11.     Last_bias = Bias;//保存为上一次偏差8 a5 l$ v! m3 G3 Q1 A1 ?
  12.     return Pwm;//返回输出) |# E7 z* c6 H' W" y3 s$ \
  13. }
    2 q4 e/ M# w" O/ |! S6 C
复制代码
8 U) u+ V/ }; o  D! [5 z$ x
在定时中断里实现PID控制,定时中断相当于离散的采样点,中断服务函数中可调用控制函数:; c) [8 T6 M! G9 A, h
  1. //中断中如下调用. Z8 o) m" N) _6 K0 S
  2. Moto = Incremental_PI( Encoder, Target );1 u  \$ o1 U$ v/ W- l
  3. //最终的控制落回到控制电机转速上5 ^9 d+ ]/ L& z2 P
  4. Set_Pwm( Moto );. m8 g0 _( J0 Q3 }6 ]) c; G
复制代码
. V  J" O1 ?, @3 I4 P/ [* p
要注意速度闭环控制采用PI控制,公式与PID有所不同,输出的也是控制量的增量,这里将增量直接加在了上一次的状态量上,所以输出的还是控制量的新状态。0 W" {/ a% U( _  c6 [: T
& E$ Q+ |8 G% D2 R% {0 a+ o5 {( U
最后附上我找到的PID参数调整口诀:+ l1 S' L" b, c, U
& E4 ]3 s, Q  m% d8 m5 J. b" J9 h& G
常用口诀:$ y( F- {8 T1 ]0 e) _. \
参数整定找最佳,从小到大顺序查
* O9 n3 O- X$ X/ ]* T" Y先是比例后积分,最后再把微分加
* F( t, C3 E$ @6 ?0 `, G  k0 v7 @曲线振荡很频繁,比例度盘要放大! z' B# V# [* C! E# ]" {
曲线漂浮绕大湾,比例度盘往小扳
9 @% y: i' |4 B曲线偏离回复慢,积分时间往下降" `) I4 |( P8 `0 ]
曲线波动周期长,积分时间再加长# b, }$ T: e0 X- T$ H# \& b
曲线振荡频率快,先把微分降下来' e0 }$ m9 C8 q9 s, n7 }+ A# f
动差大来波动慢。微分时间应加长
1 a2 o' n. o0 |0 e8 a6 z理想曲线两个波,前高后低4比13 C% n! g# {& N
一看二调多分析,调节质量不会低! S* Z- l' N0 b
————————————————0 q  J' Z0 v+ J; D- a+ \5 u
版权声明:Aspirant-GQ8 k0 W* ?& v% t) d
如有侵权请联系删除) V' K% A2 S/ j+ ^. ]$ K
& g  c% X, ]9 `; B, s

) i& g* c8 v% J0 T4 t. ?6 @/ n' s
收藏 评论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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版