天天看點

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)