ODrive移植keil(四)—— PWM触发ADC采样

目录

  • 说明
  • 一、PWM
    • 1.1、基本配置
    • 1.2、观察中断
    • 1.3、电流变换频率
    • 1.4、校准频率
    • 1.5、control_loop_cb()
  • 二、ADC采样
    • 2.1、AD值错位问题
    • 2.2、规则组转换
    • 2.3、注入组转换
    • 2.4、观察AD转换值


ODrive、VESC和SimpleFOC 教程链接汇总:请点击

说明

电机驱动器中,通过PWM触发ADC,保证在下臂MOS打开的时候采样电流,这本是个难度极高的技术活。随着各芯片厂家的技术迭代,现在几乎所有单片机都有这个功能,可以说已经烂大街了。即便如此,在具体的电机驱动器程序中,PWM触发ADC采样仍然很容易出问题,主要是配置复杂。

一、PWM

  • 官方代码中,高级定时器TIM1和TIM8分别输出互补PWM信号,驱动两路电机,本次移植,只移植了M0,所以我们只讲TIM1的配置。
  • 电流采样,需要事先校准,一般在上电初始化的时候。
  • ODrive的校准就与众不同,它设置在了下臂PWM为低电平(MOS关闭)时。

1.1、基本配置

ODrive移植keil(四)—— PWM触发ADC采样_第1张图片


上图配置的PWM波形如下图:
ODrive移植keil(四)—— PWM触发ADC采样_第2张图片

上面的配置,
1、PWM频率是24KHz,
2、更新中断频率是48KHz,但是RepetitionCounter = 2,所以进入更新中断的频率是48/(1+2)=16KHz,

1.2、观察中断

在中断函数中设置一个脉冲,由GPIO8输出,下图:
ODrive移植keil(四)—— PWM触发ADC采样_第3张图片
ODrive移植keil(四)—— PWM触发ADC采样_第4张图片

1.3、电流变换频率

进入中断,其中一半的次数是电流变换,另一半的次数是校准,所以电流变换频率是8KHz,下图:

ODrive移植keil(四)—— PWM触发ADC采样_第5张图片

ODrive移植keil(四)—— PWM触发ADC采样_第6张图片

1.4、校准频率

8KH在,下图:

ODrive移植keil(四)—— PWM触发ADC采样_第7张图片

ODrive移植keil(四)—— PWM触发ADC采样_第8张图片



TIM_CounterMode_CenterAligned3,TIM_OCMode_PWM2,有没有想过为什么会这样配置,
正常我们会使用 TIM_CounterMode_CenterAligned1,TIM_OCMode_PWM1,但是这样的配置会在下臂关闭的时候更新中断,
而CenterAligned3/PWM2的配置刚好可以在下臂打开的时候更新中断,
通过这个地方,可以想象最初的ODrive很可能在更新中断中只做电流变换,没有校准,不是现在的样子。

1.5、control_loop_cb()

官方代码中,进入电流变换所属的中断后触发软件中断,然后在软件中断中执行大部分功能,下图:

ODrive移植keil(四)—— PWM触发ADC采样_第9张图片

本次移植,没有使用软件中断,用control_loop_cb()函数 代替软件中断后执行的函数,
当前例程不涉及到这部分,所以不再细说。

二、ADC采样

ODrive同时使用了ADC1/ADC2/ADC3,
在官方代码中:
ADC1的规则组采样ADC0----ADC16,上电初始化时软件触发后一直DMA后台转换,
ADC1的注入组采样电源电压,由TIM1更新触发
ADC2的规则组采样M1的B相,由TIM8更新触发
ADC2的注入组采样M0的B相,由TIM1更新触发
ADC3的规则组采样M1的C相,由TIM8更新触发
ADC3的注入组采样M0的C相,由TIM1更新触发

2.1、AD值错位问题

ADC1多通道规则转换时,如果使用DMA方式,经常会发生AD值错位的现象,比如第一个AD值的高字节放入的是低字节的数据,而低字节是第二个AD值的高字节数据,以此类推,转换值全部失效。

《SimpleFOC移植STM32F405RGT6》的时候,ADC_SoftwareStartConv 方式会发生了AD值错位现象,用DMA中断的方式解决了。

这次移植和上次一样的方法,但又发生了错位。最终用TIM2更新触发的方式解决了。
ODrive移植keil(四)—— PWM触发ADC采样_第10张图片

- ADC以DMA的方式转换,代码单独执行这个操作是没问题,但在初始化阶段随着片内外设配置的增加,或者代码执行顺序的变换,就会发生错位。这个问题十年前我就遇到了,当时只是很不解,见得多了也就习惯了。网上找到过很多解释错位原因以及改正办法,但从来都没有彻底解决过这个问题,此次移植又遇到了这个问题,曾经的解决办法测试一遍后都失效了,最后发现用TIM2更新触发的方式不再错位。 - 看ODrive官方代码,就是用最基本的上电后软件触发转换,这正是我想要的方案,但是无论我怎么调整配置都会错位。我觉得老外肯定知道这个问题,并且也知道怎么避免这个问题。 - 如果单片机是我们国产的,直接问厂家,是不是就很容易解决了。

2.2、规则组转换

ADC1规则组移植时只转换了这4个通道,下图:
在这里插入图片描述
假如电源电压12V,经过分压后是0.64V,对应的AD值是794(0x31A),
ODrive移植keil(四)—— PWM触发ADC采样_第11张图片

ADC1的注入组也转换电源电压,此处主要验证ADC1规则组的转换值。

2.3、注入组转换

ADC1的注入组采样电源电压,
ADC2的注入组采样M0的B相,
ADC3的注入组采样M0的C相,
刚上电时,或者下臂MOS关闭时,Vo的理论输出值=1.65V,
ODrive移植keil(四)—— PWM触发ADC采样_第12张图片

2.4、观察AD转换值

发送指令“A”,读取ADC1规则组 四个通道的转换结果,
发送指令“B”,读取注入组 三个通道的转换结果,下图:
ODrive移植keil(四)—— PWM触发ADC采样_第13张图片





(完)



你可能感兴趣的:(ODrive,ODrive,stm32,电机驱动器)