SimpleFOC(九)—— 霍尔电机控制
SimpleFOC之ESP32(七)—— 霍尔电机
之前写过这两篇教程,测试中都表现出了极大的不稳定性,所以霍尔电机部分的代码我一直没有移植,
本次移植后的代码测试稳定性还可以,迄今没有发现问题。
而之前表现的各种不稳定,我总结了下有两种可能:
1、引脚中断需要避开相同中断源,比如STM32的PA11和PB11,都是同一个中断源EXTI_Line11,在霍尔信号的中断代码中是无法区分的。这个问题在移植keil的时候很容易就能发现,但是在官方的SimpleFOC代码中,稍不注意就出错了。
2、arduino环境下的中断不太好用,特别是跨平台的兼容性可能还不够好。
ODrive的操作演示——控制AS5047P、霍尔电机和轮毂电机
当然simpleFOC主打的就是simple,所以电机实际效果和ODrive 的驱动效果相比有一定差距,仅仅适合入门。
需要说明:霍尔电机主要用于做轮子,不适合做高精度控制,虽然FOC可以实现任意角度的控制,但是霍尔信号的分辨率太低,盲区太大。
霍尔电机就是带有霍尔传感器的直流无刷电机。
因为霍尔传感器的成本低,体积小可以安装在电机内部,所以应用非常广泛,种类非常丰富。
驱动板103和驱动板405 都使用中断方式处理霍尔信号。霍尔信号发生边沿跳变时进入中断,在中断中读取霍尔状态,判断当前角度。
下面用一个图片说明simpleFOC的驱动原理。
假如霍尔电机是2对极,那么cpr=12,示意图刚好相当于一个钟表,假如当前电机的电角度在12点,q轴如上图,电机的转矩将一直保持这个状态,直到触发到下一个霍尔跳变,代码检测到新的角度,产生新的矢量q1并持续到下一个状态,所以simpleFOC对霍尔电机的控制效果等同于六步换相法。而在ODrive中使用了角度插值的方法,所以q轴会跟随电机的转动而变化,电机更加平稳。
当然SimpleFOC提供了一个最简单的控制方法,保证电机能够转起来,你不要一看它的控制效果不好扭头就走,你知道了原理下一步就可以把ODrive的角度插值法移植过来,电机就可以实现ODrive的效果,是不是很简单。
本次移植没有再像之前那样,把所有编码器放到一起通过 myprojcet.h 设置来选择。而是把霍尔电机的代码单列出来,这样代码看起来更简洁一点。
霍尔信号为开漏输出,所以需要上拉电阻,代码中对应的引脚已经配置为打开内部上拉,外部如果有上拉电阻也尽量使用,驱动板103默认接10K上拉电阻。
读取霍尔角度目的是为了确认电机的极对数,以便在稍后代码中可以准确的控制电机。如果你已经知道了电机的极对数,也可以跳过本小节。
2.1.1、接线
只需接霍尔信号线,SCL1(PB6)、SDA1(PB7)、PA12和3.3V电源,三个信号随便接,不用区分顺序。下图:
电机驱动板103 购买链接:某宝购买
2.1.2、修改代码
修改极对数,如果极对数正确,那么电机转动一圈,角度变化刚好是6.28;如果不正确,比如电机实际极对数为4,代码中写的是2,那么电机转动一圈,角度变化为12.57。同理,如果是3对极,角度变化为9.42,如果是5对极,角度变化为15.71。
2.1.3、串口查看角度变化
下载完代码后,用手拧动电机转动,刚开始的几个角度值不准确,我估计是没有赋初值,不想再折腾代码了,大家将就着用吧。所以需要先来回转动半圈,然后转动电机让角度归零,观察电机转一圈角度的变化。转动的结果应该是3.1415926的整倍数,如果不是说明手动转的有误差,不是刚好一圈,请自行估算就近极对数。
2.2.1、接线
2.2.2、修改代码
2.2.3、下载代码,观察电机运行
发送指令T6.28,电机以每秒一圈的速度转动,霍尔信号的分辨率低,对于一些电机来说齿槽效应更明显,可以调高速度试试。
本小节的其它操作与M1的操作一样,请参考上面的2.2小节。
电机驱动板103 购买链接:某宝购买
请结合上面的2.2和2.3小节操作。
需要注意的是,控制M1的电机发送指令以 A开头,比如 A6.28;控制M2的电机发送指令以 B开头,比如 B6.28。
霍尔信号为开漏输出,所以需要上拉电阻,代码中对应的引脚已经配置为打开内部上拉,同时驱动板405 的ABZ引脚接有3.3K上拉电阻。霍尔信号和下一篇的ABZ信号都接在ABZ引脚上。
读取霍尔角度目的是为了确认电机的极对数,以便在稍后代码中可以准确的控制电机。如果你已经知道了电机的极对数,也可以跳过本小节。
3.1.1、接线
只需接霍尔信号线,M0的ABZ三个引脚和3.3V电源,三个信号随便接,不用区分顺序。下图:
电机驱动板405 购买链接:某宝购买
下载代码,手拧电机,观察串口打印的角度变化,具体看上面2.1小节吧,不想重复写了。
3.2.1、接线
3.2.2、修改代码
3.2.3、下载代码,观察电机运行
发送指令T6.28,电机以每秒1圈的速度转动,发送指令T31.4,电机以每秒5圈的速度转动。
串口通信使用USART2的DMA方式接收,空闲中断,所以指令后面可以不用“回车”,当然你输入了也没有错。
霍尔信号接在M1对应的ABZ排针上,其它操作与上面的M0相同。
请结合上面的3.2和3.3小节操作。
需要注意的是,控制M0的电机发送指令以 A开头,比如 A31.4;控制M1的电机发送指令以 B开头,比如 B31.4。
电机驱动板405 购买链接:某宝购买
驱动小电机时感觉还算平稳,大电机振动就比较明显了,再把代码烧写为ODrive,效果立马提升。
SimpleFOC解决了有无问题,但想要更好的性能表现,还得从ODrive中找方法。
(完)