日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > windows >内容正文

windows

STM32CubeMX教程18 DAC - DMA输出自定义波形

發(fā)布時(shí)間:2024/1/21 windows 40 coder
生活随笔 收集整理的這篇文章主要介紹了 STM32CubeMX教程18 DAC - DMA输出自定义波形 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1、準(zhǔn)備材料

開(kāi)發(fā)板(正點(diǎn)原子stm32f407探索者開(kāi)發(fā)板V2.4)

STM32CubeMX軟件(Version 6.10.0)

野火DAP仿真器

keil μVision5 IDE(MDK-Arm)

ST-LINK/V2驅(qū)動(dòng)

一臺(tái)示波器

邏輯分析儀nanoDLA

2、實(shí)驗(yàn)?zāi)繕?biāo)

使用STM32CubeMX軟件配置STM32F407開(kāi)發(fā)板的DAC OUT1實(shí)現(xiàn)輸出0-3.3V 周期為12.8ms的正弦波形

3、實(shí)驗(yàn)流程

3.0、前提知識(shí)

由于STM32F407的兩個(gè)DAC輸出通道只能自動(dòng)生成三角波和噪聲波,因此如果想要輸出其他的波形可以自己手動(dòng)定義一個(gè)周期內(nèi)DAC要輸出的值,并選擇定時(shí)器的更新事件作為DAC輸出的觸發(fā)源按順序輸出

這樣按照波形采樣值的順序,在每一個(gè)觸發(fā)源到來(lái)的時(shí)候,手動(dòng)指定DAC將要輸出的值,理論上就可以輸出任何我們想要輸出的波形,比如正弦波,本實(shí)驗(yàn)將以正弦波為例,講解如何通過(guò)DAC的DMA輸出正弦波型

當(dāng)DAC參考電源引腳VREF+接VDDA(3.3V)時(shí),可設(shè)置的DAC輸出寄存器值范圍為0~4095,而DAC的輸出范圍為0-3.3V,要輸出的正弦波sin(x)波形幅值范圍為-1~1,因此可以對(duì)該波形做一些平移伸縮,將其幅值范圍縮放到DAC設(shè)置范圍0~4095內(nèi),變換后的正弦波公式為:y=2047*(sin(x)+1)

在該正弦波形的一個(gè)周期0-2pi內(nèi)平均取128個(gè)采樣點(diǎn),然后按照時(shí)間先后順序定義在數(shù)組中,每當(dāng)0.1ms觸發(fā)源到來(lái)的時(shí)候,我們就遞歸的從數(shù)組中取出一個(gè)值將其設(shè)置為DAC的輸出值,直到128個(gè)采樣點(diǎn)全部設(shè)置完畢,然后再反復(fù)從第一個(gè)重新設(shè)置,這樣就可以大致實(shí)現(xiàn)正弦波型

因?yàn)樾枰l繁的從內(nèi)存取出數(shù)據(jù)然后寫(xiě)入DAC外設(shè),因此這里比較合適的做法是使用DMA的方式進(jìn)行,通過(guò)上述設(shè)置的DAC輸出的正弦波形的周期應(yīng)該為0.1ms*128=12.8ms,正弦波的幅值范圍應(yīng)該為0-3.3V

3.1、CubeMX相關(guān)配置

3.1.0、工程基本配置

打開(kāi)STM32CubeMX軟件,單擊ACCESS TO MCU SELECTOR選擇開(kāi)發(fā)板MCU(選擇你使用開(kāi)發(fā)板的主控MCU型號(hào)),選中MCU型號(hào)后單擊頁(yè)面右上角Start Project開(kāi)始工程,具體如下圖所示

開(kāi)始工程之后在配置主頁(yè)面System Core/RCC中配置HSE/LSE晶振,在System Core/SYS中配置Debug模式,具體如下圖所示

詳細(xì)工程建立內(nèi)容讀者可以閱讀“STM32CubeMX教程1 工程建立”

3.1.1、時(shí)鐘樹(shù)配置

系統(tǒng)時(shí)鐘使用8MHz外部高速時(shí)鐘HSE,HCLK、PCLK1和PCLK2均設(shè)置為STM32F407能達(dá)到的最高時(shí)鐘頻率,具體如下圖所示

3.1.2、外設(shè)參數(shù)配置

在Pinout & Configuration頁(yè)面左邊功能分類欄目Analog中單擊其中DAC

在Mode中勾選OUT1 Configuration

選擇TIM6的外部觸發(fā)事件作為DAC OU1輸出的觸發(fā)源,不選擇波形生成模式,因?yàn)楸緦?shí)驗(yàn)要生成自定義波形

具體配置如下圖所示

單擊Configuration中的DMA Settings選項(xiàng)卡對(duì)DAC的DMA請(qǐng)求進(jìn)行設(shè)置

單擊ADD按鍵增加DMA請(qǐng)求,這里可選的只有一個(gè)DAC1

選擇想要使用的DMA Stream,并設(shè)置優(yōu)先級(jí),將DMA請(qǐng)求模式設(shè)置為循環(huán)模式,外設(shè)地址不增加,內(nèi)存地址遞增,數(shù)據(jù)寬度選擇字Word

上述配置如下圖所示

3.1.3、外設(shè)中斷配置

在Pinout & Configuration頁(yè)面左邊System Core/NVIC中勾選DMA1 Stream5 全局中斷,然后選擇合適的中斷優(yōu)先級(jí)即可

3.2、生成代碼

3.2.0、配置Project Manager頁(yè)面

單擊進(jìn)入Project Manager頁(yè)面,在左邊Project分欄中修改工程名稱、工程目錄和工具鏈,然后在Code Generator中勾選“Gnerate peripheral initialization as a pair of 'c/h' files per peripheral”,最后單擊頁(yè)面右上角GENERATE CODE生成工程,具體如下圖所示

詳細(xì)Project Manager配置內(nèi)容讀者可以閱讀“STM32CubeMX教程1 工程建立”實(shí)驗(yàn)3.4.3小節(jié)

3.2.1、外設(shè)初始化調(diào)用流程

在生成的工程代碼主函數(shù)中新增了MX_DMA_Init()函數(shù),該函數(shù)對(duì)DAC使用的DMA1時(shí)鐘使能,由于啟用了該DMA的中斷,因此還對(duì)中斷優(yōu)先級(jí)及使能進(jìn)行了配置,如下圖所示

DAC的初始化調(diào)用流程與“STM32CubeMX教程16 DAC - 輸出3.3V內(nèi)任意電壓”實(shí)驗(yàn)一致,只是因?yàn)楸緦?shí)驗(yàn)配置了DMA,因此在HAL_DAC_MspInit()函數(shù)中增加了對(duì)使用的DAC1 DMA請(qǐng)求的相關(guān)配置代碼,如下圖所示

3.2.2、外設(shè)中斷調(diào)用流程

DMA全局中斷事件回調(diào)函數(shù)為一個(gè)函數(shù)指針,當(dāng)使用HAL_DAC_Start_DMA()函數(shù)啟動(dòng)DAC傳輸時(shí),會(huì)將DMA全局中斷事件回調(diào)函數(shù)指針指向具體的函數(shù),這里指向了DAC_DMAConvCpltCh1()函數(shù)

在DAC_DMAConvCpltCh1()函數(shù)中最終調(diào)用了DAC OU1 DMA傳輸完成中斷回調(diào)函數(shù)HAL_DAC_ConvCpltCallbackCh1(),該函數(shù)為虛函數(shù),需要用戶重新實(shí)現(xiàn)

啟用DMA的外設(shè)中斷調(diào)用流程可參考“STM32CubeMX教程12 DMA 直接內(nèi)存讀取”實(shí)驗(yàn)3.2.2、外設(shè)中斷調(diào)用流程小節(jié),上述具體過(guò)程如下圖所述

3.2.3、添加其他必要代碼

采集正弦波y=2047*(sin(x)+1)的一個(gè)周期2pi內(nèi)n個(gè)采樣點(diǎn),并將其定義在一個(gè)uint32_t 數(shù)組中,筆者這里定義了128個(gè)采樣點(diǎn)

為什么非要正弦波函數(shù)為y=2047*(sin(x)+1)?

因?yàn)镈AC的輸出范圍為0~4095,而sin(x)的輸出范圍為-1~1,因此需要采集的正弦波采樣點(diǎn)最好縮放到0-4095范圍,這樣輸出的波形更好顯示

源代碼如下所示 (注釋1)

/*正弦波數(shù)據(jù),12bit,1個(gè)周期128個(gè)點(diǎn), 0-4095之間變化*/
const uint32_t userWave[] = 
{
    2047,   2147,	2248,   2347,	2446,	2544,	2641,	2737,
    2830,   2922,	3012,	3099,	3184,	3266,	3346,	3422,
    3494,   3564,	3629,	3691,	3749,	3803,	3852,	3897,
    3938,   3974,	4006,	4033,	4055,	4072,	4084,	4092,
    4094,   4092,	4084,	4072,	4055,	4033,	4006,	3974,
    3938,   3897,	3852,	3803,	3749,	3691,	3629,	3564,
    3494,   3422,	3346,	3266,	3184,	3099,	3012,	2922,
    2830,   2737,	2641,	2544,	2446,	2347,	2248,	2147,
    2047,   1947,	1846,	1747,	1648,	1550,	1453,	1357,
    1264,   1172,	1082,	995 ,	910 ,	828 ,	748 ,	672 ,
    600 ,   530 ,	465 ,	403 ,	345 ,	291 ,	242 ,	197 ,
    156 ,   120 ,	88  ,	61  ,	39  ,	22  ,	10  ,	2   ,
    0   ,   2   ,	10  ,	22  ,	39  ,	61  ,	88  ,	120 ,
    156 ,   197 ,	242 ,	291 ,	345 ,	403 ,   465,	530 ,
    600 ,   672 ,	748 ,	828 ,	910 ,	995 ,	1082,	1172,
    1264,   1357,	1453,   1550,	1648,	1747,	1846,	1947
};

在dac.c中重新實(shí)現(xiàn)DAC OU1 DMA傳輸完成中斷回調(diào)函數(shù)HAL_DAC_ConvCpltCallbackCh1(),源代碼如下

/*DAC OUT1 DMA傳輸完成中斷回調(diào)函數(shù)*/
void HAL_DAC_ConvCpltCallbackCh1(DAC_HandleTypeDef *hdac)
{
    /*翻轉(zhuǎn)RED_LED引腳狀態(tài)*/
    HAL_GPIO_TogglePin(RED_LED_GPIO_Port,RED_LED_Pin);
}

在main.c文件主函數(shù)main中以DMA方式啟動(dòng)DAC輸出,源代碼如下

HAL_DAC_Start_DMA(&hdac,DAC_CHANNEL_1,userWave,128,DAC_ALIGN_12B_R);
HAL_TIM_Base_Start(&htim6);

4、常用函數(shù)

/*以DMA啟動(dòng)DAC輸出*/
HAL_StatusTypeDef HAL_DAC_Start_DMA(DAC_HandleTypeDef *hdac, uint32_t Channel, const uint32_t *pData, uint32_t Length,uint32_t Alignment)
 
/*停止以DMA啟動(dòng)的DAC輸出*/
HAL_StatusTypeDef HAL_DAC_Stop_DMA(DAC_HandleTypeDef *hdac, uint32_t Channel)
 
/*DAC OUT1 DMA傳輸完成時(shí)間中斷回調(diào)函數(shù)*/
void HAL_DAC_ConvCpltCallbackCh1(DAC_HandleTypeDef *hdac)

5、燒錄驗(yàn)證

燒錄程序,單片機(jī)上電后,將示波器的探頭掛鉤與DAC OUT1引腳PA4相連接,接地環(huán)與開(kāi)發(fā)板上的GND引腳連接,將示波器每格電壓幅值調(diào)節(jié)為1.00V,將每格子采集時(shí)間調(diào)節(jié)為10ms,然后開(kāi)啟示波器對(duì)DAC OU1輸出的波形采集

因?yàn)槎〞r(shí)器溢出時(shí)間為0.1ms,而DMA傳輸?shù)臄?shù)據(jù)為正弦波一個(gè)周期內(nèi)的128個(gè)樣本點(diǎn),因此生成的正弦波周期為128*0.1ms=12.8ms,這與示波器采集到的正弦波波形周期一致,如下圖所示為示波器采集到的正弦波形

在DAC OUT1 DMA傳輸完成時(shí)間中斷回調(diào)函數(shù)中翻轉(zhuǎn)了RED_LED(PF9)引腳的狀態(tài),經(jīng)過(guò)上述分析知道,傳輸完成一次所需事件應(yīng)該為輸出正弦波形的周期,也即12.8ms,因此使用邏輯分析儀器采集PF9引腳的狀態(tài),發(fā)現(xiàn)PF9引腳確實(shí)12.8ms翻轉(zhuǎn)一次狀態(tài),邏輯分析儀采集的波形如下圖所示

6、注釋詳解

注釋1:正弦波數(shù)組定義來(lái)源?DAC輸出正弦波帖子

更多內(nèi)容請(qǐng)瀏覽 STM32CubeMX+STM32F4系列教程文章匯總貼

總結(jié)

以上是生活随笔為你收集整理的STM32CubeMX教程18 DAC - DMA输出自定义波形的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。