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

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

[复制链接]
攻城狮Melo 发布时间:2023-3-18 11:59
一.PID控制算法9 l9 w8 P3 ~4 g& `! h/ T6 V
1.什么是PID

8 J+ `9 a) B# _( @+ [# [PID:Proportion-Integral-Differential0 f$ e. ]+ G' m0 @0 c

5 E5 [/ C9 A' w! }+ L在过程控制中,我们经常使用的一种算法就是PID算法了,所谓PID控制算法就是对偏差进行比例、积分、微分控制,来使偏差趋于某一固定的值,PID核心由三个单元组成:比例单元(P)、积分单元(I)、微分单元(D),PID实际上就是误差控制。
4 e- q0 V0 e: g  `/ Z' }

* B/ @' _% V0 I1 f$ OPID控制系统(模拟)的框图如下:  T# e* n7 ?3 V- B$ D" U: |9 }7 e

+ c8 Q6 g0 ?8 j2 q; G
20200428231808887.png ! G4 R9 _1 Y1 n+ @: z

2 ?/ X( w1 o9 x4 [) |2 d
, i$ r0 @% h( ?
2.PID系数的理解
% G8 e' V$ n0 b
理解PID的三个系数,可以结合PID调节时候的响应曲线,要使实际中的响应曲线趋近于理想状态下的响应曲线,无非就是三点灵魂:快速(P)、准确(I)、稳定(D),要想控制的变量保持在完美的状态,这三个灵魂就必须调整好。
; c1 ]; ]) @) J7 }& e
6 f0 W7 w" F4 n$ y# Y以下分析中的:P、I、D都指的是PID的三个系数- \1 Y0 v# H+ \1 q) D
& W4 N7 G: X# K, [5 E+ h1 }0 }
下面从三个系数对整体控制的影响做出分析
( h" A$ V# m, n7 h
+ d2 F8 D  M8 V3 \" h; }
Ⅰ.比例(P)部分
  c' y6 C0 V$ |* P$ k$ }) E输入值一旦与目标值产生偏差e,就需要缩小偏差,P就是用来缩小偏差的,使控制量向减少偏差的方向改变,而且P越大,偏差缩小的速度就越快,所以P的作用就是使控制量更快地接近目标值。
4 {3 d5 H: a! I
% }8 e8 Z5 g5 \) @' v; v
但是!十肇九快!!!P过大的时候,就容易刹不住,很容易超出目标值,当超出目标值时,又会反向朝目标值飞奔,然后又太快了,再次偏离目标值,然后又朝目标值…这样反反复复的在目标值附近震荡,这就是P太大的弊端:不够稳定。) V* J. v9 z! b( i1 ?

$ i" I4 L) r; W* Y$ W
所以,P大了虽然可以快速响应,但也容易产生震荡,破坏系统的稳定性,可以适当增大D来提高稳定性。
! F4 |) {3 S/ U. X; @
0 g3 Y* k& H/ Q( c

$ G% k5 j) y/ L/ UⅡ.积分(I)部分7 o/ T* D# m1 J3 t; u
积分的表达式如下:' x. C* ~: R! U' B; t& |4 W- J
$ H) B" J7 k3 d- v
20200428231837441.png $ B9 M& z$ M& q$ K* u
2 Q+ P( Y0 I6 k4 l! V* q3 I* S3 _7 x
从其表达式中可以看出,只要存在偏差,积分结果就会不断增加,也就是控制作用会不断增加;当偏差为0时,积分结果是一个常数,此时控制作用才可能是一个稳定的值。6 ^/ l( e% w$ U- n* X* j
2 s& ?0 S) l$ }$ e9 @* G
所以直观的来看,积分可以消除系统的静态偏差,因为一旦有误差,积分就会增加,系统就会做出反应,直到偏差为0,也就是积分保证了控制的准确性。& W! h4 t' e- x0 K  K: ]
" ~- j1 T7 ~; g! T
积分的作用虽然会消除静态偏差,但是也会拉低系统的响应速度,就是说I对P有抑制作用。: }# b7 ?/ S8 i# ]" S0 b
& `! F- c& B4 F+ p
; x1 X( m6 |/ P3 D3 T7 ]0 h; J2 v
Ⅲ.微分(D)部分
6 V' v5 {) D4 L6 X. i2 j( y上面说了,P过大会引起震荡,降低系统稳定性,可以通过提高D来减小震荡。
; n) s- t: R$ `4 T9 k2 [5 `6 ?" G8 X  \8 \: g
微分的作用就是根据偏差的变化趋势预先给出纠正!怎么个预先法呢?因为微分可以看作是求导,上过高中同鞋都知道:求导可以反映函数的变化趋势。所以,通过微分,可以对偏差的变化进行预判地抑制,防止 矫枉过。
( {  \! T) M( u4 J' C7 @/ C2 z9 J: _& f  L% u4 ~; Z
微分的引入,有助于减小震荡,使系统趋于稳定,D越大,抑制P的效果就越强。
; h- m. Y6 {% @' j! [; z/ X( ^1 H6 x, W2 c8 D
9 Z/ L9 o+ w) j- M1 S3 r
3.PID的数字化处理
5 I1 V1 k. L+ |8 S: f由于计算机控制是一种采样控制,只能根据采样时刻的偏差值计算控制量,所以我们是通过软件实现控制算法的,要对PID进行离散化处理(也就是数字化处理),就是根据离散采样点的偏差值进行控制,在离散化处理后,相比于模拟控制由如下改变:
5 L4 B8 h7 h, l5 \* X/ y由差分代替微分
. C) c9 I8 A: m0 a2 A8 a% d) N, c6 E由累加代替积分9 b, a1 b  J  N2 Z* @: j
数字化处理后的PID系统如下:, z: ?. ~- J9 d$ R$ G8 @/ M0 N! n  b
* j6 r2 ~0 b4 z" r9 d  `. L
20200428231857511.png 7 J/ c  @+ E, ?
+ z/ t5 M( W- X+ z
采样的周期越小,就越接近模拟控制,控制的效果也就越好。1 J) x/ ~9 k: |) Y7 ?

1 `/ E4 o; [7 `; C9 }6 P

1 d: R' e; [  p. f/ Q; A二.位置闭环控制/ f  q7 E% Q/ t6 T
位置闭环控制,也叫位置式PID控制,就是传统的PID控制,控制的偏差逐渐接近0,从而使控制量趋于目标值。
9 X4 U4 d0 s. a0 e1 O

9 e" V, N; o# R' E% C/ T4 D$ w  g" t1 S对电机使用位置闭环控制的时候,就是控制电机的转动位置,通过编码器的脉冲累加测量电机的位置信息,与目标位置进行比较,得到偏差值,通过比例、积分、微分的PID算法进行控制,使偏差趋于0。/ S- F7 w7 [* J# d

4 ~9 ?; S0 o$ z* P5 G2 g) e. y电机控制中,输出量就是电机控制模块输出的占空比,作用于电机转速,此时离散PID的公式如下:
: z9 Q  T" p. Q; c5 a: m: o, U. e5 x$ {, i
20200428231914180.png 8 M0 x/ r. F3 p7 {+ l( G
8 K2 H/ W7 e; h# s
其控制框图如下:* Z8 J; i4 U; H' k( {

! I5 T0 ]  [6 s0 C7 A; l" v
2020042823193183.png
( W% t6 E; Z2 b/ {5 H
' m& r9 a" S4 i控制实现代码如下:5 i- u& k6 s6 T" T& I
  1. /* 返回输出) C. W8 |! I7 P" |- W! N" ?
  2. *  Encoder为输入(编码器测量的信号,也就是电机转速)' T) {, Q1 l- ]3 A: X: H- @7 N
  3. *  Target为目标值" ^: v7 V5 W  d
  4. */" c' B$ C" ~- a# n- G
  5. //KP、KI、KD为PID的系数3 Q9 D7 \: F9 d# d# a3 G
  6. int Postition_PID( int Encoder, int Target )
    * t" l$ k; b9 P' e+ z4 U! Y
  7. {        //依次的变量代表:偏差、输出、偏差积分、偏差微分4 N: |! h+ O. x* q3 ]8 S
  8.         static float Bias,Pwm,Integral_bias,Last_bias;  ( ]1 X8 p# s% C0 a, J2 i9 R
  9.     Bias = Encoder-Target;//计算偏差' k0 B2 I! ~# i) J
  10.     Integral_bias += Bias;//计算偏差积分,累加
    3 o9 Z+ |+ h0 y, I
  11.     Pwm = KP*Bias+KI*Integral_bias+KD*(Bias-Last_bias);//计算输出,根据PID
    0 I; o8 `+ {$ B# \: C! k3 E
  12.     Last_bias = Bias;//保存为上一次偏差
    ! Y, [8 k3 _2 P; b) p2 ~
  13.     return Pwm;//返回输出
    . w, @) Z; y- o! g$ A
  14. }
    & k* o; M; i/ R

  15. ' o1 p  Q# l  F" N. D: ?
复制代码
8 U! d$ X# B% ^5 Y. x9 R" Y
在定时中断里实现PID控制,定时中断相当于离散的采样点,中断服务函数中可调用控制函数:! T$ z, L" m/ V5 D# {9 \. j
  1. //中断中如下调用
    3 M. \1 n7 t- z; V7 s) N6 W5 y
  2. Moto = Postition_PID( Encoder, Target );
    " \  u7 C1 ?* u. k8 _4 ?
  3. //最终的控制落回到控制电机转速上
    ' A  K! B6 w5 @  N' P
  4. Set_Pwm( Moto );* O. T- G# ~4 b7 b$ X
复制代码

" a3 a" ?' B% \* |! A. ~7 Q最终的控制要落回到电机的控制上,也就是电机的转速控制——PWM控制。9 a) ^& I9 a5 P0 z

+ N/ S& s# k) |' y! A5 |, v. C位置控制的调节经验:先只使用P控制,逐渐增大P,系统震荡后加入微分控制D来抑制震荡,调整KD直至消除震荡,之后再根据系统对响应和静差的要求,调节P、I参数。
$ Q  o5 N+ J2 _8 H; P, i# \; v  s1 X6 z! {9 u
9 g! M. V* F4 e+ F* C% p, i
三.速度闭环控制
5 I( k8 v& ?- U9 b
速度闭环控制也可叫增量式PID控制,与位置式PID控制不同,位置式PID输出的是控制量新的状态,而增量式PID输出的是控制量的增值,增量式PID的离散公式如下:4 u; ^  ~% N2 o+ g+ o! f+ M' U
- a7 }6 n( z( A: v2 |* r2 r( Q
20200428232012760.png
% K' x: o; J" ]9 @6 e+ z+ a8 P% `
. |5 p1 y8 ]1 F- X% T: a
8 D; u: f6 |% y7 j
位置闭环控制是使电机准确转到某一位置,速度闭环控制是使电机以某一速度转动,在速度闭环控制里,我们只需要使用PI控制即可,所以简化后的公式如下:% J( n+ @$ X1 d" w3 L! q( H0 `

! w/ Z) a' Z) V5 y; T+ U
20200428232038432.png
; m  Y# O: ]& K4 ]5 [) W' x注意:公式直接将控制量的增量加在上一次控制量的状态上了!!!
( L7 \. b" {  q. X7 x; Y* k
: \. s* W! y4 Y; k  v6 C

- \/ g/ s7 o% x; s1 |& O控制框图如下:
  ^/ |' ?. Z  _" E
, F* ^; h$ Y7 V, h5 O' d
20200428232053460.png 2 j  y! c( {9 }* h7 _+ E9 f! [9 @
0 |; s) a* s" u# ~9 m
5 [: A7 H" {! [1 v, J. l4 r+ e/ l
控制代码如下:
1 A) u5 c2 f4 I/ ~# L% s  W
  1. /* 返回输出
    : M/ j" [2 r$ e
  2. *  Encoder为输入(编码器测量的信号,也就是电机转速)
    8 _% |3 }: w% h9 ~1 U% t
  3. *  Target为目标值
    : X; E) U$ T" N  m1 j; J, w' \
  4. */- h5 w) n* }% }8 O' O- ]% I, D
  5. //KP、KI为PID的系数1 u- g" r2 K5 w! U' X1 y6 v! G+ O
  6. int Incremental_PI( int Encoder, int Target )
    : T5 M; x% X) Y" L. J! U- ?- l
  7. {        //依次的变量代表:偏差、输出、偏差微分+ m6 Z- o! k2 ^7 h" d
  8.         static float Bias,Pwm,Last_bias;  ! r1 ?# y( T: u
  9.     Bias = Encoder-Target;//计算偏差
    . f' c9 Z5 w' b* Z# t
  10.     Pwm += KP*(Bias-Last_bias)+KI*Bias;//增量式PI
    , o3 C/ g- y" M4 Q1 L# H" M
  11.     Last_bias = Bias;//保存为上一次偏差1 p9 L4 i: _* E/ S* a' k- |7 a
  12.     return Pwm;//返回输出) V6 k8 E3 H6 }& m% p
  13. }' t+ P% ?; d' d/ O' z; {
复制代码
' w) ~, J  ^% E3 m  D7 t
在定时中断里实现PID控制,定时中断相当于离散的采样点,中断服务函数中可调用控制函数:
' f1 l6 ]' L. |9 z& e1 \7 ]- e6 |" S
  1. //中断中如下调用+ `' d$ p9 W; l0 u5 @' g+ H7 R
  2. Moto = Incremental_PI( Encoder, Target );
    . D' M  V) v5 m1 v0 |, C( u# E
  3. //最终的控制落回到控制电机转速上7 u0 M1 X* V5 o
  4. Set_Pwm( Moto );/ `- l) D/ C$ }! Q0 b7 Q
复制代码

9 Y( N% Z0 S0 D: `7 U# j, D, S1 D) A要注意速度闭环控制采用PI控制,公式与PID有所不同,输出的也是控制量的增量,这里将增量直接加在了上一次的状态量上,所以输出的还是控制量的新状态。4 o5 S) o; ?8 [

, ]$ k. L% U; W最后附上我找到的PID参数调整口诀:
# x$ S" X+ ?4 t$ y% X) f7 _2 D* ~1 `) L1 Z% a+ {+ y
常用口诀:
) W# `6 f, [! H/ O/ i4 w  `参数整定找最佳,从小到大顺序查' o1 K4 {2 o, E7 m0 \' o  [# x% W9 ]
先是比例后积分,最后再把微分加! r5 n& y; E! U) f' K, L6 s
曲线振荡很频繁,比例度盘要放大% Z1 i5 W  j/ ~/ K$ z
曲线漂浮绕大湾,比例度盘往小扳
# k8 e9 q4 \: q( f& x曲线偏离回复慢,积分时间往下降: B) D. M( F# e  P/ [3 \
曲线波动周期长,积分时间再加长
9 M, l% q- s8 y. h* i8 ~5 l曲线振荡频率快,先把微分降下来$ h3 [; ^. v! `; W+ o
动差大来波动慢。微分时间应加长
5 _1 f8 R3 o3 V; ~理想曲线两个波,前高后低4比1" `2 l6 Y- _% J' h; ?
一看二调多分析,调节质量不会低
7 J  P: L; d* X6 `% |% g* L————————————————
! d! \0 X0 W0 h& D版权声明:Aspirant-GQ2 E6 n0 a/ y6 o: A, K" P  Z
如有侵权请联系删除6 @' J6 O4 S7 q1 `: f! H+ v) I( ]
0 G  H, U- j& |

/ Q0 Q3 N" Z; V/ j  g* Z- B' ~1 g6 `/ F3 ?) \
收藏 评论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管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版