0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

应用笔记(三)| 运用DMA 功能实现高级定时器和ADC 的同步触发采样

武汉芯源半导体有限公司 2022-08-03 10:09 次阅读


前言

在做 BLDC 电机控制时,需要 ADC 的采样时刻和定时器产生的 PWM 波形相配合,才能获取准确的采样值, 本文介绍了 CW32F030 系列芯片通过运用 DMA 功能实现高级定时器和 ADC 的同步触发采样的功能。

▇PWM 输出实现

1.1 输出端口的配置

根据 GPIO 复用功能分配表(完整表格请参阅 CW32F030 用户手册中表 9-2 GPIO 复用功能分配表),选取期 望输出互补 PWM 波形的引脚,如本例中 PA8、PA9、PA10、PB13、PB14、PB15,如下表所示:

▼ GPIO 复用功能分配表

poYBAGLH8pCAa8hnAAITz5bwEAw203.png

PA8 和 PB13 组成一对互补输出通道 CH1,PA9 和 PB14 组成一对互补输出通道 CH2,PA10 和 PB15 组成一 对互补输出 CH3。

步骤如下:

1. 将相关的 GPIO 设置为输出;

2. 将 GPIO 配置为 ATIM 的比较输出复用功能。

代码如下:

poYBAGLH8peANMwFAAH-kcB7Yac843.jpgpoYBAGLH8paAYVuGAAFzlRiairQ143.jpg

1.2 ATIM 的配置

ATIM 包含一个 16 位的计数器 / 定时器和 7 个比较单元。7 个比较单元中,有六个具有捕获功能,并且这 6 个捕获 / 比较单元可以成对使用,组成互补输出的功能。

本文以产生一个驱动 BLDC 电机所需的 20kHz 的三路互补输出的 PWM 波形为例,选取 ATIM 的时基信号为 PCLK。

本例中 PCLK 为 64MHz,并通过 ATIM 的预分频器进行 16 分频后,以 4MHz 频率进行计数。

为方便设定 ADC 的采样时间,ATIM 采用中央对齐模式计数,设置 ATIM 的自动重载寄存器(ARR)为 100, 则 ATIM 的将先从 0 累加至 99,再从 100 递减至 1,故计数周期为 2 倍的 ARR 寄存器的值,即 PWM 的频率 为 20kHz。

通过设置 ATIM 的控制寄存器(CR)的 COMP 位为 1,使得 PWM 以互补的方式输出,CH1A 和 CH1B 的脉宽 由通道 1比较 /捕获寄存器 A(CH1CCRA)决定,CH1B的输出脉宽不再由通道 1比较 /捕获寄存器 B(CH1CCRB) 决定,CH1CCRB 仍可用于设定 CH1B 比较匹配的值。CH2A 和 CH2B,CH3A 和 CH3B 与之类似。

在设置输出 PWM 互补输出时,可以对互补通道加入死区时间,由死区时间寄存器(DTR)控制。

ATIM 配置输出 3 对互补带死区的 PWM 波形,详细配置代码如下:

pYYBAGLH8paAeIqyAAWa4osRGKU706.jpg

pYYBAGLH8paAVPS2AAJGDHN-JQg656.jpgpoYBAGLH8paAODqQAAJJLuXceZQ777.jpg

▼ 产生的 PWM 波形如下:

pYYBAGLH8paAeKq3AACw75bb_hc950.jpg

1.3 ADC 的配置

1.3.1 序列采样

当需求的采样通道小于等于 4 路时,可以通过 ADC 的序列采样模式实现,并且可以通过 ATIM 的通道 1~3 比 较 / 捕获寄存器 B 中任意一个寄存器设定 ADC 的采样时刻,这些操作都可以由硬件自动完成,减轻了 CPU 的工作量。

以采样 AIN0~AIN3 这 4 路输入为例,设定采样时刻为 ATIM 计数达到 ARR 时,其参考代码如下:

poYBAGLH8paAOByfAAT7R9TK3iE555.jpgpYYBAGLH8paAdhe6AAGxvncQTnQ916.jpg

上述方法完全由硬件实现,不需要 CPU 和中断的参与,执行效率非常高,不足的地方是采样通道限制为 4 路。

1.3.2DMA 扩展采样

如果需要对超过 4 路的模拟量进行采样,则需要结合 DMA 的功能,以实现较少的 CPU 参与。其思路如下:

1. ADC 配置为单通道单次转换,完成转换后硬件触发 DMA;

2. DMA 的 CH1 用于将 ADC 的转换结果传输到 RAM 中,本例中将采样 6 个 ADC 通道,因此传输次数 CNT 为 6,源地址固定为 ADC 的 RESULT0 寄存器,目的地址需要递增;

3. DMA 的 CH2 用于更改 ADC 的采样通道,当 ADC 转换完成后,从 RAM 中取 ADC 的通道配置参数,自 动配置 ADC 的寄存器值,因此源地址为 RAM,地址递增,目的地址为 ADC 的通道控制寄存器;

4. DMA 的 CH3 用于再次启动 ADC,因为 ADC 配置为单次转换,当转换完成后,ADC 自动停止转换,所 以需要通过 DMA 向 ADC 的转换启动寄存器置位,以再次启动 ADC 转换;

5. DMA 的 CH1 传输完成后,ADC 的 6 路转换也完成了,并且转换结果也被传输到 RAM,可通过 CH1 的 传输完成中断,将 DMA 的参数重新配置,就实现了多路 ADC 的循环采样;

6. 通过 ATIM 的比较通道 4,去触发 DMA 的 CH4,向 ADC 的转换启动寄存器置位,启动 ADC。

其参考代码如下:

• ADC 的配置:

pYYBAGLH8paARtQRAAMcK9hJb6Y016.jpg

ADC 配置为单次单通道采样,采样完成后可触发 DMA。

• DMA 的配置:

pYYBAGLH8paAJikiAAYOoHUrzqs126.jpgpoYBAGLH8paAD5xOAARHvCmLtSc418.jpg

• ATIM 需要在之前的配置上增加通道 4 的设置,增加的代码如下:

poYBAGLH8paATj-SAAQDVbmzYBA751.jpgpYYBAGLH8paAB7oDAADKtq7nGRA067.jpg

这种方法可以实现多于 4个模拟通道的采样,采样结果自动保存在内存中,并且仅在最后一个通道采样完成后, 进入一次中断服务程序对 DMA 的配置进行复位,所以 CPU 的开销是比较小的,而且可以通过 ATIM 的比较 通道 4 灵活设置采样时机。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 微控制器
    +关注

    关注

    48

    文章

    6893

    浏览量

    148657
  • 单片机
    +关注

    关注

    6011

    文章

    44153

    浏览量

    624301
  • mcu
    mcu
    +关注

    关注

    146

    文章

    16210

    浏览量

    345458
收藏 人收藏

    评论

    相关推荐

    关于定时器触发ADC连续采样dma传输的疑问求解?

    实现功能,但我未找到相关的API,没找到关于adc这方面的函数。所以想问一下是否有定时器触发ADC
    发表于 06-14 07:25

    CW32使用DMA单通道、定时器触发ADC实现了多路AD采集

    本测试样例基于CW32F030C8T6MCU,使用DMA单通道、定时器触发ADC实现了12路AD采集。
    的头像 发表于 05-24 09:29 449次阅读
    CW32使用<b class='flag-5'>DMA</b>单通道、<b class='flag-5'>定时器</b><b class='flag-5'>触发</b><b class='flag-5'>ADC</b><b class='flag-5'>实现</b>了多路AD采集

    STM32L151定时器上升沿触发ADC采样,为什么每个PWM周期内会触发第二次采样

    : ADC采样完成DMA中断函数-连续反转GPIO输出的波形 配置如下: 定时器4:产生两路PWM信号驱动负载,同时将输出触发设置为 Up
    发表于 05-24 07:37

    芯海CS32F0XXTIMER外设模块应用笔记

    用户示例做了工作原理与相关代码介绍,以方便用户快速移 本应用笔记分为四部分: ●定时器特性概述 。基本定时器功能介绍 高级
    发表于 05-16 15:02

    芯海科技应用笔记:CS32F0XX TIMER外设模块指导

    绍的特定用户示例做了工作原理与相关代码介绍, 以方便用户快速移。本应用笔记分为四部分:定时器特性概述、基本定时器功能介绍、高级
    发表于 05-16 10:52

    芯海应用笔记:CS32F0XX ADC外设模块指导

    本应用笔记旨在展示使用 CS32F0xx 微控,提高 A/D 转化精度的应用。帮助 ADC 模块用户了解CS32 微控提供的一些高级应用
    发表于 05-16 10:49

    STM32F0R8T6定时器预分频配置影响AD采样值,为什么?

    _ConvertedValue;//ADC转换值 void ADC_Config(void) { } int main(void) { TIM_TimeBaseInitTypeDef a;//定时器配置结构体
    发表于 05-15 07:28

    信号通过ADC DMA DAC进行转换,非空状态下触发定时器中断进行延时,中断结束还会继续DMA转换吗?

    信号通过ADC DMA DAC进行转换,其中需要延时 我的想法是 把ADC数据存入FIFO,然后根据DMA_GetFIFOStatus()函数判断FIFO状态,非空状态下
    发表于 04-03 08:06

    请问如何使用定时器的更新事件触发DMA读取6字节SPI数据?

    想用定时器的更新事件触发DMA读取SPI数据,现在有个问题是一次更新事件只能触发一次DMA传输,我想要
    发表于 03-29 06:16

    STM32G030定时器16 17和1同步输出如何实现

    STM32G030系列中只有定时器1 16和17定时器可以输出带死区时间互补pwm,我想实现其中两个或者3个同步输出,请问如何
    发表于 03-27 06:45

    STM32定时器触发ADC采样+DMA中断数据转运,配置PWM的死区会影响进入DMA中断的原因?

    ; TIM_BDTRConfig(TIM1, TIM_BDTRInitStructure); 这是我的死区配置,发现配置死区后ADC触发采样,却只进入两次
    发表于 03-22 08:17

    STM32L0使用定时器上升沿触发ADC采样时,采样频率如何确定?

    我想问一下,在使用定时器上升沿触发ADC采样时,采样频率如何确定,是定时器频率就等于
    发表于 03-20 06:37

    STM32L0采用tim6上升沿触发使ADC采样,把定时器频率配为4K后,采样周期不对,为什么?

    目前使用的是STM32L0系列芯片,采用tim6上升沿触发使ADC采样,但把定时器频率配为4K后,采样周期不对,首先想问tim6的时钟源来自
    发表于 03-20 06:18

    定时器触发3路ADC同时采样指定次数

    定时器触发3路ADC同时采样指定次数控制3路ADC相等时间间隔,采样N次。
    发表于 10-19 08:30

    运用DMA功能实现高级定时器ADC同步触发采样

    ATIM 包含一个 16 位的计数 / 定时器和 7 个比较单元。7 个比较单元中,有六个具有捕获功能,并且这 6个捕获 / 比较单元可以成对使用,组成互补输出的功能。 本文以产生一
    发表于 09-15 06:09