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

 

 

 

 

 

 

 

 

 

相关推荐
Zw-awa7 小时前
先让程序开口说话:为什么把人机交互放在最前面
stm32
Zw-awa7 小时前
把按键和 LED 状态显示出来:第一次看见程序到底在干什么
stm32
Zw-awa7 小时前
面包板接线为什么这样接:从模块需求到芯片资源分配
stm32
小程序设计8 小时前
基于STM32的办公室智能空气净化系统设计
stm32·单片机
Zw-awa8 小时前
用 OLED 给 STM32 做实时调试面板
stm32
Zw-awa8 小时前
按键为什么会乱跳:一次按下为什么变成很多次
stm32
XiHongShi20166 天前
STM32F407 RTC定时器例程,建议保存
stm32·单片机·学习
优信电子6 天前
AIT1001 非接触式红外测温模块 STM32 驱动开发实战:从引脚到代码全解析
stm32·嵌入式·温度传感器·红外测温·非接触式测温·ait1001
深圳老胡6 天前
STM32F407 控制 L6470 步进电机驱动 —— 控制过程简介
笔记·stm32·单片机·嵌入式硬件·代码规范
wuyk5556 天前
《WiFi 嵌入式物联网开发全套实战》| 第 16 章 ESP32 AP+STA 双模共存原理与工程坑点
网络·stm32·物联网