首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

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

  • 23-09-28 04:01
  • 4593
  • 11127
blog.csdn.net

目录

  • 说明
  • 一、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、基本配置

在这里插入图片描述

 
上图配置的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”,读取注入组 三个通道的转换结果,下图:
在这里插入图片描述

 
 
 
 
(完)
 
 
 
 

注:本文转载自blog.csdn.net的loop222的文章"https://blog.csdn.net/loop222/article/details/132908466"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top