其他分享
首页 > 其他分享> > CubeMx配置STM32H750VBxxDAC输出正弦波(DAC+TIM6+DMA)

CubeMx配置STM32H750VBxxDAC输出正弦波(DAC+TIM6+DMA)

作者:互联网

一、平台新建项目(以STM32H750VBxx系列为例)

二、配置

1、确认时钟源

         进入工程后打开 RCC 选项,选择 Crystal/Ceramic Resonator,即使用外部晶振作为 HSE 的时钟源。

2、配置系统时钟

3、配置仿真和调试方式

4、DAC的配置

首先打开DAC OUT2通道,

触发方式设置为TIM6事件触发,

输出缓冲Output Buffer建议关闭。DAC的输出缓存可以用来减小输出阻抗,无需外部运放即可直接驱动外部负载。但输出不能达到0(会出现底部失真),不推荐开启。具体参考官方手册,缓冲器打开时低端的DAC输出电压大概0.2V(不同型号可能不同,暂未考证)

接着打开DAC的DMA,DMA的方式可以减轻CPU的负担,配置如下,需要注意的是工作Mode配置为Circular(循环模式):

5、TIM6配置

触发事件选择为更新事件

由于TIM6是挂载在APB1LENR时钟线上,在前边步骤2系统时钟的配置,所以TIM6我们设为了240M

计数周期为(38+1),触发频率为240M/39≈6153.8kHz。定时器的配置决定了输出的正弦波的频率。

三、代码生成

1、工程项目的命名、选择MDK-ARM编译环境

2、生成代码的配置

3、最后一步生成代码

四、添加代码

前边我们定时器时钟已经设为240M。

 


正弦波的频率=主频 /(TIM_Prescaler+1)/(TIM_Period+1)/ 点数
我们选80个点
f=240M/(0+1)/(38+1)/80≈76.9kHz.

打开我们的代码工程

1、编写一个正弦波生成函数,将一个周期的正弦波数据存储在数组中,这里一个周期为80个点。

uint16_t Dat[80];
void SineWave()
{
    uint16_t i;
    for( i=0;i<80;i++)
    {
        Dat[i]=(uint16_t)((2047*sin(i*2*3.14159/80))+2048);
    }
}

2、在主函数中调用相关函数,产生周期的正弦波

  SineWave();//生成正弦数据
  HAL_TIM_Base_Start(&htim6);//打开定时器6
  HAL_DAC_Start_DMA(&hdac1,DAC_CHANNEL_2,(uint32_t *)Dat,80,DAC_ALIGN_12B_R);//开启DMA-DAC

添加完代码,编译通过后烧录至板子

3、用示波器观察PA5

如下,频率为76.9kHz的正弦波:

标签:DMA,配置,TIM6,DAC,STM32H750VBxxDAC,正弦波,80
来源: https://blog.csdn.net/weixin_47768836/article/details/116975302