有時我們可能需要對多個ADC通道進行分組轉(zhuǎn)換,組與組之間希望有可調(diào)的時間間隔。比方像下面圖示的情形。先轉(zhuǎn)換頭2個通道,再轉(zhuǎn)換中間2個通道,之后轉(zhuǎn)換最后的2個通道。
如果我們采樣查詢或中斷方式,每轉(zhuǎn)換完2個通道后,然后做后續(xù)通道的切換配置再啟動AD模塊也是可以的。至于那個時間間隔我們往往會使用定時器來協(xié)助。顯然,這樣做有時會顯得有點繁瑣。
像上面這種情況,我們還可以考慮使用ADC的間斷轉(zhuǎn)換模式。即將一個ADC轉(zhuǎn)換通道序列分成幾組,每來一次ADC轉(zhuǎn)換觸發(fā)事件,就轉(zhuǎn)換一組AD通道,這樣依次進行直至整個序列轉(zhuǎn)換完畢。
比方,我們用到某ADC模塊的CH1/CH2/CH3/CH4/CH5五個通道,將它們分成3組,使用定時器觸發(fā)ADC。第一次觸發(fā)時,進行CH1/CH2兩個通道的AD轉(zhuǎn)換,第二次觸發(fā)時進行CH3/CH4兩個通道的AD轉(zhuǎn)換,第三次觸發(fā)時,完成CH5通道的AD轉(zhuǎn)換。 第四次觸發(fā)時進行跟第一次觸發(fā)一樣的轉(zhuǎn)換,這樣循環(huán)下去。
不妨基于上面的描述舉一個實際的例子演示一下。使用STM32F411-Discovery開發(fā)板來做調(diào)試驗證。用到ADC1模塊的從CH1開始的連續(xù)5個AD通道,被分成3組。如下圖所示。
我們使用定時器更新事件觸發(fā)ADC轉(zhuǎn)換,第1組與第2組轉(zhuǎn)換之間的間隔、第2組與第3組轉(zhuǎn)換的間隔通過適時調(diào)整定時器的計時長短來控制。
我們使用定時器更新事件觸發(fā)DMA,通過DMA修改ARR的值來調(diào)節(jié)相鄰兩組轉(zhuǎn)換之間的時間間隔。另外,ADC的轉(zhuǎn)換結果通過EOC事件觸發(fā)DMA,并由DMA將轉(zhuǎn)換結果有序地搬到指定的內(nèi)存空間。
整個ADC序列的5個通道轉(zhuǎn)換完成后,進入ADC的DMA傳輸完成中斷,在中斷回調(diào)函數(shù)里對各個通道的轉(zhuǎn)換結果進行處理。之后,又可以開始下一輪ADC轉(zhuǎn)換。
將上面提到的整個實現(xiàn)過程稍微整理下:
1、ADC轉(zhuǎn)換依靠定時器的更新事件觸發(fā),按照間斷模式進行分組轉(zhuǎn)換。
2、開啟了兩路DMA傳輸,1路用于ADC結果的搬運,另1路用于定時器ARR值的更新。
第1次定時觸發(fā)事件發(fā)生時,完成第一組AD通道【CH1、CH2】的轉(zhuǎn)換,同時觸發(fā)定時器的DMA傳輸,修改ARR的值,由其決定第1次觸發(fā)事件與第2次觸發(fā)事件的的時間間隔;當?shù)?次定時觸發(fā)事件發(fā)生時,完成第二組AD通道【CH3、CH4】的轉(zhuǎn)換,同時觸發(fā)定時器的DMA傳輸,修改ARR的值,以決定第2次觸發(fā)事件與第3次觸發(fā)事件的時間間隔;當?shù)?次觸發(fā)事件發(fā)生時,這里只做第3組AD通道【CH5】的轉(zhuǎn)換,不通過DMA對ARR進行修改,其值將在ADC的DMA傳輸完成中斷的回調(diào)函數(shù)里由用戶指定。
下面將整個配置和代碼實現(xiàn)的全過程貼出來,以供參考。使用STM32CubeMx工具進行圖形化配置,基于ST公司的STM32Cube庫來組織代碼。
假設第一組AD通道轉(zhuǎn)換后經(jīng)過0x7000個時間單位觸發(fā)第二組AD通道的轉(zhuǎn)換,再過0x5000個時間單位觸發(fā)第三組AD通道轉(zhuǎn)換?!緦嶋H應用時,時基參數(shù)視具體情況而定】
一、基于CubeMx的配置【RCC/SYS的配置從略】。
1.1TIM3的配置,TIM3的更新事件觸發(fā)ADC轉(zhuǎn)換,并觸發(fā)DMA做ARR的更新。
1.2 ADC的配置。【選擇5個ADC通道,間斷轉(zhuǎn)換模式,啟用ADC的DMA傳輸】
二、生成初始化代碼。
基于STM32Cube庫,生成基于ARM KEIL MDK集成開發(fā)環(huán)境的工程代碼。
三、添加用戶代碼?!敬a基于STM32Cube庫】
首先介紹下用戶代碼里用到的2個數(shù)組,分別是Adc_Value[5]和Data_Arr[2].
其中Adc_Value[5]用來存放ADC通道的的轉(zhuǎn)換結果,Data_Arr[2]用來存放ARR的數(shù)據(jù)以改變計時周期。二者分別被不同的DMA流訪問。
3.1 在main()里添加如下用戶代碼。
第1行,清除定時器更新事件標志。
紅色方框內(nèi)的兩行分別對ADC/TIM3的DMA傳輸做啟動配置。
第4行使能TIM3更新事件的DMA請求。
4、結果驗證。
將硬件連接好,編譯代碼,運行后可以看到轉(zhuǎn)換結果。5個AD通道分為三組按預定時間間隔被依次觸發(fā)轉(zhuǎn)換,轉(zhuǎn)換結果被DMA搬到指定的內(nèi)存空間。通過調(diào)試器,我們可以看到ADC結果及定時器ARR的相應變化。
小結:這里主要是拋磚引玉似地介紹下STM32芯片ADC間斷轉(zhuǎn)換模式,同時用到了定時器和DMA兩個外設。希望能給讀者帶來些參考或啟示,將來在自己的開發(fā)中變通使用。這幾個外設都是STM32芯片最常用、最基礎的外設,掌握之后若能靈活使用,會讓我們的STM32開發(fā)工作更加得心應手。
-
單片機
+關注
關注
6040文章
44592瀏覽量
636901 -
adc
+關注
關注
98文章
6524瀏覽量
545206 -
STM32
+關注
關注
2270文章
10915瀏覽量
356756 -
定時器
+關注
關注
23文章
3254瀏覽量
115070
原文標題:STM32 ADC間斷轉(zhuǎn)換模式應用示例
文章出處:【微信號:stmcu832,微信公眾號:茶話MCU】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論