搜索
bottom↓
回复: 90

一款成本极低的FOC驱动

  [复制链接]

出0入0汤圆

发表于 2021-9-7 20:04:48 | 显示全部楼层 |阅读模式
本帖最后由 LaoZhu123 于 2021-9-8 13:44 编辑

由于我们比赛所使用的工程机器人采用了机械臂的结构,而RM官方提供的3508、6020、2006电机无法满足某些关节的输出需求。所以我们于2019年底选择了使用MIT Mini Cheetah的关节电机FOC驱动方案。但是在实际测试环境中,发现该FOC驱动器并不稳定(在当时的测试条件下),所以我们重新从头开始研发了一套不同于现有开源方案如simpleFOC、ODrive的FOC驱动方案,具有成本低、体积小等优势,作为技术储备提供给摩擦轮电机、关节电机等场景使用。
FOC在控制BLDC (Brushless Direct Current)电机上有诸多的好处,主要有如下几点优势(注意是FOC的优势,不代表本项目都具备):
   1. FOC则完全没有转速的限制,不论在什么转速下都可以实现精确的控制。
   2. FOC的换向性能极其优秀,最高转速下正反转切换可以非常顺畅。
   3. FOC还可以以能量回收的形式进行刹车控制。
   4. FOC可以实现力矩、速度、位置三个闭环控制。
   5. FOC驱动器的噪音会比电调小很多,效率也比电调高很多。
  但是由于FOC的计算量大、原理复杂,所以需要很高成本的控制器,这也使得FOC在很多场景下都没有得到推广和使用。在经过了半年的研究和迭代之后,本人将FOC涉及大量计算的代码进行了部分加速,也重新根据国内的供应链进行了选型,希望本开源项目能够帮助国内的广大开发者们用上有优秀性能的BLDC电机,为开源社区贡献一份力量。本项目剥离自我们为工程机器人盘式电机研发的FOC_STD项目,对供应链重新进行选型,目前项目还正在移植过程中,请期待九月底实现基本功能移植。
开源项目Github地址: https://github.com/ZhuYanzhen1/miniFOC
希望大家能多多关注,给一个小星星鼓励一下呀。

出0入0汤圆

 楼主| 发表于 2021-9-8 00:03:07 | 显示全部楼层
dukelec 发表于 2021-9-7 22:37
這個項目,foc 核心部分準確的說不是優化,而是簡化
順便一說,mcu 建議換成 stm32g0

感谢大佬的回复
1. 本人是刚入大三的学生,项目中有很多部分还不成熟的地方,还请大佬多多指正。
2. 此项目目前还在开发阶段,预计9月中旬才会完成基本的速度闭环和角度闭环控制,9月下旬完成通信部分的接口。
3. if判断部分是一个异形的六扇区SVPW调制,会考虑将您提供的优秀代码替换掉这一部分的代码。
4. 通信部分在后期我们会考虑将您的协议加入到项目中去,并使用宏进行协议的管理。
5. 目前使用的这颗GD32F130G6在淘宝上可以三块钱买到,对于学生党的我来说简直是福音,所以暂时不会考虑更换。
6. 由于GD32F130G6具备ADC外设,所以电流环会在基本功能完善后加入到开发计划中去。

出0入0汤圆

 楼主| 发表于 2021-9-8 13:30:29 | 显示全部楼层
不是很清楚为什么楼中有那么多对这个项目抱着嗤之以鼻态度的人。也许是我前面的描述没有写清楚,在这里重新做出一下声明:
1. 在描述中提到的五点是FOC的优势,我没有说过是我这个项目能够达到的优势。上面这一段描述是从我的README简介中复制出来的,为的是简单介绍FOC可以具有的一些优点从而使还没有怎么了解过FOC的人能够知道有这么一个好东西。
2. 这个项目是从盘式电机研发的FOC_STD项目里面剥离出来的。在原项目中我们用的也是STM32F4系列,且实现了50k的电流闭环速度及超前角弱磁扩速。但是大家都清楚目前单片机市场是个什么样的情况,现在国外很多开源FOC项目在国内的制造成本也不低。所以这个项目的根本目的不是再做一个simpleFOC或是怎样,而是要大幅压缩FOC成本,有得必有失。
3. 本项目目前1.0.1版还在移植过程中。国产的IC和原项目还是有很大的出入,所以还请大家耐心等待,等完全完成之后再评价也不迟。目前没有电流环也是因为还不确定能不能在这样的单片机上实现,所以在目前的开发计划中并没有加入。
4. 对于文中所说的“深度优化”一词确实欠妥,我会重新措辞编辑描述文本。但是对于在我使用的这颗GD32F130单片机中我后续会通过汇编进行有关计算的加速,也算是一种“优化”了,不知大家是否认可。
5. 希望各位仔细阅读说明再评价,本项目现在还没有开发完成,所以不要以目前的状况就下定论。这是我在阿莫发的第一篇帖子,深感自己与大佬们之间的差距巨大。也请大佬多多点出问题及改进方法,真的非常感谢。

出0入0汤圆

 楼主| 发表于 2021-9-8 13:41:50 | 显示全部楼层
本帖最后由 LaoZhu123 于 2021-9-8 13:47 编辑
amigenius 发表于 2021-9-8 09:33
MIT Mini Cheetah FOC虽然代码写的比较烂,但不至于楼主说的这么不堪,您测试的是国内的仿品吧,哈哈。
还 ...


Mini Cheetah FOC是我们根据本杰明的论文和他开源的电路做的。今年本杰明已经重构了代码,您可以看一下本杰明在大概2019年时候写的:https://github.com/bgkatz/motorcontrol。那时候的代码他是把mbed、F3的库(不知道从哪里搞来的)、F4 HAL库、以及一大堆东西揉在一起。c和cpp混用、寄存器操作和库函数操作混用、mbed初始化函数和HAL初始化函数混用,可读性基本上为0。而在我们测试的时候由于上述种种问题始终没办法定位到它初始化各路时钟的准确位置,索性后来就直接买现成的FOC了。
另外您说的这几个开源项目我都有了解,确实非常的优秀。在控制代码和性能方面我这个项目目前是难以望其项背的。但是他们的缺点也就是本项目想极力推广的一点就是成本。在学校,我看到绝大部分的同学还在用很低效且高噪声的那种AB相码盘直流电机,我认为这个项目的进一步推动和完善有可能可以改变这一现状,能让不少人在同样的开销下用上更优秀的电机。

出0入0汤圆

 楼主| 发表于 2021-9-8 13:50:25 | 显示全部楼层
carefree1986 发表于 2021-9-8 08:21
楼主,大概看了下你的代码,用了这么多得浮点运行,这会大大拖慢单片机,ODrive 和 本杰明 用浮点是因为他 ...

用汇编加速浮点运算的代码还在移植&测试中,移植完成后可以快很多。虽然也赶不上F4的FPU,但是比编译器转成定点指令还是要快不少的。

出0入0汤圆

 楼主| 发表于 2021-9-8 18:48:44 | 显示全部楼层
TINXPST 发表于 2021-9-8 16:33
也可以考虑用IQmath来处理浮点运算,M3内核有现成的IQmath库可用。

多谢大佬推荐!这就去看看这个库怎么用,如果可以的话会移植进项目中来。

出0入0汤圆

 楼主| 发表于 2021-9-8 19:20:04 | 显示全部楼层
amigenius 发表于 2021-9-8 14:49
哥,您链接的是MIT的foc,之前在MIT Mini Cheetah项目的关节电机上重构出来的,与本杰明什么关系,本杰明 ...

报道:MIT Biomimetic Robotics Lab 以 MIT Cheetah 3, MIT Cheetah 2, MIT Cheetah Mini 闻名。
之前 lab 成员 Benjamin Katz 在他的硕士论文中开源了 MIT Cheetah Mini 电机驱动器, 连接12个电机与机载电脑的中心板(SPIne)的代码和硬件。
之前我们也有发邮件联系过本杰明咨询关于他们Upboard Linux内核实时性补丁及SPI2CAN有关的问题。不知道是不是我的消息有误。

不知道大佬从我的哪句话中看出来我说此类开源FOC项目一无是处了?还有您之前一直在说我在“吹嘘这个项目的颠覆性设计”是在哪里体现出来的,还请明说。另外对于您说的:

1. MIT代码剥离mbed后“清晰简洁”?:不仅是clang-format和clang-tidy没有做,而且注释不完全、该封装的部分不封装写得很长,不该封装的(比如读磁编码器,可以用宏实现)甚至还要用cpp去重载。当然有可能是因为大佬阅码无数,但是对于我个人而言这确实是我见过最没有可读性的代码。

2. 时钟很好找,是我睁眼说瞎话?:系统时钟当然好找,其它的外设时钟写得一团糟。我举个例子,它CAN的时钟初始化:
    main.c 43行,通过mbed初始化CAN为1000000
    can_api.c 93行,手动操作寄存器设CanHandle.Init.Prescaler = 3;
    can.cpp 60行,通过mbed函数重设CAN波特率:int ret = can_frequency(&_can, f);
    can_common.c 45行,通过mbed函数重设CAN波特率:can_init_freq(obj, rd, td, 100000);
    can_api.c 226行,通过操作寄存器重设CAN分频器:can->BTR &= ~(CAN_BTR_TS2 | CAN_BTR_TS1 | CAN_BTR_SJW | CAN_BTR_BRP);

3. 本项目的立项原因是基于我们在实际使用过程中遇到的问题并尝试解决,不知道何时被您上升了道德高度,从您的口中变成了要打倒其它项目了?

4. 请提出一些实质性的问题及解决方案,像dekelec和TINXPST大佬那样我非常欢迎。您要是来跟我争论我这个项目到底是不是个垃圾,您说的就是对的。

出0入0汤圆

 楼主| 发表于 2021-9-8 19:22:14 | 显示全部楼层
本帖最后由 LaoZhu123 于 2021-9-8 19:36 编辑
dukelec 发表于 2021-9-8 19:01
先看 cpu 使用情況,不缺的話就不用改,
畢竟改起來麻煩,未來芯片會越來越便宜,以後肯定會有便宜的帶 f ...


好的好的。汇编这个确实不好写,我其实用的不是很熟练。8051、8086、Thubm2和RISC-V指令集都看过还没能到顺手拈来的程度,要对着手册慢慢写 。就是想着如果能写出来的话一个是对我自己也是蛮大的一个提升,另外一方面Cortex-M3的内核都可以用来加速浮点运算了。

出0入0汤圆

 楼主| 发表于 2021-9-8 20:26:58 | 显示全部楼层
dukelec 发表于 2021-9-8 17:56
是的,樓主高二之前就會玩 stm32(看他 github 高二設計的 stm32 作品,自己畫板,板上有 tf 卡、攝像頭  ...

使用Linux环境其实出于很多方面的考虑,当然最大方面的考虑就是开源,所以我全套采用的是linux+gcc+cmake+make等开源的工具链。
中间也确实出过一些问题,主要原因是这颗芯片冷门而且没人用gcc弄过,要重写ld链接文件、startup启动文件和openocd的配置文件,不过还好后来顺利解决了。
其次用Linux+gcc的好处就是我现在可以在Github Actions上做持续集成,每天定时编译固件以方便其他人调试和下载。
持续集成Github Page页面可以看一下,这是每晚23:50自动编译出的固件。
另外,我现在也在研究怎么在QEMU上做Cortex-M系列单片机的仿真,目前还没有什么头绪,不知道大佬有没有什么想法。
如果能在QEMU上实现Cortex-M系列单片机的仿真的话,可以顺理成章地实现单片机程序的单元测试和真正意义上的持续部署,我想这应该也是一个非常有趣的应用。

出0入0汤圆

 楼主| 发表于 2021-9-8 21:46:50 | 显示全部楼层
dukelec 发表于 2021-9-8 20:56
用 linux 做主力系統,日積月累是可以改變思維模式的,增加你解決問題的能力,而且可以順便給你增加豐富 ...


嗯嗯,在单片机这种软硬件结合的部分确实非常难做仿真。OpenOCD目前还是有在维护的,现在更新到了0.11.0版本。
Linux系统我是两年前才开始用的,之前主要是自己编译Linux主线然后在全志的那些高性价比芯片上跑着玩。
后来发现它的兼容性实在是太好了,我路由器MIPS架构跑的也是openwrt基于Linux的,就入坑搞Linux了。
至于为什么用了EasyEDA而不是KiCAD主要有两方面的原因吧。不过后续应该会再提供一版KiCAD的,EasyEDA的Layout操作还是太反人类了。
一是EasyEDA导出BOM还有PickAndPlace文件很方便,用它自带的库做SMT基本上不会出错。
二是之前想着顺便要参加嘉立创的那个电赛,索性就用它的EDA了。

出0入0汤圆

 楼主| 发表于 2021-9-8 21:49:21 | 显示全部楼层
carefree1986 发表于 2021-9-8 21:13
用汇编加快也于事无补,要用整型数 才是根本解决办法

目前的能力不足,没有想到如何用定点运算。还请您提供相关的代码以进行参考或者在Github上创建PR。啥都不提供就说要用这个用那个的一律当做打嘴炮处理哈

出0入0汤圆

 楼主| 发表于 2021-9-8 23:42:30 | 显示全部楼层
carefree1986 发表于 2021-9-8 22:35
我只是相对你提一个感觉对你有用的建议,你听不进去可以不采纳,没必要说我是嘴炮,你做的好不好跟我有屁 ...

我懂,我懂,“都是为了你好”

出0入0汤圆

 楼主| 发表于 2021-9-9 23:49:43 | 显示全部楼层
TINXPST 发表于 2021-9-9 22:02
关于IQmath如何在FOC编程中使用,给你一些参考:

1. IQmath的User Guide,到这个帖子里找:https://www. ...

好的,IQmath已经在移植阶段了。现在的问题主要是编译工具链和芯片架构不配套,等我研究一整子先。

出0入0汤圆

 楼主| 发表于 2021-9-9 23:56:18 | 显示全部楼层
本帖最后由 LaoZhu123 于 2021-9-10 00:20 编辑
LM5017 发表于 2021-9-9 15:33
复习一下32楼就好了。
老司机早已看穿一切。


笑死我了,就您这样的还自称是老司机呢。
看了您发的帖子,全部都是灌水文,晚辈还想请问一下您有没有做过什么开源的方案发出来让大家开开眼界?
全都是人家玩烂了的东西,说不定keil用的还是破解版的吧?
不知道前辈对电机控制有何造诣,是玩透了无感低速FOC还是可以手推状态空间方程?
不好意思,差点忘了您可能连状态空间方程是什么都不知道,晚辈在这向您道歉了。
以及,虽然平时要上课,但是在我这里发这种无关东西的我都会一一回敬,所以发之前还请深思熟虑。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-6 21:05

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表