問題:多通道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庫開發實戰指南 上面配套...