基於STM32Cube的ADC模數取樣設計

2021-09-25 08:06:29 字數 2179 閱讀 4842

1.背景

此實驗建立在stm32f429核心板基礎上,對於深刻了解stm32cube使用具有深刻意義。利用dma進行adc取樣,具有速度快,極大減少cpu消耗的優勢,對於資料採集系統具有很大的優勢,特別是其單路2.4msps取樣速度,三路組合可以達到驚人的7.2msps取樣速度,對於一般應用均可滿足。

2.stm32cube配置

2.1 

工程建立在前面均與簡述,這裡不做贅述,系統時鐘180mhz。

2.2 adc引數配置

scan conversion mode 掃瞄模式,當使用多通道需要使能。

continuous conversion mode 連續轉化模式,當一路轉化完成立馬開始新一輪轉化。

adc的時鐘觸發有兩種方式,一種是通過定時器等外部中斷源觸發,另一種是adc自身的時鐘觸發。

這裡選擇timer 3 caputure cpmpare 1 event 觸發。

adc通過dma來實現資料採集,dma setting引數如上圖所示。這裡需要注意的是memory需要自加    1,並且使用fifo,採用半滿閾值設定,為了做「桌球」排程演算法。因為adc是12bit的,故採用half word。

開啟dma中斷。

2.3  取樣定時脈衝設定

因為adc使用了timer 3,所以需要對timer 3 進行配置。如果adc採用內部adc時鐘觸發,則無需配    置。

這裡採用頻率設定為500khz,定時器時鐘為180/2=90mhz,9分頻之後是10mhz,然後counter period 是20,取樣週期10m/20=500khz。

2.4 通過stm32cube產生原始碼,使用mdk開啟工程。

在大迴圈之前加入語句

uint16_t samples_in[512]=;

hal_tim_pwm_start(&htim3,tim_channel_1);

hal_adc_start_dma(&hadc1,(uint32_t *)&samples_in[0],512);

3. adc效果驗證

3.1 利用前述章節配置串列埠波特率115200,dma傳送使能。

3.2 在adc的fifo結束中斷上,關閉adc的dma,使其不再工作,通過串列埠將adc採集到的512組16進製制資料傳送到pc機上,利用串列埠除錯助手將其儲存到名為「test_sina.txt」的檔案中;

3.3 開啟matlab軟體,新建.m檔案,命名為「test_getdata.m」。

寫入語句:

clc;clear;

sina =textread(

'test_sina.txt'

,'%s'

)';%以字元形式開啟檔案 

alpha = hex2dec(sina)'; 

%16進製制轉化為10進製數,存入alpha矩陣 

訊號發生器發生1khz的正弦訊號,通過matlab將adc採集的資料還原如上圖所示,是乙個週期多一點點的正弦波。

理論計算:500khz的取樣率,採集1khz的正弦訊號,能夠採集1個週期多一點點,跟matlab顯示的一樣。

為了更加形象顯示影象,下節會使用dac利用「桌球」排程演算法將adc的資料實時輸出。

來自為知筆記(wiz)

STM32Cube庫的使用

stm32cubemx 軟體的使用 stm32cubemx使用詳解 這是st的論壇,在這裡基本滿足了大多開發者的使用需求。stm32cubemx使用方法及功能介紹 embedddeveloper部落格 ybhuangfugui 可謂是緊跟隨stm32應用的神仙級行業領軍人物 st入門高階學習必讀,太...

STM32cube學習筆記(1)

1 偶然的機會接觸到了stm32cubemx與stm32cubefx 詳細了解相關的資料之後感覺相當實用。2 程序建立 osthreaddef defaulttask,startdefaulttask,osprioritynormal,0,128 定義乙個結構體 defaulttaskhandle ...

STM32Cube 直接儲存器訪問(DMA)

在usart章節講解了串列埠的輪詢和中斷模式,這一章介紹一下通過dma模式控制串列埠傳輸。直接儲存器訪問 dma 用於在外設與儲存器之間以及儲存器與儲存器之間提供高速資料傳輸。可以在無需任何 cpu 操作的情況下通過 dma 快速移動資料。這樣節省的 cpu 資源可供其它操作使用。說白了dma就是乙...