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




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

    说明

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

    一、PWM

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

    1.1、基本配置

    在这里插入图片描述


    上图配置的PWM波形如下图:
    在这里插入图片描述

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

    1.2、观察中断

    在中断函数中设置一个脉冲,由GPIO8输出,下图:
    在这里插入图片描述
    在这里插入图片描述

    1.3、电流变换频率

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

    在这里插入图片描述

    在这里插入图片描述

    1.4、校准频率

    8KH在,下图:

    在这里插入图片描述

    在这里插入图片描述



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

    1.5、control_loop_cb()

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

    在这里插入图片描述

    本次移植,没有使用软件中断,用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更新触发的方式解决了。
    在这里插入图片描述

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

    2.2、规则组转换

    ADC1规则组移植时只转换了这4个通道,下图:
    在这里插入图片描述
    假如电源电压12V,经过分压后是0.64V,对应的AD值是794(0x31A),
    在这里插入图片描述

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

    2.3、注入组转换

    ADC1的注入组采样电源电压,
    ADC2的注入组采样M0的B相,
    ADC3的注入组采样M0的C相,
    刚上电时,或者下臂MOS关闭时,Vo的理论输出值=1.65V,
    在这里插入图片描述

    2.4、观察AD转换值

    发送指令“A”,读取ADC1规则组 四个通道的转换结果,
    发送指令“B”,读取注入组 三个通道的转换结果,下图:
    在这里插入图片描述




    驱动板购买链接:https://item.taobao.com/item.htm?ft=t&id=644329838237,图锐科技
    电机 购买链接:https://item.taobao.com/item.htm?ft=t&id=643573104607,图锐科技



    欢迎加入技术交流群:923734429 (入群申请写:CSDN)


    (完)

  • 相关阅读:
    排序算法:堆排序
    文盘Rust -- 配置文件解析
    使用 Kitten 开发一款趣味成语接龙游戏
    179.Hive(一):hive的基础概念,hive的安装和启动
    (1)paddle---在anaconda中安装paddle环境
    Linux C 的多文件编译
    农业四情监测系统:科技助力农业智慧化
    嘴蠢到爆表的代码:我不是写代码,我是写笑话
    记录--Vue中前端导出word文件
    基于 MinIO 部署单实例 Databend | 新手篇(1)
  • 原文地址:https://blog.csdn.net/loop222/article/details/132908466