当前位置: 代码网 > it编程>硬件开发>stm32 > 定时器(PWM输出)触发ADC采样(DMA)——STM32CubeMX

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

2024年08月06日 stm32 我要评论
已知 Tclk 为 84MHz , 我们需要 Tout 为 200ms 即 200000us , 不妨先让PSC为 839, 带入上述公式可得 ARR = 19999. 这样算出来之后ARR和PSC都在0~65535的范围, 则可以使用这组参数。例如,如果时钟频率为1MHz,并且PSC设置为1000,则实际的定时频率将为1kHz。当重装载值(Period 或 ARR)设置为 500 时,意味着定时器需要计数 500 个时钟周期才会触发中断。例如,如果时钟频率为1MHz,则Tclk为1微秒。

adc基础知识http://t.csdnimg.cn/x6phu

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

我用的单片机是stm32f103cbtx

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

定时器中cubemx配置:

c50fe6156bd84ffba36b089adc5eb16e.png

2ccd60693a12402bae46a6c9b258b518.png

pwm模式1和模式2区别:

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

c665e23e417947b4a7376cd3a067a2f8.png

137b6339728a4e51b11a9c8b6a2d94fe.png

adc中cubemx配置: 

a2554d931b4f447e994f58c0fad6cd46.png

dma模式选择: 

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

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

a8d2ba26f6304b67b830a6bc98196a48.png

 代码:

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;
    }
}

结果:

b14f3b94fe984e4cb342b1e8ca014931.png

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

adc中cubemx配置: 

2bbbb2326c00463286845cbe99cb6a6c.png

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

ef4c8d32cb554af9918b6697581516ac.png

*注 :* 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发生一次中断。

四、寄存器timx_arr、timx_ccrx 、timx_cnt

8e27aba90c9a4ff18d20c25dda041fb2.png

上图可以看出:

  • 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博客

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com