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

SimpleFOC移植STM32(一)—— 简介

[复制链接]
攻城狮Melo 发布时间:2022-11-8 11:24
一、代码移植说明1 c& u. }3 M8 |+ a
  多年前第一次听说“开源”这个事儿的时候非常不理解,自己辛苦写的代码让别人随意下载研究多吃亏呀,后来见的多了,发现开源也有它自身的一套商业逻辑。但是无论如何开源促进了技术的进步,避免大家重复造轮子,所以这是一件好事!9 G% H* w/ ^4 _; p$ y8 B

4 p3 Y5 H' S2 L# H3 N  网上很多文章讲FOC都是以无感电机为例,讲一堆诸如观测器,磁链方程,滑模观测器,FAST观测器,反正切等等深奥的理论,导致大家觉得FOC非常难。实际对于有感电机来说,通过编码器直接读取角度θ,所有跟位置相关的算法全都不用,甚至电机的电感电阻这些参数也可以不用。创作者从有感电机入手,避开了无感电机复杂的算法,我觉得这个项目是学习FOC的最佳切入点。! \/ y/ L. T, \  I

! `' q8 E% {2 S5 N6 ?5 Z  原版代码要兼容多平台,所以在结构上会有更多的抽象层,移植后的代码只针对STM32,所以一些不必要的中间层会被省略掉,这是结构上的优化,但在程序上尽可能的保留了原版风貌,只对严重影响性能和功能的部分代码做了优化,方便大家学习对比。本次只移植了磁编码器云台电机的对应代码,其它类型的电机(比如步进电机、hall电机和ABZ编码器)本次没有移植,请知悉!3 W; L/ T2 E* }2 q
/ t7 E- E& a% z. Q
二、控制原理2 u- ^" X$ u" c0 Q
2.1、有感FOC控制原理' q% [4 o( C8 y7 j7 P5 g
  本次移植对应如下原理框图,其中核心函数的功能对应图中方框部分,输入的三个参数也在图中标记,setPhaseVoltage(float Uq, float Ud, float angle_el)。% D- w/ B) h! j0 f8 l1 z

8 R4 J6 d8 U9 O+ X. m
32680bccd1d04c62a49c52a5971299b1.png ) g0 a# [4 F! T9 a
: u" b: A3 q# E; S, x' V0 N  m
2.2、有感FOC(不带电流采样)控制原理
0 p8 d/ e' U1 S9 F% o. _3 G  去掉电流采样及变换公式,这样看起来是不是更加简单了。实际上这样做也可以控制电机,simpleFOC(一)——(八)系列就是对应下图原理,本系列的前几节也都围绕这个原理图来讲,请大家认真看图。
2 Y% x) `, {  W: h6 X& D: [" k% Z# T# Q  W4 c0 |
154f7058dcd4406da1a9db9415b6bbc4.png
) ?: d/ G% `& L% D. ?# u3 L$ n) O9 p5 F; ^
2.3、FOC heart function

7 M) H; y8 X) B  原版代码包含了FOC的四种模式:Trapezoid_120、Trapezoid_150、SPWM和SVPWM,本次只移植了大家最关心的SVPWM部分。掌握核心函数的应用意义重大(你可以不了解算法,只要知道大概原理,会用即可),可以帮你快速理解整个程序。(原版代码路径:此电脑\文档\Arduino\libraries\Simple_FOC\src\BLDCMotor.cpp)
" D) m7 G4 ?7 _9 p% c! \

) Z6 ^5 q' A* n ecdb4cf855d04630955176116e922857.png 4 e$ K- ?  G/ x  \' z4 B

" m4 P& b3 _; `3 T/ l+ a  下图为移植后的代码,, a( a9 j2 @( A' x2 z% [6 H

( o8 w4 f  U% k, \7 |; c4 {/ w; H
d45c5755f837444497d1c8ed99587ea9.png 7 w* a' w! t& X; P( u/ v, k' \7 u; L

  `8 o" F, r0 h9 D3 S三、适配硬件
6 I" U5 ^1 {( s. ]$ x3.1、Bluepill
: F# w, V+ B+ [& M/ q0 E7 ?3 G
  本次移植的代码支持Bluepill,单电机控制和双电机控制,按照教程接线,编译后下载运行。0 H& M; o, c% R( z, l

: ^! u: @' Y  z9 H& y
613526a907254081a3acce3f5c5a4418.png
; S. Y: ^0 ^% H4 {4 r7 t. @" \2 K; z1 {+ F. W, ?: t
e364080184124ef1abd898334f70e319.png
. T" B2 M6 U' P$ s* E) M9 _/ t( d3 ?) u0 F+ z. d, w) Y
3.2、SimpleMotor
% J6 q/ \) q6 U& U, j
  为了减少跳线,让大家能够更专注于代码学习,本人开发了SimpleMotor驱动板,STM32F103C8T6单片机,支持大功率双电机驱动,兼容《SimpleFOC(七)——STM32(Bluepill)的应用》演示的大部分代码,本次移植的所有代码都将在这个驱动器上运行。$ S/ N, x0 L* q3 B' [0 H3 H

1 m2 L: A% V4 I5 f% Q) V c6935bfe835d462e91bcf22fa71db924.png ) I4 n9 p% \) s6 p& v7 y5 C8 _! Y
# I7 v; s, Q0 E" @9 R

5 A% Q6 [" B3 b3 I四、程序架构
2 ?: n- N2 h2 P  原版代码中几乎不用中断(必须赞叹下创作者高超的软件写作能力),我猜测是为了提高跨平台时的兼容性,本次移植只增加了一个中断,TIMER4的1ms中断(已有串口接收中断),通过中断累加计时,在主循环中控制LED指示灯或者打印需要的数据,主要为调试方便。8 Z5 }* l% L% Q

& `1 T# T/ j" _ b71fa6fc07fc462b85de1859144d8895.png
% C* X- C- x- d2 q) M  F) |
  w: S9 a! [5 p9 k( n
4 Y. E6 ^" H* |0 `3 b五、演示功能
) u- r. y) d' M. @* D  v7 i1 y& @$ j) N! H% c1 m
六、2021.9.3更新
" Y& h7 D3 X6 \& l6.1、当前的问题
3 M. I$ X& e9 P! g3 R0 Q6 C
  一个月前写的这篇文章,当时代码已经移植完并测试了大部分功能,只剩电流采样和电流环的测试,原计划很快就可以调试完然后开始写教程,中间却出了问题,硬件设计和电流PID调参的问题混在一起,找到问题重新设计PCB,再测试就到现在了。
7 r- q* S; o, r7 n; [
/ M1 K0 f- p" d& x1 f+ n5 @  硬件的问题主要是第一版PCB把电流运放芯片和模拟电路放到了一起,虽然电源是分开的但还是干扰明显,第二版中把运放和数字电路放到一起干扰问题解决了。(VESC就是把运放和模拟电路放到了一起,但是也很稳定,第一版PCB参考了它的设计但是却不行,我所说的这个问题只针对我这个PCB。)
+ M# M% V( z2 r& B9 L% K" R! ^. p7 Z4 c' e
  电流环PID的问题调试了几天没有解决,暂时不调了。电流采样的AD值总会有波动,如果PI参数过大,就会放大这个波动,如果PI参数过小,运行时达不到设定值,这挺矛盾的。网上有个说法FOC不一定非得电流环,也可以把电流检测作为电流限制,这个说法我暂时接受,而且实际测试使用电压方式也还行。这个问题等我以后找到更好的方法后再来解决,或者代码开源后有热心网友能解决那就更好了。20211222升级了代码,所有问题已经解决,升级内容在《SimpleFOC移植STM32(五)—— 电流采样及其变换》中有说明。
/ i0 g2 n3 x! W+ X1 E
- ~+ z* B$ u# d  p  电流环这个问题只针对SimpleMotor这样的大电流驱动,官方的V2.0.3最大电流只有5A,是不存在这个问题的,因为放大倍数小,AD值的微小波动转为电流值以后仍然很小,对系统稳定性几乎没有影响。
' i* l& e8 Q8 J. C
" o- h, Z2 s4 v6 o6 D: b5 Z 68a0c404d2d0498eb97953f5179c7df0.png
5 J* A" r4 j# a0 q& d- U
9 a" ?2 T# O6 e) P) e6.2、驱动器性能
; Q# ^& c# v8 D0 V  有同学问到STM32F103C8T6控制两个电机并且还要跑浮点数,能跑的动吗?103C8跑浮点数确实很吃力。  j* S. Q/ ~1 p4 L8 I! o
  实际测试只带一个电机,
/ {" d( d6 p  ]4 c0 J    I2C的编码器AS5600(硬件I2C,400KhZ),主循环,voltage模式1885Hz,foc_current模式1110Hz。
5 P% m& C2 t1 q    SPI的编码器TLE5012B(硬件SPI2,9MhZ),主循环,voltage模式3180Hz,dc_current模式1990Hz,foc_current模式1460Hz。
  {  X. R* u/ J& ?+ o4 Z1 R  如果是双电机,估计还要一半。这和主流的10kHz的速度差太远了。8 D1 l- e# }1 P1 r% k, b
  提升速度的方式有两种,一个是用带浮点运算的单片机,比如STM32F407,方法简单,但是由此会导致成本的上升,另一个办法是把浮点数转换为定点数来运算,效率也会成倍提升,但是归一化后的代码会非常难以理解,不利于代码的学习。所以这是一个取舍,创作者既然把它命名为SimpleFOC,还要让代码运行在MEGA328这样的芯片上,我觉得包含了把它定位为入门学习的这样一个目的。# K2 m! M4 S$ i6 R8 f/ i3 g
3 g& R+ x0 x; D" \1 S
97d23af7e5f74def8fc97af0492a982e.png 5 l1 W8 L* z! F& t$ h
5 n- o8 p- L. P% i% K1 O$ `
6.3、电源选择

- S: h* |; `% g; {# r% w  1、锂电池最好,电机减速时会进入发电模式,发电的电压高低跟电机的功率和转速有关,电池可以吸收发电,保证母线电压不会超过电池电压,
' S, p# k! ?! s0 Y) T  h
1 n: W+ C7 H+ l* f de934e0e15654bbcac317a3cb89cb09b.png
; B3 D; U1 i& L7 S6 n1 e
1 v; N3 |* O) E2 {9 q2 z: N  2、可调电源,本质上是开关电源,增加了电压和电流显示,操作起来更直观,: f, x1 j; G' N4 a

) X8 O, s/ T# Q. u& d2 u) [ ac4aa1f0039541a6ab44a759c620bfa0.png
% R# R% l7 ^' k5 V$ x  @% N3 H4 h; G6 x5 @
  3、适配器,属于小功率开关电源,小功率电机可以用用,! e8 l* ]: f1 e: m- T. l

* x9 F1 u  s5 J ce19a02b380c48c387e6163d17104557.png * M1 t. y4 v% U$ z1 n# R! G6 F

9 H) ~$ P+ i; K4 m7 C3 d( @2 N, a) Q  4、大功率开关电源,' P0 c  }/ q' m, T% B, R0 U
+ [- f. o; @& T! I$ u
a93140d64325419583d12794edfeb8a4.png
, P" n4 A- {: U' S6 k$ n$ d# ?& s
6.4、sublime
7 ]& e/ x" L& r7 N- o  代码查看我用的是这个软件,如果你有自己习惯的编辑器也可以。可以单独打开C文件查看代码,也可以把整个文件夹拖入,查找关键字非常方便,具体用法可以百度。. b  F- E0 i7 A) W2 m

% y+ h0 C# y4 l% y ba4812a62c7f4f78a1f4bca6c8c7fb3f.png * V4 T8 w$ Y8 q; V- L! W$ D; {

% V/ J+ V) N# m9 i, k& Z* Q, m(完)
$ T& b; G  P4 j5 h$ \————————————————
9 R* p7 B6 a" K2 q  v( H版权声明:loop222
& J- X! x1 w& C
- h3 {" w& k- L, R2 ]5 b  B5 t0 Q) E; Q; u- j; |# s1 Y
收藏 1 评论0 发布时间:2022-11-8 11:24

举报

0个回答

所属标签

相似分享

官网相关资源

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