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

SimpleFOC移植STM32(五)—— 电流采样及其变换

[复制链接]
攻城狮Melo 发布时间:2022-11-8 12:28
一、原理说明
! |  l7 z$ _4 Y% W1.1、电流采样

1 V8 d, k8 N- y: ~! A1.1.1、为什么要采样电流/ I& E' Z3 S. h' r
  FOC(Field-Oriented Control),即磁场定向控制,磁场大小与绕组中的电流成正比,所以对磁场的控制在程序上就是对电流的控制。前几节的程序并没有使用电流环,而是直接使用电压值,确实可以达到还行的效果。但是这样做有两个问题:  a) g4 B5 {; n) U7 Y) F9 k4 ^& d; M

& C' v/ m6 U/ i& Z* _: Z/ p" h) Z1、不能保证i_d为零,i_q等于目标值,因此电机并不能工作在效率最高的状态,力矩控制也是不准确的。
0 {7 o, b$ _) S8 R3 R$ v7 R, B& f3 ], e- Y% y* |3 {. V
2、相电压施加在电感上产生相电流,电压和电流有相位差且并不恒定,低速运行时相位差对电机的影响不明显,但是当速度快了或者速度变化率高了以后,相位差的影响就会非常明显。
9 Y2 |" D2 X  j( A: F6 a
6 c6 w% J" K. R: {1.1.2、电流采样方式7 _, C" ]) ^1 `# ]9 B7 b/ B
电流采样主要有三种方式:4 I0 _; E% D+ q2 ^3 K4 O
低侧电流采样. f# @" z: `0 T- K7 M& E$ p
高侧电流采样4 i0 o4 i: {% W5 y
内置电流采样
8 W8 d* D- U. L# d& o
; h' F5 u  P- Y% A" t, \* Q1.1.2.1、低侧电流采样
, [  o! i: ~' L4 n: w) W4 m& Y 28572bfcb96b45c2984df19b500701dd.png
% {# I5 A* k' B5 o& h) {( K) C2 C1 _9 \' m5 Y) @0 [& x! i
低侧电流检测可能是最常见的电流检测技术,主要是因为它既不需要高性能的PWM抑制运放(如内置),也不需要支持高压的运放(如高侧),采样电阻在低侧MOS和GND之间,确保了运放输入端的电压非常低。这种方法的缺点是,必须在下桥臂MOS打开时检测电流,PWM频率通常为20k~50khz,这意味着低侧MOS的开关频率为每秒20k~50k次,因此PWM设置与ADC采集之间的同步非常重要。2 E& ~4 F3 L( P3 V5 C: ]& u
6 e( u5 J% o; ^" o
1.1.2.2、高侧电流采样$ j1 Q0 i6 [0 h7 N
8 g* o) L5 ?* B
  高侧电流检测可能是最不常见的电流检测技术,因为它需要支持高压的运放,采样电阻在高侧MOS和直流电源电压之间,使放大器的输入端始终有高电压。 这种方法的另一个缺点和低侧电流采样一样,需要同步PWM和ADC。" h, n7 E" v) K* F

3 Y) Y6 _. H$ b6 o8 u- T cb77a5f318034aec9847e202eb221479.png
4 n+ {% l. t6 n+ r/ V' o
9 E: P- ~$ w" T  Y7 x# f1.1.2.3、内置电流采样
( H5 J: o& _6 c$ o& F, Y, k7 {) w+ k) D$ l. }
69251485a55d4e20b92bceb7f12764d3.png 7 v1 |  P; U* x( i0 ?+ ^1 W" {, B8 K
+ o+ P! E3 s0 c0 C- F9 q
  内置电流检测(InlineCurrentSense)是使用起来最简单但是最精准的技术。 采样电阻串联在电机相线上,检测的电流始终都是电机相电流,因为电感中的电流不会突变,所以无论PWM占空比的状态如何,采样到的电流都是连续稳定的。
9 j/ ?! j' }9 w) U, Y( s3 o1 ?! e! Y8 F" J, |
  这种方法非常适合Arduino,采样程序变得简单了,这应该是考虑到了MEGA328P微弱的性能以及跨平台时程序的适配。内置电流检测的缺点主要在于芯片,需要比常规放大器更好的PWM抑制功能的高精度双向运放,简单的说就是硬件成本高。
& |0 N) d& n* O& m- N: S0 }7 T: F  v5 e
1.2、电流变换
" J, C& P: {1 Z, D本节增加电流环,主要增加了以下功能,- n& t. L* m* F* i
1、AD转换获取电流值Ia和Ib,/ n# @/ d( K: O  t9 s
2、通过Clark变换得到Iα和Iβ ,
9 x/ z! |' e3 A" |. u3、获取电机角度,通过Park变换得到Id和Iq,
' l+ B  N; i: W, `7 }# T" n: [4、Id、Iq不能突变,同时为减少干扰,做平滑滤波,
/ m9 R5 l0 E+ L/ d) h1 J9 |' e/ _5、Id、Iq与设定值比较,通过PID运算得到Vd 和Vq,
, W8 _( v( G. D$ V1 l$ J$ C1 M* l
5 d6 p- C! `# u! S# E" M0 C1.2.1、AD转换9 r  ^1 l( K$ p) P+ V
  为了与官方代码保持一致,AD转换采用简单的单通道转换模式,主程序循环一次获取一次A/B相的电流。4 @) {0 q! r, c: I" z. E. W

! b+ f; [: U5 V3 y' g% | 9477595f19ce4d3681f1f23e727b9afa.png * a. Y( q) A& M1 ^+ G( C

$ F$ w2 M( \& M4 Z* y1.2.2、clark变换
! b+ e* F5 F7 X
+ s/ r7 \  ^8 Y% l6 q+ J/ l' H 8865a37662c948078a5cccfb58a93590.png
& j( @" X! ^" `/ @- s" i6 B
# c/ r% i" g3 d9 i6 Z' T% h& e5 ^. `1.2.3、Park变换
; o0 G4 M& Q! h3 y/ E
; O  R& r& l" ]8 D3 g6 Q6 R: o8 k aa2f6f006f604bb294517f29ad5452b9.png
3 Z, T! p  |8 r/ L6 p& N: L
+ H3 u: R. ^5 i' S$ T1 R( I  ~  Park变换中的“θ”是电角度,由读出的编码器角度转变而来
1 ~' M% `" ~+ l" l/ C- p" A, M5 z# ?% ?2 C
50e7824efbc245da926b6f6e176da79b.png . ?' B- Q" g9 b8 T2 E
7 i: g0 B: J/ i1 [/ o. x- x
1.2.4、LPF运算: }3 f  ^. \7 e( @, e, f. R
dc_current模式只有 Iq 的LPF运算
. L; Q. P' Z( S4 zfoc_current模式有 Iq 和 Id 的LPF运算
2 i+ v4 e$ b' ~. }6 w+ R, Q* M, y
4afa484c12e6404b981ca9c179ddaa62.png 7 @8 l( O5 S  J5 E: {* D" W7 x
6 g/ I! s6 g/ Z( M! \- P
1.2.5、PID运算
; U2 }0 y% i7 ~dc_current模式只有q轴电流的PID运算
$ U( N* H! b$ f. Bfoc_current模式有q轴电流和d轴电流两个变量的PID运算
4 Z1 U. e8 |+ ]5 D电流环使用 P、I 两个参数。
8 M/ W+ T! j& r/ N- D5 S
$ L6 F4 _6 ?5 Y  O 5a0c0bd141a44815b9b5c5665bd0733b.png
6 ]5 Z/ @4 B7 Y5 Z
6 h1 L; r4 Z6 d二、电流采样参数设置; `. Y/ n+ T  F' M( V2 q
2.1、INA240介绍

4 A8 a2 O& _1 lINA240有四个型号,INA240A1是20倍放大倍数,INA240A2是50倍放大倍数。: L2 _& A$ ~7 C6 J/ z9 o
2 x: g7 z) Z2 y) |5 _3 D: W
7c2a0758497741a4816ddf5ba609849b.png / C$ Y2 Y1 `  {( Y& {! q
8 L" b! w& L3 J2 u8 @9 }# V; ]) _
电机的电流是正弦波,对于采样的差分信号来说,负半周期为负值,为方便处理,需要叠加上偏置电压以保证全周期的输出为正值。
4 x' A! c3 q* c, r9 a, c) m0 j) W7 S" |" g8 _' H
e2351b20d1204722b66af8c560ab8088.png
1 y  E1 B* G' R" {  A
4 u0 M* k, ]2 v2.2、电流实际波形1 f: X# |; F7 q' _/ b# Q
下图为电机静止时A/B相运放输出端波形,VCC=3.3V,所以此时电压=1.65V,
+ Q1 H/ }) H" j+ {
- Q8 h, Z4 |, g; f 4641e2eafd514cf5b6940e9d6b7cea5c.png
  E/ Y; U+ o5 A5 q. d+ X* C6 Z: `0 W& N9 ^9 A  h6 V
下图为电机转动时运放输出端波形) x4 f$ E6 U( @. `9 Y0 C

- h4 w+ d% k  I8 y. m! d eb42dd33ac3a4fe39927e0ca19e91ce4.png
/ h% w! l% s& B# X. Y5 ~$ P! C* @! T5 J
2.3、SimpleFOC V2.0.3 的参数% [2 d& o6 _5 y/ D' [' A8 P

( c8 H3 w: Z! {0 ]! B) d 3c0f9a09eccf46d894aa62a0c63821d9.png $ g  }! b3 L, f1 u0 F, a% A

( G8 ~% x# @( i' P: e采样电阻0.01 Ω8 s+ d# N8 s7 h. Q5 u( M
运放为INA240A2,放大倍数50# B+ g2 N2 B4 H! n0 j) @# H
背面需分别短接A0/A2至输出; e6 r7 }6 d7 T& A3 }+ K
C1_OUT=INA_VCC/2 + 0.01 * I * 50
* o1 O3 d7 W0 \' J如果INA_VCC=3.3V,C1_OUT=1.65 + 0.01 * I * 50,电流范围(-3.3A,3.3A)" P# s" k4 `  M9 h) x/ _3 |
如果INA_VCC=5.0V,C1_OUT=2.50 + 0.01 * I * 50,电流范围(-5A,5A)
/ b, y! H! o6 A2 e  _B相采样输入在PCB上为走线方便做了反向输入,所以放大倍数需乘以 -1(移植后的代码已经做了处理)。" l0 x( w, ?* f# L

0 v5 r3 N2 H3 g1 ]7 X! [2.4、PowerShield V0.2 的参数7 Z! t( e& h& x4 k) C
6 b- Z/ ^% |, V) _8 P" f. v8 j" r: D8 u
22a47f57737e463d82cef936685bff1e.png 4 w3 p+ v' V; R2 W/ `, i: ~
4 P: R0 A" h3 e8 M( U# F
采样电阻0.001 Ω
- V' G0 {1 Q9 r- B4 T* c9 x运放为INA240A2,放大倍数50
6 L( m  y( n  i9 H1 q5 r2 @; DC1_OUT=1.65 + 0.001 * I * 50,电流范围(-33A,33A)
$ \4 t: E4 ^# x' e8 E$ s* V/ `0 l3 t& S3 B; d; K2 r
2.5、SimpleMotor 的参数" U% l7 P5 C1 F7 [
( ~# {- J: J9 }  K
6427183b04e04200b550652f3adbe3cb.png
7 Z- B& {+ P" ^+ e. i# n
8 k- H" r. J3 O+ D5 s8 m" z采样电阻0.001 Ω) H& Q2 f* M# f3 Z9 d& M
运放为INA240A1,放大倍数20
2 d" W5 V% r: [& l; nC1_OUT=1.65 + 0.001 * I * 20,电流范围(-82.5A,82.5A)* C7 A- o- w% x! k

" C+ m9 f8 M' M/ H2 m三、扭矩模式
/ r$ E3 |; b; ^/ N3 K) }8 c  SimpleFOC中有三种扭矩模式:
. k4 }3 N, M) _( m. K5 {Voltage mode - the simplest one
4 w: |' l# J7 B' F4 y7 uDC current mode - 1xPID controller + 1xLPF
  O8 z2 m1 N5 I1 I' uFOC current mode - 2xPID controller + 2xLPF filters
& I5 S7 b! ?7 J& f# }" n6 {, z8 z& x0 \& H
3.2.1、电压模式(Voltage mode)% M, X! \3 O: ?6 y- I  L8 A4 v. }
电压模式是之前示例中一直使用的模式,3 K6 Y2 m7 ?( a) H/ s
因为不用采样电流,所以硬件简洁,程序简单,执行速度快,
# i' Q4 `1 C7 Z适合低速电机控制
, K! r( c" O* ~) B- t% u4 @6 \$ B, M
" K5 u& b" q" d$ b 92aade3789484d7a8defcea071ebd76e.png 1 S! r. ~3 ~) Z% X0 Z

8 T2 i' _4 ?# B* B; {' u3.2.2、直流模式(DC current mode)
. a  V  l) y# h# b) R; m检测电流大小,实现电流环控制
# s8 W* J( O0 ]% T, ~只控制Iq,设置Vd=0,/ f' l) ?' {6 B* h
像控制直流电机一样控制无刷直流电机的电流* X; W- D) ~# \4 `, ]$ e, b
. H( k' |" C5 l
8f3fb597a3c645819551f67d7bd55ae0.png
+ l3 X$ j) n, s9 v( L& u6 i" L5 X9 `/ N1 m  A
3.2.3、FOC模式(FOC current mode)
4 y6 h; h) S4 ]5 z6 b控制Iq和Id,使转子中的磁力与永磁场精确偏移90度,从而确保最大转矩,) ^4 c5 d- n* |/ g1 Q
唯一真正的转矩控制方法,4 y6 K5 @0 }# Z- w  {
保证电机始终工作在高效状态
& U/ E, O( Y# _& V: i' ^6 A) b4 l# E" }( G2 p
c6c735ca71674316bb9c562e819682bc.png
; c4 n$ ~! K4 Z1 B$ Q" A
9 s0 F0 i/ `- v. p/ I8 K3.2.4、三种模式对比
8 m9 h; u  j5 X3 h  x5 |! T3 u* `& ~2 j9 Z2 S
362b9b5df3454c50871e8d18067e22a8.png
( ~$ o, S7 i  y- T. [  G; P# U, G/ m2 X
四、硬件介绍
# G- z) @9 ?2 Y4 {4.1、原理图$ N6 @3 q0 D: F& X
1 j' X4 g* L7 j0 Q- `  E  O
70978941acce42c2bd01ef67d0959f2d.png
9 k2 s# @0 m8 i+ |; ~1 o2 c7 i
7 Y5 h0 n+ Q1 j) k4.2、SimpleMotor方案

0 Y0 }* w- o3 h, [. _2 ~# ~4.2.1、准备清单6 P. L- t" G5 T9 z- Q4 q

: e. \' e+ m9 I- V: T. F1 C4 c; K( X 7VO7W9Q7EBDWLSMKZ9X]9SS.png 2 `5 O  T- Y4 `% v7 h( q
% Z6 Y' x. y0 t9 v
5e2dac5822a2459c9a1b9ac59aaff761.png ' ^5 H& E! R0 {
0 N  t- f1 G1 G  q1 ]9 W- U
带编码器云台电机可以是AS5600,也可以是TLE5012B。. |8 }# B: |' j& N9 R8 T/ R

8 |2 h7 E0 ^2 X7 M: a3 R4.2.2、接线& C+ l, d) C" J) C0 C( D8 E, v7 t
( E2 n' Y8 H7 d( \# t9 J
7be471a380d741d49716c722da03ef16.png & ?. w# E% I- U2 U4 L3 R
% ?, z3 B) ?/ \' l
只展示M1的接线,M2的接线根据原理图自行连接。" p3 W1 D+ g5 d3 D( R4 m7 O) s
" ~# `! Q4 Q2 R8 j# q& [' M+ F  o
4.3、STM32方案
4 y; t6 A# _; {8 K( X) j( ~4.3.1、准备清单) [" }4 E" ]" {7 ~# Y+ M$ [( K

) @! G& D5 C: I8 q' G) h VLLZ8{J{6J8$(YL0@$(D$N5.png
2 t5 Z, y  Y/ {- z# M  m5 W! a3 ]+ n% |3 X
2954761e36094696935166131493f49e.png & O$ e: t' u* x: b* H9 x

6 B  f4 A9 c& Z! v
8 u0 |, m, F( O1 T0 ~: P. b7 _带编码器云台电机可以是AS5600,也可以是TLE5012B。( b- y# T, d9 p3 D) M5 h
+ W+ P5 }  X2 U* r1 _
4.3.2、接线- d* D+ Q, w9 e' T! O- u

9 S2 r5 ]4 T! ~( d5 f" F" g c235674f6d1f4b91a77cf064b373c9bd.png
- K2 L7 w+ |5 H4 Z2 O+ F; u' i) z+ b; I8 C
Shield V2.0.3的背面按照上图短接
+ n* ?2 o& M" F' Q# t/ ^3 x; M
. R2 e& c% h; q, _9 r 254aaa925a594db18e1348c1ed0ad163.png
& v) d2 {. F7 j9 G; P* I' W/ f# m$ O! O4 t( X- H+ C
对照 Shield V2.0.3 的原理图:, ]& m: T4 ^5 M6 n  I5 H; s- s" ?

1 w8 _$ s( X2 u0 _+ e% S8 {) w# V D[~S_1WL][5}(KC(G]6~G]I.png / _8 V0 a9 ]& ]

4 Q0 n) W% C& }9 z; x/ E7 }' i. I
: h8 q0 {. A* v6 A4 F. d; {如果是AS5600编码器,如下9 f8 k" T7 G) `7 l4 p/ B3 b
; O5 |- g' I  Z8 {8 U
}[[{@AU}X)]0@L]H9G4T{EV.png
& V  y3 m4 b6 \7 L5 k$ ~7 F; P. u- I1 D9 U
如果是TLE5012B编码器,如下
3 D6 {9 F. k/ C1 ^; P& d
1 [$ x! j1 ?8 ~4 @$ }
* s& G3 A* a% y, R' I" E  J# q8 r  k5 C
+ R6 M6 E! U2 T  i& d a4a5bdf708fd4f529df22092bddfdc11.png
/ R; f* t6 y. P. M4 o3 a9 N' j: e
1 h1 p0 L7 j! F只展示M1的接线,M2的接线根据原理图自行连接。& T# I1 |, F8 C( a1 H

* m6 E$ }0 k( D' _+ Q% r* ~* w- I( n/ l# c+ h. ]0 l; B
五、程序演示* Q% n! h* ~+ b% |0 L6 p
# |0 m( A4 `) {  t+ s1 a
d8e972818fc54d8e9d96067c9650e155.png , O0 T7 z/ }: Y# n9 d$ V
% s4 N- |9 A- K6 R
40a32d11cc99450a8c4ca7c142f317ee.png ) X' q6 Z* N. F1 F

  T/ x: x% A% K/ x; l注意:1 _! W5 ]3 y! ~1 g0 O. Y8 ~
1、voltage_limit最大只能设置为供电电压的 1/√3(12V限制为6.9,24V限制为13.8),
) }' X8 v" J2 W2、如果检测到的极对数与实际不符,停止继续操作,否则电机会堵转。' R5 @8 f3 W, N
; D0 X" k9 C- ~" R, p* z, i
- y$ \* Q0 a5 a! z) t3 ^) Z
六、代码升级说明
. l+ [4 }" w5 v: x* O; D
$ @3 d9 U! V) I' T' t5 s. O1、优化PID子程序。之前代码把位置PID、速度PID和电流PID_q_d 各自做为独立的函数调用,本次升级只写一个函数,把PID相关参数定义为结构体,与官方代码保持一致。
# I" |6 g# o, A2 {* W/ O* Y+ F6 W  A1 O( a
2、优化LPF子程序。与PID的做法相同,只写一个函数,把相关参数定义为结构体,与官方代码保持一致。1 Y7 n+ V) m* M+ }  Q0 P

% X9 n: k6 K3 j' ?; G" ]3、增加了对AS5047P、MA730编码器的支持(目前共支持AS5600、TLE5012B、AS5047P、MA730四种磁编),使用代码时只需在 MyProject.h 中把使用的型号设置为1即可。4 k6 O1 Q# T! Z1 g% P

- m$ c. _# z! L3 K! j/ C4、官方最新的SimpleFOC库V2.2.0(2021年12月14日)版本新增加了sensor->update()函数,并因此对角度处理做了大改。/ D3 D2 S7 C; ~" Z
之前调试代码的时候,就发现官方代码中角度读取处理的不太好,特别是速度模式上电的时候电机会突然转一下然后停止,当时按照我的理解改进了这部分代码,最新版本中官方修补了这个问题,我本来是打算把这个部分升级到官方一致,但是修改了一天后发现官方的代码仍然很混乱(相信这部分代码官方以后还会再升级),所以此次放弃了这部分的升级,仍保持之前的设计思路,只做简单优化。
. E( X. {( ]5 w0 E; H! h% y# V8 x9 J- i, t$ C
5、升级零点检测,在已知电机参数的情况下,通过设置 零点偏移角度和方向,可以跳过检测。与官方代码保持一致。- r5 l; I2 ?8 `, |/ i: `3 w
+ R2 k* Y) U6 e# g7 q
6、优化了while主循环中的计时方式,由原来的timer4中断累加修改为systick查询。当前代码中只有一个串口接收中断。与官方代码保持一致。( q- z6 \; ^2 D! w$ A3 U
) m5 }. ^5 Z7 b% T
7、电流采样修改为三相采样。之前只写了两相采样,觉得两相就可以三相似乎浪费,调试ESP32drive的时候仔细看了下代码,发现三相多了一个平均处理,应该会比两相更可靠一点点,所以这次升级为第三相可选择,与官方代码保持一致。" B8 Q& \5 R; Q& t

$ D0 _0 W5 u; D0 M2 Y1 f9 n) L8、升级后的代码可以很好的实现电流闭环,解决了之前发现的所有问题,所有功能都经过了本人的实际测试,当前代码在本人看来已无懈可击,虽为开源但也要认真负责。% Y+ p: I7 }5 \5 N

! I: n) k' M% j* S————————————————
; }) Q; r) h. B) {, i% T版权声明:loop222& f8 ^4 \9 r7 s; C' t1 o& B
! t) m. M, ]' E  k( L# `
# O3 R4 i. Z6 k) y( o8 \- N
收藏 评论0 发布时间:2022-11-8 12:28

举报

0个回答

所属标签

相似分享

官网相关资源

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