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

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

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

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

二、配置

1、确认时钟源

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

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

2、配置系统时钟

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

3、配置仿真和调试方式

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

4、DAC的配置

首先打开DAC OUT2通道,

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

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

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

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

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

5、TIM6配置

触发事件选择为更新事件

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

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

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

三、代码生成

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

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

2、生成代码的配置

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

3、最后一步生成代码

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

四、添加代码

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

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

 

CubeMx配置STM32H750VBxxDAC输出正弦波(DAC+TIM6+DMA)
正弦波的频率=主频 /(TIM_Prescaler+1)/(TIM_Period+1)/ 点数
我们选80个点
f=240M/(0+1)/(38+1)/80≈76.9kHz.

打开我们的代码工程

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

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

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、在主函数中调用相关函数,产生周期的正弦波

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

  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的正弦波:

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

上一篇:R语言经济学:动态模型平均(DMA)、动态模型选择(DMS)预测原油时间序列价格


下一篇:[转载]宋宝华:世上最好的共享内存(Linux共享内存最透彻的一篇)