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

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

3天内不再提示

STM32的DAC加TIMER应用演示

麦辣鸡腿堡 来源:茶话MCU 作者:茶话MCU 2023-07-17 10:27 次阅读

现在有如下图所示的这样一个需求,希望使用STM32芯片来实现。

横轴表示时间,纵轴表示电压【3.3v为限】,不同时刻的电压输出不一样、持续时间也不尽相同。

图片

此问题源于某高校STM32学习时的习题,这里拿出来一起交流探讨下。方法不是唯一的,尤其基于不同STM32系列。这里尽量使用通用、常规的方法,算是抛砖引玉。

显然,我们可以考虑使用STM32的DACTIMER以及片内其它资源加以实现。

对于这个实现我们可以分两种方式完成,每一种方式同时也体现不同难度。

我们可以考虑下面两种应用情形:

第一种方式:MCU除了做这一件事外,还做点别的,比方做按键响应、ADC采样这些,整体上没有太复杂的功能和要求。【中断方式】

第二种方式:MCU的主要工作是别的而不再是这个输出了,要求该输出自启动后不再需要CPU的参与,即由相应外设自行完成。【DMA方式】

对于第一种实现方式,我们可以用个TIMER作为时基,每到适当的计时点就通过TIMER中断及时修改DAC的输出值而改变输出电压。至于对DAC输出寄存器赋值,可以直接在定时器中断里操作,也可以先在定时器中断里设置标志位后在主循环里实现修改,可以灵活决定。显然,这样操作也不会影响其它按键处理、ADC处理等。该方式的实现就介绍到这里,重点聊聊第二种方式。

对于第二种方式,显然不能使用中断,这里就得DMA出场了。因为人家要求该输出自启动后不再让CPU参与。这里有两个量都是变的,DAC的输出值在变,不同DAC输出所持续的时间也在变。这两个变量都需要DMA帮忙完成,显然DAC的输出需要使用TIMER事件来触发DMA,这里使用更新事件比较合理。那么,TIMER自身的数据更新又如何实现呢?我们可以考虑使用TIMER的比较事件来触发另外的DMA请求以更新自己。

下面我使用STM32F4系列芯片的TIM1及DAC来实现第二种需求。【当然,使用STM32其它系列,比如G4,H5,H7,U5等都可以】

TIM1的更新事件触发DMA,修改DAC的输出寄存器的值以改变输出。另外,选择TIM1通道1的比较事件触发DMA【哪个通道比较事件不重要,能触发DMA即可】,使用TIMER DMA Burst传输同时修改TIM1的ARR,RCR,CCR1三个寄存器的值,此处RCR始终用0值。因为这里要修改CCR1的值,RCR夹在ARR和CCR1寄存器中间,做Burst传输时RCR必须每次被使用。【这里CCR1的值其实也可以固定不变。我是每次取ARR的中间值作为CCR1的值,不是必须的。主要是考虑到有些应用场合可能需要动态修改CCR值,在此特意拓展下TIMER Burst传输的应用介绍。】

下面是关于TIM1时基参数的初始配置,其中ARR和CCR1值我是随便设定的,算是个过渡值,目的就是产生更新事件和比较事件,之后都会按照代码中预定的数据运行。

图片

下面是有关TIM1的基于更新事件和通道1比较事件的DMA配置。

图片

下面截图是关于DAC的CubeMx配置,比较简单,开启其输出功能即可。

图片

下面截图里的数组DacOutData[10]存放不同时刻DAC输出所对应的数据。数组PulseData3[30]存放10次DMA Burst 传输用到的数据。显然这两个数组数据在使用时间上要匹配,否则输出波形对不了。

图片

下面是具体的用户代码,使用CubeMx进行配置和STM32 HAL库函数,以源码形式放在下面,供有需要的参考、使用。

HAL_DMA_Start_IT(&hdma_tim1_up, (uint32_t) DacOutData, 
 (uint32_t)&hdac.Instance- >DHR12R1, 10);


  __HAL_TIM_CLEAR_FLAG(&htim1,TIM_FLAG_UPDATE);
  __HAL_TIM_CLEAR_FLAG(&htim1,TIM_DMA_CC1);


  HAL_TIM_DMABurst_MultiWriteStart(&htim1, TIM_DMABASE_ARR, 
  TIM_DMA_CC1,(uint32_t *)PulseData3,   
  TIM_DMABURSTLENGTH_3TRANSFERS,10*3);


  __HAL_TIM_ENABLE_DMA(&htim1, TIM_DMA_UPDATE);


  HAL_DAC_Start(&hdac,  DAC_CHANNEL_1);


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

    关注

    146

    文章

    17186

    浏览量

    351751
  • dac
    dac
    +关注

    关注

    43

    文章

    2300

    浏览量

    191232
  • STM32
    +关注

    关注

    2270

    文章

    10910

    浏览量

    356629
收藏 人收藏

    评论

    相关推荐

    STM32 TIMER+DMA输出PWM异常案例的问题解析

    有人使用STM32U575的TIMER加上DMA做PWM输出。具体就是利用某TIMER的一个通道的比较事件触发DMA,通过DMA修改CCR值来实现指定占空比的PWM输出。
    的头像 发表于 09-28 09:04 8343次阅读
    <b class='flag-5'>STM32</b> <b class='flag-5'>TIMER</b>+DMA输出PWM异常案例的问题解析

    DAC输出在高阻抗模式中被电的问题分析

    该篇将分析对象限定为一个DAC,其中的输出缓冲器在正常模式下被电:零量程或中量程。文章将分析一下DAC输出在高阻抗模式中被电的情况。同时提出一个针对
    的头像 发表于 10-23 15:11 5135次阅读
    <b class='flag-5'>DAC</b>输出在高阻抗模式中被<b class='flag-5'>加</b>电的问题分析

    STM32 系列 DAC的介绍与使用

    本文我们就来好好复习下 STM32DAC ,从应用角度讲讲如何快速使用起来。
    的头像 发表于 05-29 09:59 5137次阅读
    <b class='flag-5'>STM32</b> 系列 <b class='flag-5'>DAC</b>的介绍与使用

    CubeMX配置stm32DAC

    我们使用 STM32CubeMX 软件进行配置。DAC 的配置是相对很简单的,如下图所示。
    的头像 发表于 06-12 09:18 3102次阅读
    CubeMX配置<b class='flag-5'>stm32</b>的<b class='flag-5'>DAC</b>

    STM32 DAC+TIMER+DMA应用演示

    现在有如下图所示的这样一个需求,希望使用STM32芯片来实现。
    发表于 07-12 09:21 1680次阅读
    <b class='flag-5'>STM32</b> <b class='flag-5'>DAC+TIMER</b>+DMA应用<b class='flag-5'>演示</b>

    STM32系列 DAC 的基本使用

    前言 一、STM32DAC 的系列 二、DAC 基础简介 2.1 DAC输出引脚 2.2 引脚配置 2.3 DAC输出电压计算方法 三
    的头像 发表于 09-11 15:21 2805次阅读
    <b class='flag-5'>STM32</b>系列 <b class='flag-5'>DAC</b> 的基本使用

    STM32U5系列TIMER+DMA+DAC应用演示

    有人使用STM32U575芯片的DAC功能。他希望使用TIMER事件触发DMA,并通过DMA传输内存数据到DAC输出寄存器,进而产生相应的DAC
    的头像 发表于 01-24 09:10 1958次阅读
    <b class='flag-5'>STM32</b>U5系列<b class='flag-5'>TIMER+DMA+DAC</b>应用<b class='flag-5'>演示</b>

    STM32_ DAC输出电压

    STM32_DAC输出电压
    的头像 发表于 04-08 10:05 1.1w次阅读
    <b class='flag-5'>STM32</b>_ <b class='flag-5'>DAC</b>输出电压

    2021-06-05 GD32F405VG 调试过程关于DAC/DMA/TIMER等问题的解决

    GD32F405VG 调试过程关于DAC/DMA/TIMER等问题的解决GD32F405与STM32F405外设完全兼容,外设的地址映射也是完全兼容。ST的标准库中的名字与GD32的外设名字不一致
    发表于 12-03 09:06 13次下载
    2021-06-05 GD32F405VG 调试过程关于<b class='flag-5'>DAC</b>/DMA/<b class='flag-5'>TIMER</b>等问题的解决

    [笔记]|[stm32]|[寄存器存储器区别]|[PWM]|[串口]|[Timer]stm32f103笔记

    [笔记]|[stm32]|[寄存器存储器区别]|[PWM]|[串口]|[Timer]stm32f103笔记此笔记为18.12.21笔者期末复习所写 ——仅作为自己期末复习以及过后查阅的资料文章目
    发表于 12-06 18:51 10次下载
    [笔记]|[<b class='flag-5'>stm32</b>]|[寄存器存储器区别]|[PWM]|[串口]|[<b class='flag-5'>Timer</b>]<b class='flag-5'>stm32</b>f103笔记

    STM32 DAC的配置与使用

    STM32DAC 模块(数字/模拟转换模块)是 12 位数字输入,电压输出型的DAC
    发表于 02-08 16:30 28次下载
    <b class='flag-5'>STM32</b> <b class='flag-5'>DAC</b>的配置与使用

    STM32 系列DAC的基本使用

    一、STM32DAC 的系列 目前博主产品使用的芯片为 STM32L051C8 系列,本来还想着直接CubeMX 设置一下,直接测试,才发现这个片片根本没有 DAC = =! 好
    的头像 发表于 06-22 10:48 2446次阅读
    <b class='flag-5'>STM32</b> 系列<b class='flag-5'>DAC</b>的基本使用

    STM32 DAC+TIMER+DMA的实现

    ,这里拿出来一起交流探讨下。方法不是唯一的,尤其基于不同STM32系列。这里尽量使用通用、常规的方法,算是抛砖引玉。 显然,我们可以考虑使用STM32DAC
    的头像 发表于 07-13 10:29 1629次阅读
    <b class='flag-5'>STM32</b> <b class='flag-5'>DAC+TIMER</b>+DMA的实现

    STM32L4定时器(TIMER)介绍

    电子发烧友网站提供《STM32L4定时器(TIMER)介绍.pdf》资料免费下载
    发表于 08-01 14:24 0次下载
    <b class='flag-5'>STM32</b>L4定时器(<b class='flag-5'>TIMER</b>)介绍

    STM32G4 Advanced Timer Break功能详解

    电子发烧友网站提供《STM32G4 Advanced Timer Break功能详解.pdf》资料免费下载
    发表于 09-19 15:09 1次下载
    <b class='flag-5'>STM32</b>G4 Advanced <b class='flag-5'>Timer</b> Break功能详解