|
本帖最后由 motor_control 于 2020-11-1 22:10 编辑
作为Microchip公司的无感FOC控制应用笔记之一的AN1078是我最早学习和研究的无感FOC控制算法,这是个基于滑膜算法的应用笔记,其公布最早可以追溯到10多年前,远早于自己研究无感方波的时代,而且代码还是完全开放的,由此可见老外的电机控制技术有多么的领先,说什么弯道超车还是要谦虚点,因为一般在弯道都会有事故多发的提示牌。科学的面前来不得半点的虚伪和骄傲。
后来随着接触的增多,也知道了更多的无感算法,比如英飞凌的磁链反正切、基于外差法的锁相环、基于Ed=0的锁相环、高频注入等等,后来随着开源的项目的出现,比如有名的VESC,可以说是相当先进和完整的项目示范,如果不是开源的话,估计国内公司要去做类似的东西,基本上是很难突破的,连BLHELI这种无感方波控制算法都被老外掌控的东西,就不要奢谈什么无感FOC了。
无感FOC到底容不容易掌握,是不是很牛逼的玩意?这个是因人而异的。从我推荐别人学习无感方波BLHELI的经验来看,凡是说难的,基本都是怕吃苦,想走捷径的人,另外,基本的汇编语言功底也不扎实,只想看全C代码的实现。这个想法很正常,但不正确,世界上最大的弯路其实是所谓的捷径。开源的出现固然是好事,可以让我们见识先进的电机控制技术算法和实现,但有个很大的问题就是,开源程序的实现一般都是用高级的单片机来执行,就拿VESC来说吧,它使用STM32F405的芯片,主频很快,又是带有硬件浮点单元的,还加入了CHIBIOS(我叫它吃逼OS),写起代码来比较直接,特别适合开发阶段快速实现、快速验证的要求,但是对于我们做产品来说,就有很大的缺陷。为什么这么说呢?很大部分的原因在于低成本的竞争现实,对于缺乏研发能力的国产厂家而言,低价是唯一且可行的方案。况且我们是不受一切开源条款限制的,能拿来主义就拿来主义,所以结果很容易就会想到使用低价的芯片来移植VESC程序,比如使用同样带有硬件浮点单元的STM32F301的芯片,在有量的情况下,可能比你用M0差不多的价格就可以拿到。
今天为什么发一个移植的贴呢?主要是看到一些初学电机的朋友,因为不明白FOC的具体实现,有意无意的总是认为实现无感FOC一定需要高阶单片机,我就以M0单片机来演示下实现的效果,顺便也谈下学习的经验,帮助有兴趣的坛友少走弯路,少些迷茫,因为我是海绵宝宝,愿意分享电机控制的一些经验和给一些有志气的电机控制新手工程师一点鼓舞。所谓好的技术是让用户使用简单,性能优异,耐用可靠,价格便宜,充分发挥芯片本有的潜力,也就是说,技巧的最高表现乃是隐藏技巧。但现在没有人愿意做深入长久的研究,没有内在的强大就自然表现为对外的夸张表现,比如用F7做穿越机的飞控,用m4核做无人机电调,而且很多工程师离开了高主频和硬件浮点的加持就没法做项目,因为很多都是国外开源的程序。
先谈谈MICROCHIP的AN1078:
1.AN1078是基于滑膜控制器的无感FOC控制算法。
2.基于DSPIC33系列芯片实现,执行一次FOC算法大概20us左右,PWM频率一般为20KHz。
3.在MPLAB V8.9集成开发环境下安装C30编译器进行程序的编写和编译,以及软硬件仿真。
4.使用RTDM方式可以观察感兴趣的变量的实时波形和马达启停控制等等,非常的强大和有用,再次强调,很有用!
5.使用官方配套的MCLV和MCLV-2开发板。我强烈建议购买官方开发板,确保硬件可靠,但电机就不需要了。
6.使用PICKIT3.5+来仿真和烧写程序。官方的PICKIT3很容易坏掉,而PICKIT3.5+乃是华强北品牌,可靠耐用,价格便宜,100块而已。
7.使用C+汇编语言来编写程序,汇编主要是基于DSPIC的DSP引擎,这是DSPIC计算威力之所在。
8.DSPIC引擎默认是有符号小数计算方式,它的ADC会直接把转换结果变成有符号小数的形式,要注意一下。
我特别着重谈下第7点,DSPIC设计的初衷就是让单片机和DSP结合来达到1+1>2的效果,AN1078的核心程序都是使用DSP的汇编语言来编程的,所以建议有兴趣的坛友下载一份DSP编程手册来对着程序学习,把里面的例子手算一遍,不要偷懒,不要认为学习以后不用的汇编知识会浪费时间,但我会告诉你,它只会让你节省时间和增长功力,世界上没有白费的努力。也许,等你读完它的程序后,你会喜欢上汇编,精简有力。
现在是要把DSPIC33的程序移植到M0核上,一般大家都会用到ST的M0,因为现在ST用的人多,特别是炒货涨价的存在,我就使用英飞凌的XMC1300来加以实现,为什么要选这个型号呢?
原因如下:
0.我不使用国产单片机,国外单片机性能参数不隐瞒不虚标,够成熟稳定,合理的价格,公开的资料,对于小散使用是个主要考量。我们碰到的客户,真正考虑量产的公司,一般也是首选ST、infineon、microchip之类的国外大厂。
1.XMC1300是基于ARM M0 的单片机,带有MATH模块,也就是可以计算除法和使用CORDIC计算反正切之类的费时运算,而且是C语言编写,挺好的。
2.它的主频是32MHz,比之一般的STM32F031的48MHz,要慢上许多,但XMC1300都配有16K RAM,可以把程序放到RAM里面跑,有效提升速度。32M都能实现,你用48M都跑不了的话,那就要努力了哈。
3.可以配合JSCOPE来实时观察波形,这个比microchip的基于串口的RTDM确实要更好!极其非常特别的有用。
4.使用M0核实现的成本比较低廉,耗电也很少。
5.只会用开源浮点程序的工程师比之会自己能写M0程序的工程师有蛮大的差别,我们不提倡偷工减料,国产替代,但鼓励通过算法的提升来使用低阶单片机来降低成本,提高性能和可靠性。这是符合发展趋势的,有坚持的信心。
6.用150M或更高的带硬件浮点的M3/M4核,还集成运放,MOSFET预驱,开关降压功能的集成芯片那是土豪的尤物,小散勿入。
对于各类无感FOC算法的优缺点,我就略作介绍,让初学者有个大概印象就行。
1.AN1078的算法是基于滑膜控制器,具体的解释我就不详谈了,大家可以看看应用笔记。在这里,我特别强调一下,做电机控制,首先要做到能在金山词霸的帮助下,熟练阅读英文资料,这是最起码的要求。毕竟科技这块老外高过我们很多,我们还是学生,必须得学会专业文献的英文阅读。如果老想着中文版资料,我觉得还是算了,搞研发很难的,又不赚钱,何必为难自己呢?话题收回,言归正传。AN1078其实就是通过估算DQ轴的反电势波形,然后对其做反正切运算来得到角度,最后,还对得到的角度进行滤波延时的补偿,这样得到正确的角度值。这种滑膜算法在一般的低速、中速、高速表现很好,毕竟它是基于反电势的,所以在很低的速度下不太适用。应用笔记是使用定位,加速,无感运行的经典三段式启动算法,它的开环到闭环的平滑切换值得初学者学习。AN1078通过检测滤波后的速度做堵转保护,效果很好。
2.英飞凌的经典磁链反正切方式,其实是和1078使用反电势的反正切方式,其思路是一样的,就是把两个正交量求反正切,而反电势的积分就是磁链,没有太大的本质区别。具体的现象就是用手捏死后会马达会失去控制,有高频啸叫。主要体现它的硬件CORDIC的计算效果,其实软件实现也比较容易,网上有很多算法源代码可供参考。
3.AN1292是MICROCHIP的无感FOC应用笔记之一,属于PLL锁相环控制,它是以稳态运行时D轴反电势等于0,即Ed = 0为算法的基础,在低速运行时非常稳定,还可以带载正反转平滑切换方向,毕竟它是作为洗衣机直驱马达无感算法开发出来的,确实不错。这个也已经移植到了1300上,20KHz的PWM频率,执行时间在30us左右。不过它需要测量电机反电势常数作为关键参数,还需要一定的校准,但总的来说,相比滑膜,计算量要小。通过实际体验,在速度接近0时,如果施加过大的转矩,马达有可能锁死在一个固定位置,电机接近短路,实际上受电流环最大值限制。
4.在以前的英飞凌研讨会上有给出一个基于外差法的锁相环,就是把2个正交量使用类似三角函数和差化积、积化和差的那套高中数学的方法,把误差通过简单的PI控制器进行调节,得到速度和位置。一般情况下,在稳态时效果不错,但瞬态过程因为有PI调节的延时,有可能出现失锁,表现特征就是啸叫,最后大电流失控,而且很难去检测和执行保护动作,当然,在人为堵转时也会出现啸叫和大电流,很难检测。所以大家也不要人云亦云,不要把英飞凌给出的一个锁相环框图当作宝贝,自己实现了就有什么了不起,这是见识短浅的表现,外差法是很常用的锁相环实现方式,不要执迷其中,也不要作自大之想,免得自误。对于航模类应用,需要高动态的机动要求往往不能满足,外差法锁相环并不适合。
5.高频注入一般认为需要至少M3核以上才能实现,其实用M0也可以实现,丝毫不差于M3的实现,而且噪音也没有特别的大,也可以跑几千转,只是一点,需要电机有一定的凸极性。但可以零速跟踪位置呀。
6.VESC是通过非线性观测器得到2个正交量,也是做反正切运算来得到位置,但它和别的观测器的一个区别在于不需要速度参数,可以直接得到位置。低速特性比较不错,特别是在D轴施加一定的电流注入的情况下。它的论文理解需要一定的数学功底和现代控制理论的基础,但配合实际代码看还是可以的,这个看个人了。
总的来说,无感FOC的位置估算就是依赖于反电势、电感、磁链这3个东西。电感需要凸极性,一般需要电机厂配合,小散客户就不想了,个人想玩的话,可以到某宝购买DJI老版的2312无刷,通过螺纹固定螺旋桨的那种,凸极性明显,可以做高频注入试验。反电势和磁链没什么太大差别,都是取DQ轴正交量做反正切或是锁相环,锁相环又分为Ed=0和外差法实现。Ed=0的实现非常稳定,低速特性好。外差法的实现在堵转时容易失控,出现啸叫和大电流,在高动态的场合有失锁的风险,很难检测这种故障。所以我会以久经考验的,性能优异的滑膜算法作为移植的实例,其实包括峰龆的芯片,模仿国外的FAIRCHILD,IMOTION等等的搞法,使用硬件完成FOC计算,所以在50K PWM调制下,使用滑膜算法可以支持到高达30万电气转速,这点单片机的计算能力就只能甘拜下风了。另外,我在几年前也在论坛给大家分享了老外用AN1078滑膜算法驱动无人机的视频,响应非常的快。就我个人的经验来说,和别的客户分别使用无感方波和自己的无感FOC来驱动无人机,在空中的动作表现,就是明显比无感方波的要更敏捷。
真正想学无感FOC的坛友,可以考虑学习AN1078,使用老版本的程序配合MCLV,因为老版本的程序架构简单直接,特别适合学习。一鸟在手胜过百鸟在林。VESC很牛逼,但就其开发环境让我们一般人非常的难搞,又加入了太多无关核心的内容充斥其中,对于学习无感算法来说不太合适。
下面遵循没图没真相的原则,给大家看看实际的移植效果。
使用12V电源,最大5A。兆信MN-325D。非常好用。
使用旺财板验证,2015/7/30设计的,做完了几乎所有的电机控制试验。
JLINK + JSCOPE
KEIL4开发环境,真理不需要升级,电机控制算法的升级也很慢,简单好用够用即可,不折腾自己不装逼。当然,这是几年前搞的程序,电机也找不到当初匹配的,就拿一个42BLDC电机来驱动了,KEIL5也才出来不久,这个程序有实际装配大疆精灵2验证来看看M0的控制效果,可能网络上还有,记得叫精灵2无感FOC飞行的。只不过,好的启动算法在后来才加以实现,类似TI FAST估算器的效果,也是在1300上实现。
以前的开发板主要是针对无刷电调开发,没有加入开关做启停控制,看来经过5年之后,有必要重画一版了。
实现平台照片:
可以使用XMC1300或XMC4108,XMC1300是M0核,XMC4108是M4核。
这是在程序中设定要显示的变量:
使用JSCOPE的实时波形,最上面的黄色是估算反电势alpha,绿色是估算反电势beta,中间是滤波后的反电势alpha,最下面是估算的位置。
现在优酷已经OUT,说什么流量限制,去他的,换成B站了,成为一名UP主。
这个是在KEIL上编译、烧写、运行的视频:
https://www.bilibili.com/video/BV1qv41167zx/
这个是使用JSCOPE显示滑膜算法的相关变量的视频:
https://www.bilibili.com/video/BV1rK4y1E7EA/
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
有时候所谓难以割舍的感情,事实上只是不甘心而已。 (出处:黄舒骏《不要只因为他亲吻了你》)
|