ODrive移植keil(七)—— 插值算法和偏置校准

目录

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的偏置校准对比

相关推荐
青牛科技-Allen3 小时前
GC3910S:一款高性能双通道直流电机驱动芯片
stm32·单片机·嵌入式硬件·机器人·医疗器械·水泵、
白鱼不小白5 小时前
stm32 USART串口协议与外设(程序)——江协教程踩坑经验分享
stm32·单片机·嵌入式硬件
S,D5 小时前
MCU引脚的漏电流、灌电流、拉电流区别是什么
驱动开发·stm32·单片机·嵌入式硬件·mcu·物联网·硬件工程
嘿·嘘9 小时前
第七章 STM32内部FLASH读写
stm32·单片机·嵌入式硬件
Meraki.Zhang9 小时前
【STM32实践篇】:I2C驱动编写
stm32·单片机·iic·驱动·i2c
良许Linux17 小时前
32岁入行STM32迟吗?
stm32·单片机·嵌入式硬件
m0_4666077017 小时前
【STM32CubeMX】ST官网MCU固件库下载及安装
stm32·单片机·嵌入式硬件
Wallace Zhang21 小时前
STM32F103_Bootloader程序开发11 - 实现 App 安全跳转至 Bootloader
stm32·嵌入式硬件·安全
GodKK老神灭21 小时前
STM32 CCR寄存器
stm32·单片机·嵌入式硬件
懒惰的bit10 天前
STM32F103C8T6 学习笔记摘要(四)
笔记·stm32·学习