|
一、原理说明7 h) x2 K1 c0 |* b6 p 1.1、电流采样 1.1.1、为什么要采样电流1 Z+ W ^5 k$ e: _- Q FOC(Field-Oriented Control),即磁场定向控制,磁场大小与绕组中的电流成正比,所以对磁场的控制在程序上就是对电流的控制。前几节的程序并没有使用电流环,而是直接使用电压值,确实可以达到还行的效果。但是这样做有两个问题: 1、不能保证i_d为零,i_q等于目标值,因此电机并不能工作在效率最高的状态,力矩控制也是不准确的。/ K: L! b% `& i8 M: ]8 | / d: {( `. d7 T 2、相电压施加在电感上产生相电流,电压和电流有相位差且并不恒定,低速运行时相位差对电机的影响不明显,但是当速度快了或者速度变化率高了以后,相位差的影响就会非常明显。' Q# K8 S, c3 [2 U" M 1.1.2、电流采样方式 电流采样主要有三种方式:8 p& D/ P8 s' }& k! r! a. M 低侧电流采样7 g1 z2 C/ ~/ y* [ 高侧电流采样. q; m% J" y$ r( h8 { 内置电流采样$ T) J$ ^6 W# t G2 V# m- k& a T 1.1.2.1、低侧电流采样
/ y1 F/ p) c5 P% K7 M 低侧电流检测可能是最常见的电流检测技术,主要是因为它既不需要高性能的PWM抑制运放(如内置),也不需要支持高压的运放(如高侧),采样电阻在低侧MOS和GND之间,确保了运放输入端的电压非常低。这种方法的缺点是,必须在下桥臂MOS打开时检测电流,PWM频率通常为20k~50khz,这意味着低侧MOS的开关频率为每秒20k~50k次,因此PWM设置与ADC采集之间的同步非常重要。 1.1.2.2、高侧电流采样6 v. q: J0 L! K8 ]) | . i& c$ A q- }( @# @: N 高侧电流检测可能是最不常见的电流检测技术,因为它需要支持高压的运放,采样电阻在高侧MOS和直流电源电压之间,使放大器的输入端始终有高电压。 这种方法的另一个缺点和低侧电流采样一样,需要同步PWM和ADC。 4 w% Y. h* h/ h D- e, _. j
, P$ z; H8 a4 Z+ o3 e 1.1.2.3、内置电流采样 * e+ o3 V6 ~7 c1 c% ^/ e6 @
内置电流检测(InlineCurrentSense)是使用起来最简单但是最精准的技术。 采样电阻串联在电机相线上,检测的电流始终都是电机相电流,因为电感中的电流不会突变,所以无论PWM占空比的状态如何,采样到的电流都是连续稳定的。2 |, Z) @7 H2 t5 u 这种方法非常适合Arduino,采样程序变得简单了,这应该是考虑到了MEGA328P微弱的性能以及跨平台时程序的适配。内置电流检测的缺点主要在于芯片,需要比常规放大器更好的PWM抑制功能的高精度双向运放,简单的说就是硬件成本高。 ' l! W6 }) w; \& \ 1.2、电流变换- J8 l" l, [/ {& B* c |7 Z 本节增加电流环,主要增加了以下功能,0 g d. j* y( e2 L7 ] 1、AD转换获取电流值Ia和Ib,, o+ l" E& Q" N$ l9 a 2、通过Clark变换得到Iα和Iβ , 3、获取电机角度,通过Park变换得到Id和Iq, 4、Id、Iq不能突变,同时为减少干扰,做平滑滤波,/ B+ C# q8 N. a5 R/ A 5、Id、Iq与设定值比较,通过PID运算得到Vd 和Vq,& n; g) Y. ?, O2 o' `% S: I , u3 J9 i, ^6 x7 G5 D& X 1.2.1、AD转换( K2 M( u2 F" X" ` 为了与官方代码保持一致,AD转换采用简单的单通道转换模式,主程序循环一次获取一次A/B相的电流。5 Y* f( w0 u/ Q2 y 8 T( R5 z v/ T7 y0 I
. y1 N( t6 {7 C, m 1.2.2、clark变换% }5 f3 A5 d: D # i9 d. r; J1 d
1.2.3、Park变换; `5 e& R+ k& o) W* ~- d+ ^
Park变换中的“θ”是电角度,由读出的编码器角度转变而来
1.2.4、LPF运算 dc_current模式只有 Iq 的LPF运算 foc_current模式有 Iq 和 Id 的LPF运算. Z8 k3 ?8 k. I+ B% F. r, R/ D " N9 q7 ?' o: P6 ^
* ?( r4 e% ~/ z6 a 1.2.5、PID运算 dc_current模式只有q轴电流的PID运算/ s' m3 [- d' v. K9 |2 h c8 o6 l foc_current模式有q轴电流和d轴电流两个变量的PID运算 电流环使用 P、I 两个参数。5 O) |8 f% X: q( E- P 0 \, F4 k1 w* w$ ~6 L+ l0 k
* ?$ E4 h- L. J- ?6 B9 P 二、电流采样参数设置 2.1、INA240介绍2 o$ o" c: s. W% c# ^/ l' Q: s INA240有四个型号,INA240A1是20倍放大倍数,INA240A2是50倍放大倍数。/ x( q; Z& u. A* Q. O G9 m % r" `* s& E( I5 C; ^0 p
3 V- c* i- F; O5 z8 Z2 w5 c/ V' j3 c 电机的电流是正弦波,对于采样的差分信号来说,负半周期为负值,为方便处理,需要叠加上偏置电压以保证全周期的输出为正值。 / Q# Y" F5 a' X" R
2.2、电流实际波形' o! }& e! b' J+ d 下图为电机静止时A/B相运放输出端波形,VCC=3.3V,所以此时电压=1.65V,
下图为电机转动时运放输出端波形0 i3 Y2 f3 g- M, I( A' F, Z: B
2.3、SimpleFOC V2.0.3 的参数
7 f# C- Z3 Q9 Y# w 采样电阻0.01 Ω 运放为INA240A2,放大倍数50 背面需分别短接A0/A2至输出 C1_OUT=INA_VCC/2 + 0.01 * I * 50 如果INA_VCC=3.3V,C1_OUT=1.65 + 0.01 * I * 50,电流范围(-3.3A,3.3A) 如果INA_VCC=5.0V,C1_OUT=2.50 + 0.01 * I * 50,电流范围(-5A,5A)9 d D$ l' r( k B相采样输入在PCB上为走线方便做了反向输入,所以放大倍数需乘以 -1(移植后的代码已经做了处理)。 # b8 W. W! g6 W( R) ?( K 2.4、PowerShield V0.2 的参数" M! H5 T4 v& X& O( N7 b
) o$ P% [ b( i+ E8 z& ^5 H6 ^ 采样电阻0.001 Ω 运放为INA240A2,放大倍数50' P U" R8 y# C# L9 D C1_OUT=1.65 + 0.001 * I * 50,电流范围(-33A,33A). V7 L6 o/ n$ T* G \1 j! W! G 7 n4 P/ j; K O2 i3 V 2.5、SimpleMotor 的参数( Q5 _( x1 Y6 J
- X. `* L/ B5 r, a3 B 采样电阻0.001 Ω9 V: p4 m U1 M+ H# e 运放为INA240A1,放大倍数207 Z% z [4 c* b' o/ P$ k3 e C1_OUT=1.65 + 0.001 * I * 20,电流范围(-82.5A,82.5A) 三、扭矩模式 SimpleFOC中有三种扭矩模式:" I- c; S+ j' j W9 U7 K Voltage mode - the simplest one DC current mode - 1xPID controller + 1xLPF7 w8 o* M) E7 o. ?* u FOC current mode - 2xPID controller + 2xLPF filters2 _6 y! d; A- }0 M M+ h7 L 3.2.1、电压模式(Voltage mode) 电压模式是之前示例中一直使用的模式, 因为不用采样电流,所以硬件简洁,程序简单,执行速度快, 适合低速电机控制 + ]2 S& _* W' P3 N
3.2.2、直流模式(DC current mode) 检测电流大小,实现电流环控制& r9 }4 J/ y( ^) h. m3 Y# ` 只控制Iq,设置Vd=0, p8 [& m7 D0 I 像控制直流电机一样控制无刷直流电机的电流 + i, O8 f% q6 h3 G0 A. T4 ~5 q: B4 v
3.2.3、FOC模式(FOC current mode)8 Y1 Z' e) ]- I; ]5 {2 ` 控制Iq和Id,使转子中的磁力与永磁场精确偏移90度,从而确保最大转矩,2 Y: q; g' E2 l' T5 r" z2 J 唯一真正的转矩控制方法, 保证电机始终工作在高效状态 ( Z, @, D5 M `( Z/ c; l" O
3.2.4、三种模式对比 n' j4 Z+ x/ s D0 J4 D# e
四、硬件介绍 g9 O+ p2 g0 M9 E* t 4.1、原理图 4 O2 Z' Y5 C& V6 N( y* ?, o
! ]4 @9 H" j n4 z 4.2、SimpleMotor方案 4.2.1、准备清单 2 x8 I# ^% x+ ~ y( ]* z! T. K7 \
% b, F6 Q, U# h+ K
带编码器云台电机可以是AS5600,也可以是TLE5012B。9 T8 l6 Z* T: G 4.2.2、接线% l9 g' Y7 L. t/ R& `4 j
! `% ^/ @' H" j, ]4 r 只展示M1的接线,M2的接线根据原理图自行连接。6 L; D( _$ [4 @- J/ } 4.3、STM32方案 4.3.1、准备清单" S' q+ @+ p+ X
' [8 D3 h' t5 O3 C
带编码器云台电机可以是AS5600,也可以是TLE5012B。 5 \9 b+ a4 F! o8 n' O 4.3.2、接线
Shield V2.0.3的背面按照上图短接
- Q2 k% b8 s9 M& B: Q2 K' Z 对照 Shield V2.0.3 的原理图:
( H1 @" K2 l) X! P3 \8 S' j 如果是AS5600编码器,如下
. J- ~' s |. |2 V, M5 k2 w7 H 如果是TLE5012B编码器,如下 ' N+ B6 n' \ C @
% f/ _3 {9 y F8 V/ Q3 ^
只展示M1的接线,M2的接线根据原理图自行连接。/ }0 J* m/ _ N# `: G0 E) S# l 五、程序演示 & Q1 E; v; _2 J/ x) x" \
2 W2 Q; j# @, d# H
注意: 1、voltage_limit最大只能设置为供电电压的 1/√3(12V限制为6.9,24V限制为13.8),) H/ z0 r. K3 O 2、如果检测到的极对数与实际不符,停止继续操作,否则电机会堵转。 六、代码升级说明 1、优化PID子程序。之前代码把位置PID、速度PID和电流PID_q_d 各自做为独立的函数调用,本次升级只写一个函数,把PID相关参数定义为结构体,与官方代码保持一致。 ; w5 y9 r; c: s5 ^% _; J 2、优化LPF子程序。与PID的做法相同,只写一个函数,把相关参数定义为结构体,与官方代码保持一致。 3、增加了对AS5047P、MA730编码器的支持(目前共支持AS5600、TLE5012B、AS5047P、MA730四种磁编),使用代码时只需在 MyProject.h 中把使用的型号设置为1即可。 ; a% i1 `7 k# c; ` 4、官方最新的SimpleFOC库V2.2.0(2021年12月14日)版本新增加了sensor->update()函数,并因此对角度处理做了大改。 之前调试代码的时候,就发现官方代码中角度读取处理的不太好,特别是速度模式上电的时候电机会突然转一下然后停止,当时按照我的理解改进了这部分代码,最新版本中官方修补了这个问题,我本来是打算把这个部分升级到官方一致,但是修改了一天后发现官方的代码仍然很混乱(相信这部分代码官方以后还会再升级),所以此次放弃了这部分的升级,仍保持之前的设计思路,只做简单优化。7 V) [ E) e' F5 M& Z. P( H 5、升级零点检测,在已知电机参数的情况下,通过设置 零点偏移角度和方向,可以跳过检测。与官方代码保持一致。 : @" U; m0 C0 T 6、优化了while主循环中的计时方式,由原来的timer4中断累加修改为systick查询。当前代码中只有一个串口接收中断。与官方代码保持一致。 1 X3 K9 g/ F6 i; ] 7、电流采样修改为三相采样。之前只写了两相采样,觉得两相就可以三相似乎浪费,调试ESP32drive的时候仔细看了下代码,发现三相多了一个平均处理,应该会比两相更可靠一点点,所以这次升级为第三相可选择,与官方代码保持一致。 ' \8 T: A. Y: Z6 T8 M4 N 8、升级后的代码可以很好的实现电流闭环,解决了之前发现的所有问题,所有功能都经过了本人的实际测试,当前代码在本人看来已无懈可击,虽为开源但也要认真负责。 d f' k3 x P: `' H 6 o9 f( }3 A, z/ d$ d ————————————————$ s+ o: M( ]* i2 i' p& C4 y 版权声明:loop2229 Q- _5 v* Y6 S. Y. \) Y + J1 c) r7 S i1 W, L( ]( U- [ |
【STM32H735G-DK 测评】STM32H735G-DK External Loder 编译和测试
Keil-MDK 在线调试设置断点的高级用法
请教下STM32N6570 怎么把分辨率改成320x240并可以全屏显示
【福利三:逢7发帖赢大礼】想要充分利用STM32H743VI片内的RAM空间(但并不顺利)
基于stm32平台上的IC-MU磁绝对值编码器SPI通讯和码盘数据处理
使用STM32 MCU和MPU连接PDM数字麦克风
分享STM32资料-采用 STM32U031R8 MCU 的 STM32 Nucleo-64 开发板,官方资料,数据手册等资料
HRTIM 指南
使用 STM32 的 DWT 单元监控内存
DAC,COMP,HRTIM Fault 功能的使用
微信公众号
手机版