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

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

[复制链接]
攻城狮Melo 发布时间:2023-3-18 11:59
一.PID控制算法# W$ D3 A2 B4 x8 N5 ?
1.什么是PID
$ X; x  C, R! ]( E( T
PID:Proportion-Integral-Differential+ B% C( ]: k! D

/ E9 Z) u+ l# p0 D在过程控制中,我们经常使用的一种算法就是PID算法了,所谓PID控制算法就是对偏差进行比例、积分、微分控制,来使偏差趋于某一固定的值,PID核心由三个单元组成:比例单元(P)、积分单元(I)、微分单元(D),PID实际上就是误差控制。9 X6 \3 m4 f4 R' H
. Y- R7 A3 j* \; W* J$ l6 t7 h4 f* d
PID控制系统(模拟)的框图如下:) z8 D' M) h; r( k8 c+ ]
5 r' g7 D! b$ U
20200428231808887.png 7 \0 S/ w) g. }6 i# U" f7 W

  q  ?& C1 s5 M# @, q
6 g& ?7 e6 i* w1 R
2.PID系数的理解
6 m' n' b" S3 y* D' E. ~/ z4 i& M
理解PID的三个系数,可以结合PID调节时候的响应曲线,要使实际中的响应曲线趋近于理想状态下的响应曲线,无非就是三点灵魂:快速(P)、准确(I)、稳定(D),要想控制的变量保持在完美的状态,这三个灵魂就必须调整好。+ U! |1 |& [% C
* M- G$ v0 l; _2 g
以下分析中的:P、I、D都指的是PID的三个系数
, M5 I/ j) y) U5 ~1 E. D$ e7 c" e( P9 Q: U/ d: _
下面从三个系数对整体控制的影响做出分析9 b& _  l0 K9 L: Z& }/ o% I7 L
4 |: I1 F- }" w6 J
Ⅰ.比例(P)部分
" p& J: @. K$ |3 V/ ?输入值一旦与目标值产生偏差e,就需要缩小偏差,P就是用来缩小偏差的,使控制量向减少偏差的方向改变,而且P越大,偏差缩小的速度就越快,所以P的作用就是使控制量更快地接近目标值。! \* V; V# Q  }
$ t0 [6 |1 s, G9 x. [9 V0 P8 |( c
但是!十肇九快!!!P过大的时候,就容易刹不住,很容易超出目标值,当超出目标值时,又会反向朝目标值飞奔,然后又太快了,再次偏离目标值,然后又朝目标值…这样反反复复的在目标值附近震荡,这就是P太大的弊端:不够稳定。; g! L$ ^# J( X2 J3 [. \, h
. G" Z# r' _8 m. W/ z
所以,P大了虽然可以快速响应,但也容易产生震荡,破坏系统的稳定性,可以适当增大D来提高稳定性。
7 O" p, ]# i, X0 u; o9 D" |+ L2 o" H, [/ H) N6 X8 W9 U5 a

  g) `) B6 Z2 gⅡ.积分(I)部分/ B  u! M$ q' k. }( j/ k
积分的表达式如下:% n. T- V( K$ W5 b5 O7 ]& B" M
# E( o) ?1 h7 W+ f0 D( E8 B, k4 I
20200428231837441.png
6 |5 @/ O7 f0 t. j8 ?+ @& x+ C% T$ r* f9 c: a
从其表达式中可以看出,只要存在偏差,积分结果就会不断增加,也就是控制作用会不断增加;当偏差为0时,积分结果是一个常数,此时控制作用才可能是一个稳定的值。
7 q, a3 v4 `; H: ^; h3 D/ S8 P# P: |' L" e
所以直观的来看,积分可以消除系统的静态偏差,因为一旦有误差,积分就会增加,系统就会做出反应,直到偏差为0,也就是积分保证了控制的准确性。( ]- Z9 }+ ^3 D" l+ \; H

4 {0 C6 l5 `) J* z6 B
积分的作用虽然会消除静态偏差,但是也会拉低系统的响应速度,就是说I对P有抑制作用。9 d/ {" \1 ~) c5 I

1 P* \3 j4 i& b) T3 O+ X8 d& t

* b2 d+ i7 u: e& D. ~5 ^( h8 |9 u* NⅢ.微分(D)部分9 c. L9 {) ^% t6 n% ~/ Z' H0 g
上面说了,P过大会引起震荡,降低系统稳定性,可以通过提高D来减小震荡。) H" f6 u+ f# Y9 p7 A
' U7 i- k) x! [8 d3 ?+ A
微分的作用就是根据偏差的变化趋势预先给出纠正!怎么个预先法呢?因为微分可以看作是求导,上过高中同鞋都知道:求导可以反映函数的变化趋势。所以,通过微分,可以对偏差的变化进行预判地抑制,防止 矫枉过。3 f/ ?7 u7 G4 ?- I8 D# `! B

! T- \+ [1 o7 S$ n- s+ K% |7 `$ c
微分的引入,有助于减小震荡,使系统趋于稳定,D越大,抑制P的效果就越强。
' G8 q" }# I. [+ a2 f2 r
1 o0 B: g! g9 s3 `: Z- y6 t
0 x: l- i) ]4 x* u+ G' H' ~* A9 ^
3.PID的数字化处理7 e5 l, C2 I8 X) ?9 V
由于计算机控制是一种采样控制,只能根据采样时刻的偏差值计算控制量,所以我们是通过软件实现控制算法的,要对PID进行离散化处理(也就是数字化处理),就是根据离散采样点的偏差值进行控制,在离散化处理后,相比于模拟控制由如下改变:
  c- U0 q  y1 m7 M& X' i1 M) [' c由差分代替微分6 Z: O. g# F# q1 x7 T1 z3 C
由累加代替积分/ M' X' r1 G* n2 E6 K
数字化处理后的PID系统如下:$ t0 I: K% l5 n
) q$ r( f" v8 s2 e2 |
20200428231857511.png   V9 g5 B4 Q# W! {
6 @% p2 y" ]  H  A
采样的周期越小,就越接近模拟控制,控制的效果也就越好。
- w. w/ I: h, H& E5 C: _3 P* A6 T2 _9 U8 d! q. n

: Z% _" v7 F+ }# [3 ^二.位置闭环控制" {9 W% ^6 d  t4 V$ s" o
位置闭环控制,也叫位置式PID控制,就是传统的PID控制,控制的偏差逐渐接近0,从而使控制量趋于目标值。' |4 D6 r) }7 J% s+ @, T9 ^7 D6 o
; ^7 I' Y1 C- u( m6 G
对电机使用位置闭环控制的时候,就是控制电机的转动位置,通过编码器的脉冲累加测量电机的位置信息,与目标位置进行比较,得到偏差值,通过比例、积分、微分的PID算法进行控制,使偏差趋于0。
6 M3 @9 H# A* M8 [
2 U9 y; u! o7 `$ J+ R! X) i电机控制中,输出量就是电机控制模块输出的占空比,作用于电机转速,此时离散PID的公式如下:6 y! Z' X6 D3 ]2 G8 S7 h

, j( F$ v9 C# Q$ ^6 X
20200428231914180.png " U6 g/ Q; [" s. F3 j

0 P$ w* e+ E( v) }& m! x4 k* v其控制框图如下:9 w& H: ?0 O$ J+ l! D
1 R( O) u& t" D9 k
2020042823193183.png 9 i6 S. H) C3 K
' V2 ]) _; }/ U% G, ]! s: @
控制实现代码如下:
: x* e) s3 G8 I4 {+ S
  1. /* 返回输出
    ' G6 ?! R4 K- w' L
  2. *  Encoder为输入(编码器测量的信号,也就是电机转速). R+ _5 l( \1 m" U
  3. *  Target为目标值
    6 Q7 U! J$ c! ]7 o9 }0 @
  4. */
    # P: Q! Y2 y6 w) X) y/ ^8 t) |4 z
  5. //KP、KI、KD为PID的系数
    5 M" a3 r7 g. J- w# @& d! O+ g( ~
  6. int Postition_PID( int Encoder, int Target )
    4 c- Z' g& f' B& e5 G  A
  7. {        //依次的变量代表:偏差、输出、偏差积分、偏差微分
    : Z4 X- q! X* Z6 v
  8.         static float Bias,Pwm,Integral_bias,Last_bias;    E- C/ M/ ~. H, V  G8 K4 e8 y
  9.     Bias = Encoder-Target;//计算偏差
    / c) Q  X5 u+ m  }2 H
  10.     Integral_bias += Bias;//计算偏差积分,累加. u2 k: i& G0 K& s4 o  X2 \7 b
  11.     Pwm = KP*Bias+KI*Integral_bias+KD*(Bias-Last_bias);//计算输出,根据PID  X0 c" l$ b! ]1 i; i9 Z8 M
  12.     Last_bias = Bias;//保存为上一次偏差
    " j, I; L! a7 |* a4 G) q* @& Z
  13.     return Pwm;//返回输出# A+ V! k  h9 J. w0 E/ J- o
  14. }& x& h* v: G3 ]" H) G/ i  n; v
  15. ) B! x) {. h) E& O7 X( @% c
复制代码
( J4 U4 V) d4 w
在定时中断里实现PID控制,定时中断相当于离散的采样点,中断服务函数中可调用控制函数:: ?5 T+ L7 z+ P7 t. v
  1. //中断中如下调用
    : ]* j; N' m: z" N7 J! x
  2. Moto = Postition_PID( Encoder, Target );: [7 n8 b! W" o/ v3 Y( a
  3. //最终的控制落回到控制电机转速上* j1 R. j! y& \1 T
  4. Set_Pwm( Moto );
    6 R3 O! j2 U8 ^9 `
复制代码
' V: E$ R# [, m
最终的控制要落回到电机的控制上,也就是电机的转速控制——PWM控制。, U' x8 X1 \" f0 x3 J

9 ^- y* A* F5 R  z8 V2 C位置控制的调节经验:先只使用P控制,逐渐增大P,系统震荡后加入微分控制D来抑制震荡,调整KD直至消除震荡,之后再根据系统对响应和静差的要求,调节P、I参数。
  s7 p9 ?7 e- @# b
3 W- B, `$ }( H. j. ~& {
1 P' {' k" z& i% M" s
三.速度闭环控制
$ Y+ P* h5 Y1 Z, c; y4 m8 X9 B
速度闭环控制也可叫增量式PID控制,与位置式PID控制不同,位置式PID输出的是控制量新的状态,而增量式PID输出的是控制量的增值,增量式PID的离散公式如下:
5 i; U* L: A- u3 V' P8 }, O; j6 [! z5 v* }' v( T- o
20200428232012760.png " p# n5 b' W3 \2 U: y( M/ z

+ V2 W& D: e8 `( l0 M  Q
% [. V  p7 ]0 U3 B( B& M+ w: f
位置闭环控制是使电机准确转到某一位置,速度闭环控制是使电机以某一速度转动,在速度闭环控制里,我们只需要使用PI控制即可,所以简化后的公式如下:6 [0 v8 Z& F# J: m. f* R

& m0 s( A1 U) ?2 o* i
20200428232038432.png
! t; A7 B" Q; E$ B2 U注意:公式直接将控制量的增量加在上一次控制量的状态上了!!!$ [6 G* B9 D' N9 o  _* q- Q
" @5 I) c9 L" _8 \' B# a& ?: o
4 J8 W# {- K& h# o& j; |5 E# H
控制框图如下:4 ~/ W+ b% |" H& o0 D
' O9 E$ K1 _2 K
20200428232053460.png
+ k* N5 D0 V  q; g5 v; U7 n/ u+ W% X" o7 o

$ _! h! G" o" {3 k控制代码如下:
; R% G3 J7 ?3 R
  1. /* 返回输出
    4 ^3 R) r! y% N# ], S* A
  2. *  Encoder为输入(编码器测量的信号,也就是电机转速)9 D% r' T9 y5 f" c: k
  3. *  Target为目标值
    , {& k* V6 ^6 I' c4 H" R. l
  4. */; ]4 m( ^; R: ~6 O" b6 _; B
  5. //KP、KI为PID的系数7 c/ }& f5 P: W  Q) r
  6. int Incremental_PI( int Encoder, int Target )% D$ H1 Z. q  M9 W+ @
  7. {        //依次的变量代表:偏差、输出、偏差微分1 b5 Z' D4 |8 v2 g1 p/ a
  8.         static float Bias,Pwm,Last_bias;  
    , Q: C2 q1 Y* G$ P% T* u/ j
  9.     Bias = Encoder-Target;//计算偏差
    1 F: w2 g1 X5 `$ X
  10.     Pwm += KP*(Bias-Last_bias)+KI*Bias;//增量式PI8 D& T) n+ e0 A. m/ z: Q
  11.     Last_bias = Bias;//保存为上一次偏差
    ) S1 j" ~% F& q! d# v
  12.     return Pwm;//返回输出8 ^. ]3 D- a! H5 t8 i* {
  13. }6 \& ?! k& {3 |3 w, ]7 k) A) o
复制代码

0 G3 D$ c$ P2 Q6 N在定时中断里实现PID控制,定时中断相当于离散的采样点,中断服务函数中可调用控制函数:
, v% ^$ U1 [# U- f/ \
  1. //中断中如下调用  E% G/ ~! @+ t" G6 t5 |
  2. Moto = Incremental_PI( Encoder, Target );' J. Y9 l4 m% @1 T' o
  3. //最终的控制落回到控制电机转速上2 o  ?- q; N  k) |: g
  4. Set_Pwm( Moto );# q6 _3 [+ b2 K9 ]
复制代码
, C0 [9 P# U( }3 K6 v2 {
要注意速度闭环控制采用PI控制,公式与PID有所不同,输出的也是控制量的增量,这里将增量直接加在了上一次的状态量上,所以输出的还是控制量的新状态。' m4 L0 D- ~' |' W" N9 i

' }8 V- V* a5 N. k. }% `, [% X最后附上我找到的PID参数调整口诀:* E1 q. G5 [; F, h

; c* F8 V4 c9 s3 n常用口诀:
8 j* ]. `+ _( ~: j/ s% A- m参数整定找最佳,从小到大顺序查
/ }7 }# X2 ?2 }) q) C+ s先是比例后积分,最后再把微分加
. {& d5 O3 h" ^4 P( [. C曲线振荡很频繁,比例度盘要放大# L) _& j1 F! J) \& h  n
曲线漂浮绕大湾,比例度盘往小扳
2 _! X/ R1 Q- Y4 v! ~曲线偏离回复慢,积分时间往下降
9 J4 {9 U& P" k) V* `( W7 e. I4 y& Y: a曲线波动周期长,积分时间再加长
9 E" M2 `6 U3 D曲线振荡频率快,先把微分降下来
2 ^) x7 z6 H) P" R动差大来波动慢。微分时间应加长
* b; h8 \- e4 M5 U0 g' U理想曲线两个波,前高后低4比16 u$ C9 \  j* M1 D
一看二调多分析,调节质量不会低5 H3 v# ^/ J  v4 M; L" D0 k) p
————————————————1 A* Z+ ~' z& T& k- q: q& s
版权声明:Aspirant-GQ
2 N8 J6 E  r! \& |如有侵权请联系删除
- r. E. S# P. L- z9 D- [! r2 `) {# z$ T2 k3 w5 z$ M5 L

! U0 V' ?0 a; a
! j" q; @9 H, o  k
收藏 评论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 手机版