引言
MindSDK為MM32主流的微控制器,實現(xiàn)了一組ADC樣例工程。本文通過講解ADC模塊的樣例工程,介紹ADC模塊的功能和用法。關(guān)于ADC模塊對應(yīng)的驅(qū)動程序,以及ADC外設(shè)模塊硬件的實現(xiàn)細節(jié),可具體查閱MindSDK工程的源文件,以及MM32微控制器(例如MM32F5270)的用戶手冊。
樣例工程
MindSDK中為ADC驅(qū)動設(shè)計的樣例工程包括:
adc_basic
adc_interrupt
adc_dma
adc_seq
adc_fixed_seq
adc_ext_seq
adc_awdg
adc_oversample
adc_sw_write_calib
其中, adc_baic 、 adc_interrupt 、 adc_dma 分別演示了ADC最典型的功能,包括通過輪詢、中斷、DMA來獲取一個ADC轉(zhuǎn)換通道的轉(zhuǎn)換結(jié)果。adc_awdg 來展現(xiàn)ADC模擬看門狗的功能, adc_seq 、 adc_fixed_seq 、 adc_ext_seq 則展現(xiàn)ADC按照不同的轉(zhuǎn)換序列來進行轉(zhuǎn)換。還有一些用于特殊場景的功能,例如通過軟件寫入校準(zhǔn)值,以及硬件實現(xiàn)的多次采樣取平均值、基本濾波等。
adc_basic
adc_basic 描述了使用ADC模塊最基本的方式,通過輪詢方式對一個通道進行轉(zhuǎn)換,并獲取通道的轉(zhuǎn)換值。在樣例工程中,通過 ADC_Init() 函數(shù),配置ADC數(shù)據(jù)有效數(shù)據(jù)位 ADC_Resolution_Alt0 ,ADC的轉(zhuǎn)換模式為單通道單次轉(zhuǎn)換模式 ADC_ConvMode_SingleSlot 、轉(zhuǎn)換數(shù)據(jù)對其方式為右對齊 ADC_Align_Right 、通道轉(zhuǎn)化結(jié)果通過單端轉(zhuǎn)換方式,將通道與ADC內(nèi)部參考電壓VREF的差數(shù)字量化后輸出 ADC_SingleDiffConvMode_SingleEnd 、配置單端轉(zhuǎn)換方式的參考電壓為內(nèi)部參考電壓 ADC_SingleConvVref_Internal ,配置待轉(zhuǎn)換通道的序列和每個轉(zhuǎn)換通道的采樣周期。之后,每次通過 ADC_DoSwTrigger() 函數(shù),使用軟件觸發(fā)的方式啟動ADC轉(zhuǎn)換。
實際運行程序時,用戶在串口調(diào)試終端中每次輸入任意字符,改變轉(zhuǎn)換通道的輸入電壓,會看到串口終端界面對應(yīng)數(shù)值的變化。
adc_interrupt
adc_interrupt 相對于 adc_basic 樣例工程,實現(xiàn)了ADC轉(zhuǎn)換完成后觸發(fā)中斷服務(wù),在中斷服務(wù)中獲取轉(zhuǎn)換值的用法。
其實現(xiàn)原理,是在 adc_basic 的配置的基礎(chǔ)上,通過 ADC_EnableInterrupts() 函數(shù)和 NVIC_EnableIRQ()函數(shù)開啟ADC的中斷。當(dāng)ADC轉(zhuǎn)換通道完成轉(zhuǎn)換后,就進入中斷服務(wù)函數(shù)。
實際運行程序時,用戶在串口調(diào)試終端每次輸入任意字符,改變轉(zhuǎn)換通道的輸入電壓,會看到串口終端界面對應(yīng)數(shù)值的變化。
adc_dma
adc_dma 在 adc_basic 的基礎(chǔ)上增加對DMA外設(shè)模塊的使用。在應(yīng)用層 app_adc_init() 函數(shù)中添加對DMA通道的配置,通過 DMA_InitChannel() 函數(shù), DMA_XferMode_PeriphToMemory 配置傳輸方向為外設(shè)到內(nèi)存、 MemAddr 和 PeriphAddr 配置內(nèi)存和外設(shè)地址、 MemAddrIncMode 和 PeriphAddrIncMode 配置內(nèi)存和外設(shè)的增量模式、 XferCount 傳輸?shù)臄?shù)據(jù)量、 DMA_ReloadMode_AutoReloadContinuous 自動重載傳輸量、 DMA_XferWidth_32b 以32位的數(shù)據(jù)進行傳輸。外設(shè)映射的DMA通道初始配置完成后,通過 DMA_EnableChannel() 函數(shù)使能DMA通道,通過 NVIC_EnableIRQ() 和 DMA_EnableChannelInterrupts() 函數(shù)開啟DMA中斷。之后,每次通過 ADC_DoSwTrigger() 函數(shù)觸發(fā)ADC開始轉(zhuǎn)換,當(dāng)轉(zhuǎn)換完成后DMA開始搬運,當(dāng)DMA搬運完成后進入中斷服務(wù)函數(shù),以此循環(huán)往復(fù)。
實際運行程序時,用戶在串口調(diào)試終端中每次輸入任意字符,改變轉(zhuǎn)換通道的輸入電壓,會看到串口終端界面對應(yīng)數(shù)值的變化。
adc_fixed_seq
adc_fixed_seq 在 adc_dma 樣例的基礎(chǔ)上,將轉(zhuǎn)換的ADC通道由一個通道,設(shè)置為多個通道形成一個序列來進行轉(zhuǎn)換,當(dāng)序列轉(zhuǎn)換完成后,就停止轉(zhuǎn)換。通過 ADC_EnableSeqSlotFixed() 函數(shù)來配置轉(zhuǎn)換序列的順序為有低到高的順序進行轉(zhuǎn)換。DMA將ADC每個通道數(shù)據(jù)搬運到指定內(nèi)存。通過在循環(huán)中調(diào)用 ADC_DoSwTrigger() 函數(shù)來進行一個序列的多次轉(zhuǎn)換?;蛘咄ㄟ^ ADC_ConvMode_SeqContinues 啟用序列的連續(xù)轉(zhuǎn)換模式。通過 ADC_DoSwTrigger() 函數(shù)可以停止序列轉(zhuǎn)換。
實際運行程序時,用戶在串口調(diào)試終端中每次輸入任意字符,改變配置的轉(zhuǎn)換序列中每個通道的輸入電壓值,會看到串口調(diào)試終端界面對應(yīng)數(shù)值變化。
adc_seq
adc_seq 與 adc_fixed_seq 樣例的不同之處在于, adc_fixed_seq 樣例只能實現(xiàn)一個由高到低或者由低到的通道轉(zhuǎn)換序列進行轉(zhuǎn)換,例如ch0-ch1-ch3或者ch3-ch1-ch0的轉(zhuǎn)換順序。adc_seq 樣例則實現(xiàn)任意通道序列的轉(zhuǎn)換,例如ch3-ch0-ch5,任意的序列。通過ADC_EnableSeqSlot () 函數(shù)配置具體的轉(zhuǎn)換序列。ADC根據(jù)配置的轉(zhuǎn)換序列開始進行轉(zhuǎn)換。當(dāng)序列轉(zhuǎn)換完成后,停止轉(zhuǎn)換??梢灾貜?fù)的調(diào)用 ADC_DoSwTrigger() 開啟下一個序列的轉(zhuǎn)換,一次循環(huán)往復(fù)?;蛘咄ㄟ^ ADC_ConvMode_SeqContinues 啟用序列的連續(xù)轉(zhuǎn)換模式。通過 ADC_DoSwTrigger() 函數(shù)可以停止序列轉(zhuǎn)換。
實際運行程序時,用戶在串口調(diào)試終端中每次輸入任意字符,改變轉(zhuǎn)換通道的輸入電壓,會看到串口終端界面對應(yīng)數(shù)值的變化。
adc_ext_seq
adc_ext_seq 實現(xiàn)在當(dāng)前任意序列轉(zhuǎn)換過程中插入額外的序列,當(dāng)插入額外的序列時,當(dāng)前任意序列中正在轉(zhuǎn)換的通道完成,將切換到插入的序列中進行轉(zhuǎn)換,當(dāng)轉(zhuǎn)換完成后在繼續(xù)之前任意序列中剩余通道的轉(zhuǎn)換。通過 ADC_EnableExtSeqSlot() 函數(shù)配置額外的序列。例如當(dāng)前任意序列為ch3-ch0-ch5,額外的序列為ch1-ch4。ADC_EnableAutoExtSeqSlot() 函數(shù)開啟自動注入模式,即任意序列轉(zhuǎn)換完成后,開啟注入通道的轉(zhuǎn)換,轉(zhuǎn)換額外的序列。這種注入模式增加了整個序列的長度。當(dāng)一個完整序列轉(zhuǎn)換完成后,停止轉(zhuǎn)換,調(diào)用 ADC_DoSwTrigger() 函數(shù)來進行一個序列的多次轉(zhuǎn)換?;蛘咄ㄟ^ ADC_ConvMode_SeqContinues 啟用序列的連續(xù)轉(zhuǎn)換模式。通過 ADC_DoSwTrigger() 函數(shù)可以停止序列轉(zhuǎn)換。
實際運行時,用戶在串口調(diào)試終端中每次輸入任意字符,改變轉(zhuǎn)換通道的輸入電壓,會看到串口終端界面對應(yīng)數(shù)值的變化。
adc_awdg
adc_awdg 在 adc_basic 的基礎(chǔ)上增加對轉(zhuǎn)換結(jié)果進行監(jiān)控,通過 ADC_EnableHwComp() 函數(shù)配置需要監(jiān)控的轉(zhuǎn)換通道 ChnNum 、設(shè)置的上限值 HighLimit 和下限值 LowLimit ,可以根據(jù)上限值和下限值的大小關(guān)系設(shè)置監(jiān)控范圍,當(dāng)上限值大于或等于下限值時,監(jiān)控通道的轉(zhuǎn)換值在兩個閾值之外的數(shù)值,若開啟中斷則會進入中斷服務(wù)函數(shù);同理,當(dāng)上限值小于下限值時,監(jiān)控通道轉(zhuǎn)換值在兩個閾值之間的數(shù)值,若開啟中斷則會進入中斷服務(wù)函數(shù)。之后,每次通過 ADC_DoSwTrigger() 函數(shù),使用軟件觸發(fā)的方式啟動ADC轉(zhuǎn)換。
實際運行時,用戶在串口調(diào)試終端中每次輸入任意字符,改變轉(zhuǎn)換通道的輸入電壓,當(dāng)電壓值滿足監(jiān)控區(qū)間時,會看到串口終端界面當(dāng)前轉(zhuǎn)換數(shù)據(jù)。
adc_oversample
adc_oversample 在 adc_seq 的基礎(chǔ)上通過 ADC_SetOverSample()`函數(shù)啟動硬件的過采樣模式, ADC_OverSampleRatio_256 配置過采樣率為256, ADC_OverSampleDataDiv_8 配置數(shù)據(jù)右移8位, ADC_OverSampleTriggerMode_Multi 配置為所有通道的過采樣轉(zhuǎn)換只需要進行一次觸發(fā)。injectOverSampleMode 配置是否開啟注入通道的過采樣模式。之后,每次通過 ADC_DoSwTrigger() 函數(shù),使用軟件觸發(fā)的方式啟動ADC轉(zhuǎn)換。
adc_sw_write_calib
adc_sw_write_calib 在 adc_basic 的基礎(chǔ)上實現(xiàn)使用軟件保存ADC的校準(zhǔn)值,然后通過軟件將校準(zhǔn)值寫入寄存器中。通過 ADC_GetCalibFactor() 函數(shù)獲取校準(zhǔn)值,通過 ADC_SetCalibFactor() 來寫入校準(zhǔn)值。
審核編輯:劉清
-
微控制器
+關(guān)注
關(guān)注
48文章
7948瀏覽量
154896 -
濾波器
+關(guān)注
關(guān)注
162文章
8134瀏覽量
181987 -
串口中斷
+關(guān)注
關(guān)注
0文章
67瀏覽量
14338 -
ADC轉(zhuǎn)換器
+關(guān)注
關(guān)注
1文章
28瀏覽量
8512 -
ADC模塊
+關(guān)注
關(guān)注
1文章
19瀏覽量
11244
原文標(biāo)題:靈動微課堂 (第268講)|MindSDK應(yīng)用基礎(chǔ)——ADC模塊樣例
文章出處:【微信號:MindMotion-MMCU,微信公眾號:靈動MM32MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
Hardware Semaphore 2 樣例工程
STM32多個ADC模塊同時采樣轉(zhuǎn)換的應(yīng)用示例

MindSDK概述、使用方法及應(yīng)用案例
基于OpenHarmony開發(fā)樣例的步驟
AUTOSAR MCAL-基于Infineon TC3xx芯片的ADC模塊
為MindSDK搭建Keil MDK開發(fā)環(huán)境

MindSDK中FlexCAN驅(qū)動程序及樣例工程

評論