
一、代码移植说明1 c& u. }3 M8 |+ a 多年前第一次听说“开源”这个事儿的时候非常不理解,自己辛苦写的代码让别人随意下载研究多吃亏呀,后来见的多了,发现开源也有它自身的一套商业逻辑。但是无论如何开源促进了技术的进步,避免大家重复造轮子,所以这是一件好事!9 G% H* w/ ^4 _; p$ y8 B 网上很多文章讲FOC都是以无感电机为例,讲一堆诸如观测器,磁链方程,滑模观测器,FAST观测器,反正切等等深奥的理论,导致大家觉得FOC非常难。实际对于有感电机来说,通过编码器直接读取角度θ,所有跟位置相关的算法全都不用,甚至电机的电感电阻这些参数也可以不用。创作者从有感电机入手,避开了无感电机复杂的算法,我觉得这个项目是学习FOC的最佳切入点。! \/ y/ L. T, \ I 原版代码要兼容多平台,所以在结构上会有更多的抽象层,移植后的代码只针对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 ![]() : u" b: A3 q# E; S, x' V0 N m 2.2、有感FOC(不带电流采样)控制原理 去掉电流采样及变换公式,这样看起来是不是更加简单了。实际上这样做也可以控制电机,simpleFOC(一)——(八)系列就是对应下图原理,本系列的前几节也都围绕这个原理图来讲,请大家认真看图。 : [" k% Z# T# Q W4 c0 | ![]() # u3 L$ n) O9 p5 F; ^ 2.3、FOC heart function 原版代码包含了FOC的四种模式:Trapezoid_120、Trapezoid_150、SPWM和SVPWM,本次只移植了大家最关心的SVPWM部分。掌握核心函数的应用意义重大(你可以不了解算法,只要知道大概原理,会用即可),可以帮你快速理解整个程序。(原版代码路径:此电脑\文档\Arduino\libraries\Simple_FOC\src\BLDCMotor.cpp)" D) m7 G4 ?7 _9 p% c! \ ![]() 下图为移植后的代码,, a( a9 j2 @( A' x2 z% [6 H ![]() 三、适配硬件 3.1、Bluepill: F# w, V+ B+ [& M/ q0 E7 ?3 G 本次移植的代码支持Bluepill,单电机控制和双电机控制,按照教程接线,编译后下载运行。0 H& M; o, c% R( z, l ![]() . @" \2 K; z1 {+ F. W, ?: 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 ![]() # I7 v; s, Q0 E" @9 R 四、程序架构 原版代码中几乎不用中断(必须赞叹下创作者高超的软件写作能力),我猜测是为了提高跨平台时的兼容性,本次移植只增加了一个中断,TIMER4的1ms中断(已有串口接收中断),通过中断累加计时,在主循环中控制LED指示灯或者打印需要的数据,主要为调试方便。8 Z5 }* l% L% Q ![]() 五、演示功能 1 y& @$ j) N! H% c1 m 六、2021.9.3更新 6.1、当前的问题3 M. I$ X& e9 P! g3 R0 Q6 C 一个月前写的这篇文章,当时代码已经移植完并测试了大部分功能,只剩电流采样和电流环的测试,原计划很快就可以调试完然后开始写教程,中间却出了问题,硬件设计和电流PID调参的问题混在一起,找到问题重新设计PCB,再测试就到现在了。 硬件的问题主要是第一版PCB把电流运放芯片和模拟电路放到了一起,虽然电源是分开的但还是干扰明显,第二版中把运放和数字电路放到一起干扰问题解决了。(VESC就是把运放和模拟电路放到了一起,但是也很稳定,第一版PCB参考了它的设计但是却不行,我所说的这个问题只针对我这个PCB。) % K" R! ^. p7 Z4 c' e 电流环PID的问题调试了几天没有解决,暂时不调了。电流采样的AD值总会有波动,如果PI参数过大,就会放大这个波动,如果PI参数过小,运行时达不到设定值,这挺矛盾的。网上有个说法FOC不一定非得电流环,也可以把电流检测作为电流限制,这个说法我暂时接受,而且实际测试使用电压方式也还行。这个问题等我以后找到更好的方法后再来解决,或者代码开源后有热心网友能解决那就更好了。20211222升级了代码,所有问题已经解决,升级内容在《SimpleFOC移植STM32(五)—— 电流采样及其变换》中有说明。 电流环这个问题只针对SimpleMotor这样的大电流驱动,官方的V2.0.3最大电流只有5A,是不存在这个问题的,因为放大倍数小,AD值的微小波动转为电流值以后仍然很小,对系统稳定性几乎没有影响。 ![]() 6.2、驱动器性能 有同学问到STM32F103C8T6控制两个电机并且还要跑浮点数,能跑的动吗?103C8跑浮点数确实很吃力。 j* S. Q/ ~1 p4 L8 I! o 实际测试只带一个电机, I2C的编码器AS5600(硬件I2C,400KhZ),主循环,voltage模式1885Hz,foc_current模式1110Hz。 SPI的编码器TLE5012B(硬件SPI2,9MhZ),主循环,voltage模式3180Hz,dc_current模式1990Hz,foc_current模式1460Hz。 如果是双电机,估计还要一半。这和主流的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 ![]() 5 n- o8 p- L. P% i% K1 O$ ` 6.3、电源选择 1、锂电池最好,电机减速时会进入发电模式,发电的电压高低跟电机的功率和转速有关,电池可以吸收发电,保证母线电压不会超过电池电压, ![]() 2、可调电源,本质上是开关电源,增加了电压和电流显示,操作起来更直观,: f, x1 j; G' N4 a ![]() @% N3 H4 h; G6 x5 @ 3、适配器,属于小功率开关电源,小功率电机可以用用,! e8 l* ]: f1 e: m- T. l ![]() 4、大功率开关电源,' P0 c }/ q' m, T% B, R0 U + [- f. o; @& T! I$ u ![]() 6 k$ n$ d# ?& s 6.4、sublime 代码查看我用的是这个软件,如果你有自己习惯的编辑器也可以。可以单独打开C文件查看代码,也可以把整个文件夹拖入,查找关键字非常方便,具体用法可以百度。. b F- E0 i7 A) W2 m ![]() (完) ———————————————— 版权声明:loop222 B5 t0 Q) E; Q; u- j; |# s1 Y |
【2025·STM32峰会】GUI解决方案实训分享1-对LVGL咖啡机例程的牛刀小试以及问题排查
OpenBLT移植到STM32F405开发板
为什么要先开启STM32外设时钟?
【STM32MP157】从ST官方例程中分析RPMsg-TTY/SDB核间通信的使用方法
【经验分享】STM32实例-RTC实时时钟实验④-获取RTC时间函数与中断服务函数
STM32 以太网 MAC Loopback 的实现
STM32功能安全设计包,助力产品功能安全认证
基于STM32启动过程startup_xxxx.s文件经验分享
HRTIM 指南
ST 微控制器电磁兼容性 (EMC) 设计指南