目录
- 一、角度读取
- 1.1、硬件接线
- 1.2、程序演示
- 1.3、代码说明
- 二、锁相环和插值算法
- 2.1、锁相环
- 2.2、插值
- 2.3、角度补偿
- 三、偏置校准
- 3.1、硬件接线
- 3.2、官方代码操作
- 3.3、移植后的代码操作
- 3.4、代码说明
- 3.5、SimpleFOC的偏置校准对比
ODrive、VESC和SimpleFOC 教程链接汇总:请点击
一、角度读取
1.1、硬件接线
1.2、程序演示
-
目前支持四种编码器:ABZ、AS5047P、MT6701、MA730,本例以ABZ信号为例,
-
ENCODER_cpr 为接口对应的cpr,比如AS5047P的ABZ接口cpr=4000,SPI接口的cpr=16384,注意区分。
-
在MyProject.h文件中设置参数,下图:
-
编译烧写,
-
发送指令“P”(不需要回车换行),同时用手转动电机,查看角度打印,
- 打印的角度为累加角度,不会转一圈后清零。
1.3、代码说明
- 角度读取在TIM1更新中断中被调用,
- 更新中断的同时触发ADC,所以进入中断后ADC并未完成,此时读取角度,也是在等待ADC完成,
- ODrive的代码执行时间非常紧凑,所以不支持I2C接口的编码器,当然也就不支持AS5600(I2C接口的读取速度比较慢)。
- 官方代码中,读取数据使用了SPI收发DMA模式,我觉得SPI的速度已经很快,没有必要再用DMA,
- 官方代码中,SPI读取角度都是一个16bit指令完成(比如读取AS5047P的指令是0xFFFF)。所以移植后的代码不再支持TLE5012B编码器,TLE5012B的指令包含了收发切换和延时,效率较低。
- 官方代码支持多种SPI接口编码器,大部分型号在国内比价冷门,所以没有移植,
- 移植后的代码很容易添加 符合这些规则的编码器。
二、锁相环和插值算法
读取后的角度为原始数据,再在encoder_update() 中处理,数据处理包含了两部分:锁相环和插值,
2.1、锁相环
- 能百度到的关于锁相环的介绍,都是关于无线电通信的,本人上学的时候刚好还做过这个实验,所以我一直以为锁相环就是用于通信的。
- 用锁相环来滤波角度超出了我的想象,我也没找网上找到任何理论依据,国内电机论坛上也从没人讲过这事(至少我没看到过)。
- 我猜测它是用读出的角度做为目标值,估算值最终收敛于目标值。当读出角度有较大波动或者干扰时,估算值能够保证一定的平滑性,起到滤波的作用。
- 上图是ODrive中无感电机启动的锁相环,都是锁相环,原理应该差不多,就是一开始有误差,最终消除误差,实际值和估算值保持一致。
2.2、插值
- 插值算法一开始觉得很神奇,仔细看了代码后,发现是和偏置校准相关的一个处理角度的方法,
- 可以提前透漏下,在闭环速度控制的时候,把插值算法屏蔽了,电机转动的效果丝毫不受影响,
- 不知道这个算法什么时候起作用,也可能是我的测试不够多,但我已经没有兴趣了。
2.3、角度补偿
- 从发出读编码器指令,到获取角度再用于反Park变换,中间会有一段时间的延迟,而且同样的延迟时间,电机转速越高影响就越大,所以需要角度补偿。
- 我在调试SimpleFOC的时候就遇到了这一问题,SimpleFOC代码支持的最大转速基本只能到3000RPM,我曾通过增加补偿角的方法把转速提高到8000RPM(效果并不好,电机有咔咔的噪声)。补偿角不是固定值,而且随着转速提高逐渐增大。
- 有些公司把补偿角称之为:“进角”或者“攻角”。
- 国内一般的做法是通过事先测试获取不同转速时的补偿角,分段补偿或者设定系数根据速度线性补偿。
- 手动添加补偿角的方式有两个缺点:第一事先需要大量测试以得到最佳值,第二这种方法看起来不太灵活,毕竟电机转动时速度是有波动的,补偿角过于呆板。
- ODrive中就没有补偿角,我觉得要么是它的算法精确,很好的解决延迟问题;要么就是锁相环可以起到补偿的作用。
- 我尝试把锁相环部分给屏蔽了,测试高转速时的效果,以确定它是否有补偿效果,但是没有屏蔽成功,这个稍后再测试。
- 角度“ 锁相环” 在国内闻所未闻,我觉得是ODrive代码中最有价值的一项技术!
三、偏置校准
3.1、硬件接线
使用SPI接口,SPI读出角度为绝对值,更容易找到规律,
(以下内容待续)
3.2、官方代码操作
3.3、移植后的代码操作
3.4、代码说明
- 想要理解ODrive的偏置校准,建议先理解SimpleFOC的偏置校准。请看这篇教程:SimpleFOC移植STM32(四)—— 闭环控制,零点校准部分。
- SimpleFOC的偏置校准是用简单的方法实现简单的功能,
- ODrive的偏置校准是用复杂的方法实现简单的功能,当然也可能ODrive的适应性更好。
3.5、SimpleFOC的偏置校准对比