定时器(PWM输出)触发ADC采样(DMA)——STM32CubeMX

这篇具有很好参考价值的文章主要介绍了定时器(PWM输出)触发ADC采样(DMA)——STM32CubeMX。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、(单通道)使用定时器触发的ADC单通道转换

我用的单片机是STM32F103CBTX

  • 定时器:使用PWM输出的模式
  • ADC:使用DMA的模式(在不使用DMA的情况下,定时器控制ADC进行数据采集只能是单通道!如果开启了多通道,读取到的ADC采集值只会是最后一个通道的值!所以,要想使用定时器控制ADC采集多通道必须使用DMA!)

定时器中cubemx配置:

 看STM32F103数据手册可以知道定时器TIM1是挂在APB1总线上

怎么用定时器采样,stm32,嵌入式硬件,单片机

我使用的是TIM1的通道2的上升沿(即PWM输出)触发ADC采样 

怎么用定时器采样,stm32,嵌入式硬件,单片机

PWM模式1和模式2区别:

以下是使用逻辑分析仪观察到的PWM输出情况

怎么用定时器采样,stm32,嵌入式硬件,单片机

怎么用定时器采样,stm32,嵌入式硬件,单片机

ADC中cubemx配置: 

注意:此时不再需要ADC进行转换,把连续转换模式设为关闭!!!

(我自己踩的坑,我试过开启的时候程序死掉了)

怎么用定时器采样,stm32,嵌入式硬件,单片机

DMA模式选择: 

Circular模式:

就是ADC连续采样的意思,也就是HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC_Value, 4)这句代码在程序中开启一次即可,不需要每次都重新打开。

Normal模式:

HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC_Value, 4)执行完一次之后,如果想进行下一轮ADC采样,必须要重新开启,所以每一轮采样都要用一次这句代码,采样一次开启一次采样一次开启一次。

参考别人的试了用了Circular模式,完全没问题,可以成功测出电压值。

我自己也试了Normal模式,不行,只能测一次,后面没反应了。

怎么用定时器采样,stm32,嵌入式硬件,单片机

 代码:

uint8_t AdcConvEnd=0;

int main()
{
  uint16_t ADC_Value[4]= 0;

  HAL_TIM_Base_Start(&htim1);
  HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);

  HAL_ADCEx_Calibration_Start(&hadc1);//自动校准
  HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC_Value, 4);


  while(1)
  {
      if(AdcConvEnd)
      {
          uint16_t averageValue = 0;
          for(int i = 0; i < 4; i++)
          {
              averageValue += ADC_Value[i];
              printf("ADC_Value[%d]:%.3f\r\n",i,(float)ADC_Value[i]*3.3f/4096);
          }
          AdcConvEnd=0;

          averageValue/=4;
          printf("averageValue:%d\r\n",averageValue);
      }
}

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
    if(hadc==&hadc1)
    {
        AdcConvEnd=1;
    }
}

结果:

怎么用定时器采样,stm32,嵌入式硬件,单片机

二、(双通道)使用定时器触发的ADC双通道转换 

注意:因为我们设置的是 2 个通道的采集,所以应该使能 ADC 的扫描模式,另一方面,我们采用的是 TIM 产生 pwm 触发 adc 进行采集,所以要禁止 ADC 的连续转换模式,这就是两个需要注意的地方。

ADC中cubemx配置: 

怎么用定时器采样,stm32,嵌入式硬件,单片机

三、关于PWM的频率或周期的计算

怎么用定时器采样,stm32,嵌入式硬件,单片机

*注 :* ARR和PSC都是16位的寄存器, 数值一定要在0~65535这个范围。

当我们设置了当前机器设置的是 72MHZ和 72分频,定时器输入时钟频率是72MHz / 72 = 1MHz:

  • 1MHZ ,即1秒计数 1M 次=1000000 次(1s产生1000000个脉冲方波)。
  • 1MHZ ,也就是1us产生1个脉冲方波。

若重装载值 (Period 或 ARR)设置为 500。也就是0.1us*500=500us,对于当前 PWM 周期为 500us,也就是500us发生一次中断。

当重装载值(Period 或 ARR)设置为 500 时,意味着定时器需要计数 500 个时钟周期才会触发中断。因此,中断发生的周期是 500us(即500 * 1us

若Pulse设为250,即占空比=Pulse/ARR=250/500=50%

四、寄存器TIMx_ARR、TIMx_CCRx 、TIMx_CNT

向上计数为例,重载值为ARR,比较值为CRRx

怎么用定时器采样,stm32,嵌入式硬件,单片机

上图可以看出:

  • 0-t1段,定时器计数器TIMx_CNT值小于CCRx值,输出低电平
  • t1-t2段,定时器计数器TIMx_CNT值大于CCRx值,输出高电平

TIMx_CNT值达到ARR时,定时器溢出,重新向上计数...循环此过程至此一个PWM周期完成

上图更加形象的说明了

信号频率由 TIMx_ARR 寄存器值决定。

占空比则由 TIMx_CCRx 寄存器值决定。

参考:

STM32 HAL库:ADC+DMA应用(连续采样、触发采样)_hal adc dma-CSDN博客

【STM32】定时器TIM触发ADC采样,DMA搬运到内存(超详细讲解)-CSDN博客文章来源地址https://www.toymoban.com/news/detail-846180.html

到了这里,关于定时器(PWM输出)触发ADC采样(DMA)——STM32CubeMX的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • foc配置篇——ADC注入组使用定时器触发采样的配置

    foc驱动板都会用到电流采样,本篇就针对三电阻低测采样来讲一讲如何配置ADC。 在此之前,或许大家使用ADC都是建立一个大数组,然后DMA无脑开着将数据搬到数组里,等到要用到时候就取出来做一个均值滤波。 ​ 这种方法用在foc电流采样上行不行呢?答案是看情况,如果你

    2024年02月01日
    浏览(40)
  • STM32 HAL库 Timer(定时器)+DMA输出PWM底层配置过程学习

    本文使用的芯片型号是STM32G030,写本文的目前是想记录学习下Timer借助DMA生成可变占空比PWM时的底层配置过程。 使用TIM1,配置就只改了图上的配置,系统时钟用的16M,分频选择15(16-1),自动重装载寄存器ARR选择999(1000-1),那么生成的就是1kHz的PWM,这里为什么要减1,因为这俩是

    2024年04月09日
    浏览(59)
  • STM32G0 定时器PWM DMA输出驱动WS2812配置 LL库

    优点:不消耗CPU资源 缺点:占用内存较大 定时器配置 定时器通道:TIM3 CH2 分频:0 重装值:79,芯片主频64Mhz,因此PWM输出频率:64Mhz/79 ≈ 800Khz,满足芯片要求。 auto-reload preload 要关闭 output compare preload 要打开 DMA配置 外设一定要选择TIM3_UP,不要选TIM_CHx 方向是内存到外设,

    2024年02月10日
    浏览(44)
  • 【STM32】- 定时器+DMA+ADC 双重模式

    目录   1 前言 2 ADC介绍 2.1 多重工作模式 2.2 多重ADC框图 2.3 规则同时模式 3 程序设计 3.1 时序图 3.2 初始化流程图 3.3 初始化代码 4 结论        关于ADC,相信大家都比较了解,关于STM32的学习教程都会有所讲解,但以查询方式、单通道讲解的较多,主要告诉大家基本的原理。

    2024年02月10日
    浏览(53)
  • STM32 ADC+定时器+DMA+FFT

    本次实现的功能为单片机DAC输出一个正弦波,然后ADC定时采样用DMA输出,最后对DAC输出的波形进行FFT。 单片机STM32F103ZET6 内部时钟 一、配置ADC ADC端口为PA1,采用DMA输出,定时器3触发 定时器时钟64M,分频后为102.4KHz ADC采样时间为102.4KHz/100=1.024KHz 二、配置DAC DAC端口PA4 DMA传输

    2024年02月13日
    浏览(42)
  • 定时器详解 -- 定时器中断、PWM输出 --stm32

    STM32F103系列芯片拥有多种定时器,包括基本定时器、通用定时器和高级定时器,每种定时器都具有一些特定的功能。 向上计数:计数器从0计数到自动重装载值(ARR),然后重新从0开始计数并且产生一个计数器溢出事件。 向下计数:计数器从自动重装载值(ARR)开始向下计数

    2024年02月11日
    浏览(59)
  • STM32 HAL库定时器触发DMA并口数据传输

    STM32与FPGA通讯,通过8位并口线进行通讯,16byte的数据在10us之内通过8位并口数据线传给FPGA,FPGA读取该数据。 时钟采用80MHz,由于16byte的数据要在10us之内传完,那么10/(16*2)=0.3125us/次,也就是传输频率得≥3.2MHz。 定时器设置:为了方便起见,先选用了4MHz的传输频率。80MHz

    2024年02月02日
    浏览(69)
  • STM32TIM定时器PWM输出比较(适用于通用,高级定时器)

    在定时器中我们最常用的功能就是输出PWM,大多是用在电机控制方面,目前网络上相关资料也有很多,但是,很多不利于我们“现搜现用”我这里不是说我写的有多好,而是你搜索到此类文章时大部分是急于解决目前的问题,一段相关代码和讲解就行,当然不是学习背后的原

    2024年01月25日
    浏览(54)
  • STM32定时器输出PWM脉冲

    一、什么是PWM脉冲? PWM (Pulse Width Modulation) 脉冲宽度调制,通常应用于惯性系统中,( 不是不能即停的设备,因为如果设备不具有关心,那么运动是断断续续的,不具有连续性 ),通过脉宽调节输出不同的波形作用域受控对象。 二、 PWM中三个重要的参数 1.频率=1/Ts ;这个很

    2024年02月15日
    浏览(49)
  • 【嵌入式】HC32F定时器PWM捕获+APC芯片实现模拟AD采样

    目录 一 项目背景 二 原理说明 三 设计实现——定时器初始化 四 设计实现——PWM捕获 五 梳理总结         目前使用了TI的ADC采样芯片 ADS1018实现模拟量4-20mA/0-20mA的采样 ,原理是 将外部输入的模拟量信号4-20mA,经由并联的两个100Ω电阻,转换为0.2-1V的电压信号传递到模数转

    2023年04月24日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包