STM32 多通道掃瞄 ADC資料錯亂 HAL

2021-10-25 03:41:58 字數 3084 閱讀 5574

問題:多通道adc掃瞄+單次+dma,發現工作一段時間後,dma資料錯位。按我的理解當前是單次模式,轉換完成後應該自動停止,實際過程不太對。

解決辦法:在dma搬運結束中斷中關閉adc

void

hal_adc_convcpltcallback

(adc_handletypedef* hadc)

多通道單次掃瞄+dma搬運 配置如下:

adc配置

static

void

mx_adc1_init

(void);

/* user code begin adc1_init 1 */

/* user code end adc1_init 1 */

/** common config

*/hadc1.instance = adc1;

hadc1.init.scanconvmode = adc_scan_enable;

hadc1.init.continuousconvmode = disable;

hadc1.init.discontinuousconvmode = disable;

hadc1.init.externaltrigconv = adc_software_start;

hadc1.init.dataalign = adc_dataalign_right;

hadc1.init.nbrofconversion =2;

if(hal_adc_init

(&hadc1)

!= hal_ok)

/** configure regular channel

*/sconfig.channel = adc_channel_4;

sconfig.rank = adc_regular_rank_1;

sconfig.samplingtime = adc_sampletime_239cycles_5;if(

hal_adc_configchannel

(&hadc1,

&sconfig)

!= hal_ok)

/** configure regular channel

*/sconfig.channel = adc_channel_5;

sconfig.rank = adc_regular_rank_2;if(

hal_adc_configchannel

(&hadc1,

&sconfig)

!= hal_ok)

/* user code begin adc1_init 2 */

hal_adcex_calibration_start

(&hadc1)

;//校準adc

hal_adc_start_dma

(&hadc1,

(uint32_t

*) buff,2)

;// 啟動dma轉換 2個通道

/* user code end adc1_init 2 */

}

void

hal_adc_mspinit

(adc_handletypedef* hadc);if

(hadc->instance==adc1)

__hal_linkdma

(hadc,dma_handle,hdma_adc1)

;/* user code begin adc1_mspinit 1 */

/* user code end adc1_mspinit 1 */

}}

其它拓展知識:

continuousconvmode

discontinuousconvmode

轉換模式

disable

disable

觸發一次,轉換乙個序列**換所有被選通道),轉換結束後停止

enable

無效連續轉換 觸發一次,轉換乙個序列**換所有被選通道),轉換結束後自動重新開始

disable

enable

斷續轉換 觸發一次,轉換乙個通道,在觸發,在轉換。在所選轉換通道迴圈

內部參考電壓

當adc的外部參考電壓不准時,可以考慮使用內部參考電壓進行校準:

公式:vref = (1.2 / (adc_vref / 4095 * 3.3)) * 3.3

其中adc_vref為adc內部參考電壓通道的數值。

實際電壓 = vref * vch / 4095

(vch是通道採集的adc的值)

stm32f4xx 系列 hal 差異

沒有校準函式

adc 配置介面需要設定dma連續請求。

**示例

/* 掃瞄模式 連續轉換 8通道 dma連續請求 */

hadc1.instance = adc1;

hadc1.init.clockprescaler = adc_clock_sync_pclk_div6;

hadc1.init.resolution = adc_resolution_12b;

hadc1.init.scanconvmode = enable;

hadc1.init.continuousconvmode = enable;

hadc1.init.discontinuousconvmode = disable;

hadc1.init.externaltrigconvedge = adc_externaltrigconvedge_none;

hadc1.init.externaltrigconv = adc_software_start;

hadc1.init.dataalign = adc_dataalign_right;

hadc1.init.nbrofconversion =8;

hadc1.init.dmacontinuousrequests = enable;

/* 迴圈採集 這裡要使能,不然dma只進入一次 */

hadc1.init.eocselection = adc_eoc_single_conv;

STM32多通道ADC操作

自 今天嘗試了下stm32的adc取樣,並利用dma實現取樣資料的直接搬運儲存,這樣就不用cpu去參與操作了。找了不少例子參考,adc和dma的設定了解了個大概,並直接利用開發板來做一些實驗來驗證相關的操作,保證自己對各部分設定的理解。我這裡用了3路的adc通道,1路外部變阻器輸入,另外兩路是內部的...

STM32的ADC多通道取樣

用hal庫寫的好處就是可以不用進行配置io口發步驟.有良好的相容性,更換晶元的時候改 也簡單.rcc我在左側的 裡不用勾選,因為我用的是內部時鐘,不用選.下面是我配置的時鐘 之所以是48m,還要分頻呢.下面直接上 其他的都預設.然後按alt p,設定下工程,格式如下 這個可以把 格式更模組化。建議選...

STM32的ADC取樣與多通道ADC取樣

stm32庫開發實戰指南 劉火良,楊森著 原理性質的東西還是少講,因為上面那本書裡面講解的很詳細了,直接來看硬體電路圖 這裡使用的是3362電位器 10k 即用stm32來測量pb0和gnd兩端的電壓,這樣的電路設計比較簡單也容易理解,但是存在一定的弊端,下面給出 stm32庫開發實戰指南 上面配套...