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

SimpleFOC移植STM32(四)—— 闭环控制

[复制链接]
攻城狮Melo 发布时间:2022-11-8 12:11
一、电机的三种控制模式) g: d# a- U9 Q
(为保证本文可读性,把之前写过的搬运到此。)
' M" ^7 `3 |8 ~. w5 l$ P3 y
4 c# D" P& V! h. D$ b( s# I. ^1.1、力矩控制模式
% L* X0 S3 a, G+ f/ M3 l% J  ◎电机在运行过程的电流,始终等于给定的值。
! _  p) D2 v4 \/ l  ◎比如使用电机来拉伸弹簧,设定电流值越大,弹簧被拉伸的长度越长。设定电流越小,弹簧被拉伸的长度越短。设定电流为零,弹簧不被拉伸。
( K5 l. m0 c& i, ~  ◎在SimpleFOC项目中,受限于Arduino UNO的运行速度,大部分例程没有使用电流采样,所以设定电压值代替设定电流值。1 @# H+ X( T; T( F

  t: \; b# X# T2 @, R1.2、速度控制模式
4 x4 A3 ^7 r) r* q5 f
  ◎让电机始终按照设定的速度运转,不因负载的变化而变化。
9 {1 p7 X$ c! H3 F; m9 s8 x) @( |/ b  ◎速度控制一般会采用内环电流环,外环速度环的方式,所以可以限制转动过程中的电流不超过设定值。
# s7 l) j+ T* C1 ~+ ?( L$ C  ◎比如传送带传送物品,给定的速度不会因为传送带上是空载或者带载发生变化,但是当负载过大,电流超过设定值的时候会报警或自动停止。
( B2 s5 S. e$ ?2 j7 S& d( d1 k# W/ @9 r: \+ f
1.3、位置控制模式
- A) c) r& m8 z. o' B, {8 \  ◎精确控制电机转动到指定角度,
" P# ]: O4 _( T, _( c8 v  ◎位置控制一般会采用内环电流环,外环速度环,最外环位置环的方式,所以可以限制转动过程中的最大速度,和最大电流。% f- u  {0 o8 N
  ◎比如机械臂从A点运动到B点,并限制挥舞过程中的最大速度和最大力矩。
" l: [2 ^! h- ?/ {* v  b+ H3 B2 T& i. [- O+ E9 W! y0 A! }

8 A/ d1 G: X% O4 }8 l2 T* K二、硬件介绍/ M/ H0 B8 t5 e9 ~* {: Z
  本节实验适合运行在SimpleMotor和STM32最小系统板上(Bluepill)。
- U/ E3 H/ Z2 Y' X3 E/ i7 n1 w9 r( Q' J* J
2.1、原理图
1 d: k3 k$ [. e3 Q( ~
+ k! Q7 j% L; K7 y 3448411adf81412aabed4eecc3a4507b.png
! J9 I$ t7 T, s0 M& h; z" l
9 M; o! {$ H$ f/ c" g7 v: Q2.2、SimpleMotor方案

- n1 ?& v8 a3 Q+ {9 c9 |) [4 f2.2.1、准备清单6 n1 Z( f: Z' M5 S* d
~(IC3XEHN[8TQ}AD[%I1_B1.png
  X' K. N( T) S/ @6 f& G0 U5 x3 u+ ~- L- k
d5a47bc076ad442184f29941d6db93f3.png 2 }$ ]2 O" k4 @7 D

( _4 J) c# j, ]带编码器云台电机可以是AS5600,也可以是TLE5012B。
, q4 y/ v1 R) g5 w* u
+ b5 t4 a% k) f9 c0 c2.2.2、接线8 m/ ~+ b: F$ J, X3 |  x

9 j# g7 a" C) C" k3 j f3206560b03b488f961bf7c8cde7d00c.png . e- C* Y* g) z
4 {" v5 B& \5 _% `6 j, A8 V
只展示M1的接线,M2的接线根据原理图自行连接。
  F7 n: c. z  |- ?  f$ s4 M! d/ C, j" C6 @1 y$ n
2.3、STM32方案

) J+ s9 ]3 U  R1 @3 t+ \2.3.1、准备清单9 ^/ U$ E* z/ b4 x

' u5 e' D2 k3 Q9 p! z P`CJ835~}UQSJY0W@C~B{00.png
- t/ C2 a" T1 A/ j/ ]* z( Z8 f) m& ~! h
0dad7682fadf419a9e5a53df3f648af3.png & z6 @; m' P5 Z0 s

, n- h. W2 |# \, e$ ?! e% L" W带编码器云台电机可以是AS5600,也可以是TLE5012B。, G: X* Y3 h7 I- l/ K3 U
$ y2 c4 s3 M  F
2.3.2、接线% q! z% Q" G7 e+ i$ Q

# Q; A1 N1 b& G% P! z! n# _% X 44a4b20f0f5a4de88ddda1b5c9969bde.png # p0 P% f6 @5 y
6 Y2 R$ W0 ]% [( Q- T
对照 Shield V2.0.3 的原理图:9 n  H: Y$ U' |; q$ y

  A8 y" S' g/ }( c1 i YW9LUA53XO(VRE`{W%2{CDG.png
8 Q% n) C8 k( R; u 2_N~J`B]]L[X9M1T8V[905V.png
6 D, }# w* }- F5 H' E: e: `  Y6 y0 F8 z
41962b6a940a4df89f10d45df8df59aa.png
) j% ~8 v4 G& I: j; s, m( P( V4 j+ j9 S6 }! f5 x* I
只展示M1的接线,M2的接线根据原理图自行连接。
, O$ Q3 B5 ^/ E( B( b# y
, T1 p. W# m, o3 B" R) E* q. V' w$ p3 T$ O( K6 E, s+ ?" f+ K
三、控制原理* H5 Q( N. ~' ]) B4 Q0 e$ [  o
3.1、闭环控制原理9 H4 q8 s' x- H4 M  v4 I
1、力矩模式
. W, U6 E2 T- X1 Z4 k2 z
+ @. |! }% F# f/ G' M$ U/ i; Q, h5 w7 X d76aac21357b40b6b4583cc11bf2923f.png 5 D$ S% o( O& v% Q* O* X( K2 ^3 G
% g& o- C4 [9 c; ]! n9 p. x. Z6 v
  ◎串口设定值为Uq,Ud固定为0;
4 U! p+ b$ F& b: F- z+ Q  ◎控制原理与开环控制很像,核心代码是SVPWM;
! u! G  \; v& s# v% F# j  ◎开环的θ是人为设定的,而闭环的θ来自编码器。
5 {  I8 ~! Q8 S- G" P# m4 s& O' G9 E5 c$ h* ^8 t/ ]. P7 j7 L) Z
2、速度模式
# ^) y* [$ i( e( G9 v; t
6 z6 P7 b0 _" x1 G2 r. ^# R6 U$ | e93fbceacf204938af5fa5c5d2f97127.png 6 Y2 ^5 k; Z% M; [) S& V5 S
  |# @( E7 C! L" {6 A0 x
  ◎力矩闭环外增加了速度环;0 C# x$ O9 D: H# ]7 u/ }1 j
  ◎串口设定值为期望速度(Vd);4 f3 v( f( M) D, h" P2 v( k% ~
  ◎实际速度和期望速度的差作为PID输入,输出值为SVPWM的输入(Uq),Ud固定为0;) s7 L# ^) @5 p5 M% Y
  ◎编码器读到的角度为机械角度,先转为电角度供SVPWM使用(θ);
! h8 D( k; J1 ?+ R  ◎根据最近两次的角度差和时间差计算出当前速度(v),速度做滤波处理(Vf),因为速度要保持平滑不能突变;
4 F. k$ L& U& P* d+ {! P) x0 `, i8 p6 q. I# n7 `% S5 u
3、位置模式* g, _) u9 t0 N5 S" l' L0 _1 N! y
$ L0 I) m5 N9 G7 h$ J
f42d56b5da4446bcaeab6fd9ea42be26.png
" k3 m( d& K+ T3 Z; s# N. P( p& v# e+ F& W3 |: Q
  ◎与速度环相比多了一个位置环,相应的要调试位置环PID,创作者的代码中只使用了P参数,实际应用中一般会用PD参数。
) d# D6 C, B) R0 g; k
( E1 n7 u  b0 w) ?* M9 N9 P; Z8 s  U- J- r' a
3.2、零点检测! W8 _9 O" z* G
  一般的无刷电机驱动器会有个学习模式,用拨码开关切换,第一次使用先拨到学习模式,检测电机参数后保存到内部flash。然后切换到工作模式,驱动器每次上电都会导入存储的参数,执行控制。" `6 p+ B3 a8 v) I8 I7 h( B
  SimpleFOC上电后也会检测电机参数,但是没有保存的动作,所以每次上电都要检测,对于带磁编码器的电机,需要检测机械角度和电角度的偏差(zero_electric_angle),和电机极对数(pole_pairs)。
! h# e% z/ L" T: ?7 y9 I2 @4 M  机械角度零点和电角度的零点,在实际操作中基本是不可能对齐的,所以同学们不要有通过调整编码器角度,把零点对齐的这个想法。
) i( @7 f- n' G5 i# r4 U& @1 \
- k9 J( i1 s9 V% o! C3 ]7 i 89447f2ab7524710acd5b9aee960d68d.png
/ ^$ z4 [; h. K. c# ?- b1 K4 U/ [3 T- [2 r3 E4 u8 C2 d% W
19a5b17d64b741b887481c57fcc026b2.png 0 V9 o- ^6 G2 G9 \5 L
. q) e' D; M8 t5 ^8 {! ^
代码位置在:BLDCMotor.c,9 H5 n1 g1 {0 i. Y6 [/ p0 a- d% a
0 V, E2 H" q1 L  s4 y$ U2 N
6b615c62f39c40f992263242f866a33f.png 8 d' q3 P: e: l8 Y7 M

7 f6 F4 a. T7 K  B# D bb494b47858c49a793a41e3fca465490.png 0 [6 K& ?( \- f8 ]  m

7 r+ L2 D( S: E( j: G3.3、零点检测代码简单说明) E7 {) }6 s+ W$ i
- X$ |$ c$ F: J& j, p/ b+ ^7 _
关于代码中为什么要加 _3PI_2 的原因:
3 T8 @9 p$ K/ z7 E6 U; t/ z
$ w* J7 v. y  \+ C 9d303e8ce7734e509ef14a78f71ea478.png & O2 M  v& U+ P) \/ F( n2 J& }
; d& l/ }! M1 s3 ?
磁场方向为d轴,垂直于转子磁场方向为q轴,d轴建立磁场,q轴做功,
" D6 ~$ p7 k( m0 X! V6 n因为q轴是垂直磁场的,假如设置 θ=0°,电机最终停留在90°位置,所以要想让电机停留在0°,需设置 θ=270°。
& x  @( k: Q' `而d轴是磁场方向,设置θ=0°,电机就停留在0°。
1 S$ f9 o" [* |( q# y所以设置Uq=x,θ=270°,其效果等同于Ud=x,θ=0°。# j8 F5 j( d1 o6 b& m

8 ?7 E* E% u% H& W0 ]* O+ e: @) A 51255d415e644856b2d137faa6b75bc7.png
6 O* L! G8 j! u  F$ o
4 f1 X' k/ O) z% D6 m9 n' f4 C以开环的方式实际测试,证明了确实是这样。& q: B) \6 A1 q$ S; a0 C( S- x! A

' ]" k1 @: H/ o! J+ Y! K: O3 z; y  r四、程序演示

  ?" x" n$ r! M" [4 @, P2 z5 |8 [) F
7b8676d739734a96945fa96961550391.png . ?1 u! i5 N+ w& b4 H' x% j

  s6 y' L! q+ P) H 908a34b9ffee4180af72b49b9684a25f.png ( j3 u$ q6 r4 N+ B6 c' l$ I( b

/ G( Z( p5 d8 I 8d498285fbcc4bd2899e6540fc31c8f7.png 0 X3 N; G% ~/ B8 }4 |+ a3 [" e

( z4 c7 y$ r$ C$ s+ R0 q注意:如果检测到的极对数与实际不符,停止继续操作,否则电机会堵转
: b1 D5 _  t9 ~  M0 @7 ~* F" h/ u" U3 h! _/ Q7 y0 Z

) A+ G1 h; p6 ~$ g4.1、力矩模式
7 l6 {" W* Y; K# A1、选择力矩模式,其它参数根据实际情况设置
- \$ V5 H3 G7 @, \2 |) y: ]* c; y3 J  `: K7 e: J$ q
bee1ff2f76b94e95845a2e68ff200d80.png
0 w0 D3 g* c" w- K9 K: o. V8 q
+ a5 V) C! [% u2、编译下载; T8 {. t4 F& B& o  P
  可以串口下载或者SWDIO下载;7 ?3 U  u. F" N: L+ [
  如果是串口下载,Boot加上跳线帽,下载完毕后拿掉跳线帽,按复位键重启或者断电重启。8 u4 }4 I' R4 N3 Z( c
  注意:复位重启只能重启单片机,编码器没有重启,这可能会导致重启后的I2C接口编码器不能正确读出,SPI接口编码器不受影响。
, T' j4 r. X0 {9 Z3、等待初始化完成2 h, `/ c. Y/ {5 t  q" d9 Y2 I
4、串口发送指令,此时发送的数据表示电压值Uq
5 k: Q7 `  n1 C8 R' k5 {. }$ U! j5 w  注意:设置的电压值不能超过voltage_power_supply/√3,比如电源电压12V,设置不能超过6.92V。1 K# d, d( G- h% S

7 B1 T" N; ~9 ~8 A% L 58af0914159c483db785ddf037a84a90.png
3 D& t6 T; L" |( ~/ Y4 P! C8 A" i( O9 x/ B
5、给电机施加阻力,感受不同电压对应不同的力矩+ h# o: y# A# x

+ o- r3 B+ V5 C8 @! h注意:力矩模式不涉及PID,所以比较简单,大功率电机设置电压值不能太大。1 `* A" L7 @. q3 o) {$ D
4 ^) z  \; i' B4 S
$ f9 J* D2 b  Z1 q0 I" s
4.2、速度模式. x8 x/ o/ D. h) ], }& W
1、选择速度模式
! r" B5 L; y5 \' `5 M6 `
6 b4 [7 Q+ E* i) V c1ee218c2ff846bfa49ca964cd1f7527.png
# v; T$ a5 T, ]% S8 M+ {8 p0 T! p) k8 N1 j
注意:PID参数根据电机实际情况自行设置。( [% P+ P# A5 ?8 H' E, {; P. O
: ^7 n3 m$ ~( G3 Z% h( H  k' W
2、编译下载
2 s; D/ P( G* N' I" n; R3、重新上电,等待电机初始化完成5 o% w: H. {: W$ A% E5 Y
4、串口发送指令T6.28,观察电机是否以1圈/秒的速度转动。1 F0 ~: f+ _  [  O5 Q
+ r% ?; x( o# w& P2 V' x
c19ef1c8d1aa47dfa6061bc330ce43a2.png
* ]6 [) o  `+ d
+ Z! N9 G3 y2 w4 L8 E8 r% f5、设置不同速度,观察电机转动变化。给电机施加阻力,观察电机转动
  v; w+ s$ N2 r
/ c% N4 E6 V* G+ ?. K: k
4 L5 T( {( W0 H! U2 M4.3、位置模式
+ X+ y! Z+ Q% }, T1、选择位置模式
. H+ u* t8 u  E3 u" q7 ]" v/ {% c) w# z5 [2 M
1f8fc1d7463b42998f9b120e8d96e6c7.png
5 C7 ~0 T' |9 f9 R" N: X, o" g9 F
) V, B6 i' p9 c; X( }( d注意:本例中,位置模式包含了位置PID和速度PID,根据电机实际情况自行设置,不了解PID的请百度。
; s/ j, M" P. U3 q7 h2、编译下载- h# c5 ?' S0 ]$ a, `' o3 i& ~9 m
3、重新上电,等待电机初始化完成
: j; b' ]5 g. ^2 P* Y0 s4、串口发送指令T6.28,观察电机是否转动一圈
$ g8 k4 c* }% @/ W7 ], i  上电后为了保证电机为静止状态,设置初始化后的目标角度为当前角度,所以第一次设置角度6.28,电机不会转一圈。第一次可以设置目标角度为0。5 n: T! {" u+ Y' x1 P2 ~8 Z2 ?' N4 u

, o: Z" b. M0 `2 ~% C# T ad715685adef4cf2bc2b1a36bedb056b.png
1 Y% i& f* w; L# b2 k/ v9 b7 |6 ~3 s) S  G4 R' b& R
————————————————. k# O/ e( q6 P" ]
版权声明:loop2220 f, R# c/ K1 D% b/ ^2 N* b4 j4 m9 z2 K

' g* y, Y: H% G7 \1 l" Y/ `5 D! b
收藏 评论0 发布时间:2022-11-8 12:11

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版