STM32的DAC加TIMER应用演示

发布者:pi26最新更新时间:2024-07-23 来源: elecfans关键字:STM32  DAC  TIMER 手机看文章 扫描二维码
随时随地手机看文章

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

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

图片

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

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

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

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

第一种方式: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);


关键字:STM32  DAC  TIMER 引用地址:STM32的DAC加TIMER应用演示

上一篇:STM32WB55_NUCLEO开发(4)----手机与STM32WB通过密钥配对
下一篇:stm32型号命名规则 stm32制作工艺多少nm

推荐阅读最新更新时间:2026-03-25 11:00

stm32 DMA+timer+DAC
是有延迟的:
[单片机]
<font color='red'>stm32</font> DMA+<font color='red'>timer</font>+<font color='red'>DAC</font>
stm32timer
[单片机]
<font color='red'>stm32</font>的<font color='red'>timer</font>
通过STM32 UART及DMA修改TIMER占空比示例
现在有人谈到这样一个需求,他使用STM32F429芯片做开发,其中用到TIM2做3路PWM输出。另外有个上位机跟STM32的UART接口相连,上位机可能不定期地需要通过UART接口给STM32发送新的占空比参数,而且每次都发送3个输出通道的比较参数。如何快捷地实现这个功能呢?要求收到数据后尽快修改3个比较通道的参数。 STM32F429的TIM2是32位定时器,3个通道的CCR寄存器也是32位的。那么上位机每次发3个通道的参数对应12字节的数据。 显然,整体上功能不算复杂。我们可以先通过UART收到12字节数据,稍加整理后手动将数据逐字写到3个CCR寄存器来改变PWM输出。说实在的,这个方案的实现过程还是很清晰的,相信也是
[单片机]
通过<font color='red'>STM32</font> UART及DMA修改<font color='red'>TIMER</font>占空比示例
STM32timer3产生PWM
一、简介 本文介绍STM32系列如何使用timer3的第3通道(PB0)产生38K频率的PWM。 二、实验平台 库版本:STM32F10x_StdPeriph_Lib_V3.5.0 编译软件:MDK4.53 硬件平台:STM32开发板(主芯片stm32f103c8t6) 仿真器:JLINK 三、版权声明 四、实验前提 1、在进行本文步骤前,请先阅读以下博文: 暂无 2、在进行本文步骤前,请先实现以下博文: 暂无 五、基础知识 暂无 六、实验步骤 1、编写并添加PWM驱动 1)编写驱动GUA_Timer3_PWM.c(存放在“……HARDWARE”) //*********
[单片机]
<font color='red'>STM32</font>之<font color='red'>timer</font>3产生PWM
STM32一个Timer输出4路不同频率、可调占空比的PWM
main.c /********************************************* 标题:操作USART的练习 软件平台:MDK-ARM Standard Version4.70 硬件平台:stm32f4-discovery 主频:168M Periph_Driver_version: V1.0.0 描述:用一个定时器(TIM3),实现四路不同频率、占空比可调的PWM 代码参考自STM32F4-Discovery_FW_V1.1.0\Project\Peripheral_Examples\TIM_TimeBase author:大舟
[单片机]
STM32 Timer1 TIM1 中断
/*定时器1ms中断,死等定时器延时*/ /*File Timer.c */ #include stm32f10x.h unsigned int TimeDelay = 0; void TIM1_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_DeInit(TIM1); /*复位TIM1定时器*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); /*开时钟*/ TIM_Tim
[单片机]
STM32一个Timer输出4路不同频率、可调占空比的PWM
main.c /********************************************* 标题:操作USART的练习 软件平台:MDK-ARM Standard Version4.70 硬件平台:stm32f4-discovery 主频:168M Periph_Driver_version: V1.0.0 描述:用一个定时器(TIM3),实现四路不同频率、占空比可调的PWM 代码参考自STM32F4-Discovery_FW_V1.1.0\Project\Peripheral_Examples\TIM_TimeBase author:大舟 data:2013-04-13
[单片机]
STM32系列DAC的介绍与使用
前言 最近是因为有一个项目需要输出 0~10V 的信号量,而且 想着应该可以直接使用 STM32 的 DAC 来做,虽然不一定实际使用,但是也就来试试看吧。 说句实话,博主自己做的产品,不常用 DAC,所以 本文我们就来好好复习下 STM32 的 DAC ,从应用角度讲讲如何快速使用起来。 我是矜辰所致,全网同名,尽量用心写好每一系列文章,不浮夸,不将就,认真对待学知识的我们,矜辰所致,金石为开! 一、STM32 带 DAC 的系列 目前博主产品使用的芯片为 STM32L051C8 系列,本来还想着直接CubeMX 设置一下,直接测试,才发现这个片片根本没有 DAC = =! 好吧,尴尬,后来查了下 L 系列确实都没有 D
[单片机]
<font color='red'>STM32</font>系列<font color='red'>DAC</font>的介绍与使用
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved