簡介
YTM32的ADC轉(zhuǎn)換器外設(shè)最多可以集成32個輸入通道,最高12b轉(zhuǎn)換精度,最快可以支持2M Sps的12b采樣。ADC轉(zhuǎn)換器外設(shè)內(nèi)部的主要結(jié)構(gòu),如圖x所示,包括ADC輸入通道復(fù)用器、ADC轉(zhuǎn)換器、FIFO等。
圖x ADC外設(shè)模塊框圖
YTM32B1ME上集成了兩個ADC轉(zhuǎn)換器,每個轉(zhuǎn)換器實際僅對外開放了24個輸入通道,并且ADC0還在芯片內(nèi)部綁定了若干采樣點(所謂的external channel
)。如圖x所示。
圖x ADC在芯片內(nèi)部綁定的采樣信號
ADC作為一個模擬外設(shè),通常會使用兩個時鐘源:使用總線時鐘驅(qū)動數(shù)字部分的電路,例如通過總線訪問寄存器等;通過功能時鐘驅(qū)動模擬部分的ADC轉(zhuǎn)換器工作。如圖x所示。
圖x ADC外設(shè)的總線時鐘和功能時鐘
這里有兩個要點:
- 通過IPC可以選擇ADC轉(zhuǎn)換器的輸入時鐘源。實際上,ADC的模擬電路部分也不一定能消化掉來自于IPC的時鐘源,內(nèi)部還專門設(shè)計的分頻器。模擬電路對頻率敏感,因此特定的電路也會要求能夠處理的頻率信號在一定范圍內(nèi)。YTM32的ADC轉(zhuǎn)換器最高可以使用16MHz的時鐘信號作為ADC轉(zhuǎn)換器的時鐘源。
- 模擬和數(shù)字部分在交換數(shù)據(jù)時,需要處理同步(同支持高頻率的定時器)。
ADC采樣的時序,通常包含采樣(Sampling)和保持(Holding)兩個階段,如圖x所示。采樣和保持在ADC的時鐘驅(qū)動下工作,時間越長,采樣的結(jié)果越接近真實值,但速度也會變慢。若用戶需要使用更快的采樣速度,只要提高ADC轉(zhuǎn)換時鐘和縮短采樣保持階段的時間即可,但產(chǎn)生的轉(zhuǎn)換結(jié)果就可能損失一些準(zhǔn)確度了。
圖x ADC轉(zhuǎn)換中的采樣保持時間
YTM32的ADC外設(shè),為了有效地使用電能,將ADC轉(zhuǎn)換器上電和掉電的控制接口也開放給用戶了。要知道,ADC作為一個模擬外設(shè),是個耗電大戶(另一個耗電大戶是PLL),如果在不需要執(zhí)行ADC轉(zhuǎn)換任務(wù)的階段停電,可能有效減少功耗,也能控制芯片的發(fā)熱。但是,ADC上電和下電過程,也都是需要一定時間的,上電過程需要等待供電穩(wěn)定后才能啟動ADC轉(zhuǎn)換任務(wù),ADC需要把正在執(zhí)行的任務(wù)執(zhí)行完畢,清理好工作現(xiàn)場之后才能順利下電。這些時間,都將會在使用ADC轉(zhuǎn)換器的過程中由用戶配置。
原理與機(jī)制
ADC轉(zhuǎn)換器的上下電和省電模式
MCU上電后,軟件通過IPC模塊,為ADC外設(shè)模塊開放了總線時鐘供應(yīng),但此時,ADC轉(zhuǎn)換器的供電還沒有加上,ADC外設(shè)模塊處于掉電模式(Off State,power-down mode)。若要啟用ADC轉(zhuǎn)換器,需由用戶先設(shè)定ADC_CTRL[ADEN]=1
,開始為ADC轉(zhuǎn)換器供電,待t_startup(約2us)后,ADC轉(zhuǎn)換器供電穩(wěn)定,硬件置寄存器位ADC_CTRL[ADRDY]=1
,告知用戶可以啟動轉(zhuǎn)換。此時請求ADC開始轉(zhuǎn)換,軟件觸發(fā)設(shè)定寄存器ADC_CTRL[ADSTART]=1
,才正式啟動ADC轉(zhuǎn)換。如圖x所示。
圖x ADC轉(zhuǎn)換器的信號時序
注意,圖x中的ADSTART信號在ADRDY之前置位,同前文講述等待ADRDY置位后才拉起ADSTART不同。這展示了一種典型的情況:ADSTART只是請求不是命令,只有當(dāng)ADRDY置位之后,ADC轉(zhuǎn)換器才能啟動。
ADC_CTRL[ADDIS]=1
可以直接給ADC轉(zhuǎn)換器斷電。但為了確保ADC內(nèi)部的狀態(tài)機(jī)不會被打亂,建議先通過ADC_CTRL[ADSTOP]=1
請求停止轉(zhuǎn)換任務(wù),在確保ADC轉(zhuǎn)換器已經(jīng)不再執(zhí)行任何轉(zhuǎn)換任務(wù)后,再給ADC轉(zhuǎn)換器斷電。
關(guān)于給ADC轉(zhuǎn)換器斷電的操作,YTM32的ADC外設(shè)還設(shè)計了一些“自動化”的供電管理機(jī)制,自動斷電Auto-Off
模式,對應(yīng)寄存器開關(guān)ADC_CFG0[AUTOOFF]
。
- 默認(rèn)未啟動自動斷電模式時,用戶一為ADC轉(zhuǎn)換器建立穩(wěn)定的供電后,若無人為停用,則對ADC轉(zhuǎn)換器持續(xù)供電。下次啟動轉(zhuǎn)換也不需要等上電穩(wěn)定。
- 若啟用自動斷電模式,則一旦ADC轉(zhuǎn)換器閑下來就自動斷電,在下次轉(zhuǎn)換任務(wù)的觸發(fā)信號到來時可自動喚醒恢復(fù)供電。此時,每次啟動轉(zhuǎn)換任務(wù),ADC轉(zhuǎn)換器都要等上電穩(wěn)定(t_startup)后再啟動轉(zhuǎn)換。這個模式下,原本硬件反饋供電穩(wěn)定的
ADC_CTRL[ADRDY]
標(biāo)志位將不再起作用(置位)。
啟用自動斷電模式后,執(zhí)行每次轉(zhuǎn)換任務(wù)之前,都需要重新等待供電穩(wěn)定的時間t_startup,這無疑影響了ADC的連續(xù)轉(zhuǎn)換速率。但大多數(shù)情況下,應(yīng)用對連續(xù)轉(zhuǎn)換速率沒有特別高的要求,使用啟動斷電模式可以在簡化用戶操作的前提下(不需要人工上電斷電),有效降低ADC轉(zhuǎn)換器的動態(tài)功耗。
ADC轉(zhuǎn)換結(jié)果和FIFO
ADC外設(shè)內(nèi)部設(shè)計了一個32-bit x 16
的FIFO,按照轉(zhuǎn)換完成的順序,依次存入轉(zhuǎn)換完成的結(jié)果。用戶從寄存器ADC_FIFO
作為讀FIFO的入口,可以依次讀出轉(zhuǎn)換結(jié)果。
FIFO中的數(shù)據(jù)單元包含轉(zhuǎn)換結(jié)果對應(yīng)的通道ADC_FIFO[CHID]
和轉(zhuǎn)換數(shù)值ADC_FIFO[DATA]
,無論設(shè)定的轉(zhuǎn)換分辨率(ADC_CFG[RES]
)是多少,數(shù)值固定右對齊的。如圖x所示。
ADC FIFO中的轉(zhuǎn)換結(jié)果
當(dāng)FIFO填滿了未能及時讀走的轉(zhuǎn)換數(shù)據(jù),ADC外設(shè)設(shè)計了兩種機(jī)制處理后來的數(shù)據(jù),一種是Overrun Mode
,另一個是Wait Mode
:
Overrun Mode
描述的是,當(dāng)新的轉(zhuǎn)換結(jié)果到來時,是覆蓋FIFO中最近一次轉(zhuǎn)換結(jié)果,還是直接拋棄掉新的轉(zhuǎn)換結(jié)果。由寄存器ADC_CFG0[OVRMD]
控制啟用。Wait Mode
描述的是,當(dāng)FIFO滿的時候,直接給ADC轉(zhuǎn)換器斷電(類似于Auto-Off
模式)。只有當(dāng)FIFO有空位的時候,才能給ADC轉(zhuǎn)換器供電。由寄存器ADC_CFG0[WAIT]
控制啟用。
ADC轉(zhuǎn)換隊列的工作模式
ADC的轉(zhuǎn)換過程,是由多個單通道的轉(zhuǎn)換任務(wù)串起來的轉(zhuǎn)換隊列,由寄存器字段ADC_CFG0[SEQLEN]
由觸發(fā)信號驅(qū)動執(zhí)行轉(zhuǎn)換過程。YTM32的ADC外設(shè)模塊中,設(shè)計了多種觸發(fā)機(jī)制,以不同的節(jié)奏執(zhí)行轉(zhuǎn)換隊列中的轉(zhuǎn)換任務(wù)。通過配置寄存器位ADC_CFG0[DISCEN]
和ADC_CFG0[CONT]
,對應(yīng)有Single
模式、Continuou
模式和Discontinuous
模式。
表x ADC轉(zhuǎn)換隊列的工作模式
圖x ADC轉(zhuǎn)換隊列的工作模式
ADC轉(zhuǎn)換器的觸發(fā)信號
ADC外設(shè)模塊可以捕獲軟件觸發(fā)和硬件觸發(fā)信號(一個上升沿脈沖信號),以啟動轉(zhuǎn)換任務(wù)。觸發(fā)信號無論是來自于軟件觸發(fā)還是硬件觸發(fā),對于啟動轉(zhuǎn)換的作用是完全相同的,但ADC僅允許使用其中一種觸發(fā)模式,由寄存器ADC_CFG0[TRIGMD]
選定。
- 當(dāng)
ADC_CFG0[TRIGMD]=0
,軟件觸發(fā)可由用戶寫寄存器ADC_CTRL[ADCSTART]=1
產(chǎn)生。 - 當(dāng)
ADC_CFG0[TRIGMD]=1
,還需要設(shè)定寄存器ADC_CTRL[ADCSTART]=1
解鎖硬件觸發(fā)信號(同步),硬件觸發(fā)的信號可以來自于芯片上的其它外設(shè)模塊。
硬件觸發(fā)信號大多來自于TMU(Trigger Multiplexer Module)或者PTU模塊(Programmable Trigger Unit),可以通過CIM(Chip Integration Module)模塊的寄存器CIM_CTRL[ADCn_TRIG_SEL]
選擇ADC外設(shè)外部的觸發(fā)信號源:
- Raw signal which from the PTU module (CIM->CTRL[ADCn_TRIG_SEL]=0)
- Signal from the TMU module and synchronized by bus clock (CIM->CTRL[ADCn_TRIG_SEL]=1)
- Signal from the TMU module and synchronized by function clock (CIM->CTRL[ADCn_TRIG_SEL]=2)
ADC轉(zhuǎn)換器的看門狗
YTM32微控制器的ADC外設(shè)設(shè)計了看門狗的功能,這個功能在同類的設(shè)計中,還有一個更直觀的名字,“硬件自動比較”。意思是通過為采樣轉(zhuǎn)換結(jié)果設(shè)置一個高限ADC_WDTH[HIGH]
和低限ADC_WDTH[LOW]
框起來的正常數(shù)值區(qū)間,每次ADC執(zhí)行轉(zhuǎn)換完成后,硬件都自動將轉(zhuǎn)換結(jié)果同預(yù)設(shè)的正常數(shù)值區(qū)間進(jìn)行比較,當(dāng)采樣結(jié)果過高(高于高限)或者過低(低于底限),都會觸發(fā)一個超出預(yù)設(shè)范圍的事件(可以觸發(fā)中斷)。這個功能通常用于實現(xiàn)對傳感器的監(jiān)控。某些MCU上設(shè)計ADC可以使用異步時鐘在低功耗模式下繼續(xù)存活,就會用到這個硬件自動判定超限的機(jī)制,只有當(dāng)出現(xiàn)異常采樣時,才喚醒CPU對環(huán)境做進(jìn)一步的判斷。
然而,當(dāng)下的這款A(yù)DC最多可以保存16個轉(zhuǎn)換結(jié)果(在FIFO中)和24個采樣通道,但沒有為16個轉(zhuǎn)換結(jié)果或者24個采樣通道分別安排上限值寄存器和下限值寄存器。 這里有個機(jī)制,通過寄存器ADC_WDCTRL[WDSGL]
選擇:
- 當(dāng)
ADC_WDCTRL[WDSGL]=0
時,硬件比較的機(jī)制會作用于FIFO的入口,任何通道的轉(zhuǎn)換結(jié)果進(jìn)入FIFO時,都會被比較,有可能觸發(fā)超事件。 - 當(dāng)
ADC_WDCTRL[WDSGL]=1
時,硬件自動比較會現(xiàn)定于某個指定的通道,通道號設(shè)置于寄存器字段ADC_WDCTRL[WDCHSEL]
中。
另外,還有控制位ADC_WDTH[THMD]
,可以設(shè)定在ADC轉(zhuǎn)換的結(jié)果是限定區(qū)域之內(nèi)觸發(fā)超限事件還是在限定區(qū)域之外。如圖x所示。
圖x 硬件自動比較的有效范圍
中斷事件和DMA
ADC轉(zhuǎn)換器能夠觸發(fā)中斷的事件,主要是面向轉(zhuǎn)換任務(wù)和轉(zhuǎn)換隊列的執(zhí)行轉(zhuǎn)換任務(wù)完成的情況,ADC外設(shè)甚至對ADC轉(zhuǎn)換器上電成功和采樣階段結(jié)束也設(shè)計中斷事件。
ADC的DMA是基于FIFO設(shè)計的。用戶可以在寄存器ADC_CFG0[WM]中設(shè)定產(chǎn)生DMA觸發(fā)信號的FIFO有效數(shù)據(jù)數(shù)量的閾值,當(dāng)FIFO中已經(jīng)填入的轉(zhuǎn)換結(jié)果數(shù)量達(dá)到預(yù)設(shè)的閾值時,ADC外設(shè)會向DMAMUX發(fā)出DMA觸發(fā)信號,預(yù)設(shè)的DMA搬運任務(wù)將一次性從ADC的FIFO中搬運走預(yù)設(shè)數(shù)量(可以小于等于預(yù)設(shè)的數(shù)量閾值)的轉(zhuǎn)換結(jié)果、
FIFO的閾值事件是可以產(chǎn)生DMA的觸發(fā)信號的同時,也可以產(chǎn)生中斷的觸發(fā)信號。根據(jù)設(shè)計慣例,當(dāng)同一個事件的DMA和中斷觸發(fā)開關(guān)同時打開時,DMA的優(yōu)先級更高,中斷信號不會發(fā)出。否則,如果在中斷服務(wù)程序中將FIFO中的數(shù)據(jù)讀走了,給DMA搬運的數(shù)據(jù)不夠多,F(xiàn)IFO就會產(chǎn)生下溢錯。
應(yīng)用要點(軟件)
YTMicro SDK中包含了YTM32的ADC外設(shè)模塊的驅(qū)動程序adc_driver
,并提供了關(guān)于ADC外設(shè)的樣例工程,包括:adc
、adc_dma
、adc_all_channels
等。
總結(jié)
YTM32的手冊對ADC外設(shè)模塊進(jìn)行了基本的介紹,列寫了ADC外設(shè)模塊開放給用戶的資源,本文對YTM32的ADC外設(shè)模塊的功能進(jìn)行演繹,更為細(xì)致地講解了ADC外設(shè)模塊及各功能的運行機(jī)制,方便用戶充分理解ADC外設(shè)模塊并結(jié)合應(yīng)用利用好在ADC中設(shè)計的硬件資源。同時,本文也是對一種ADC外設(shè)模塊的系統(tǒng)架構(gòu)設(shè)計進(jìn)行了較為細(xì)致的分析,推演了ADC外設(shè)模塊的設(shè)計方法,可以為從事芯片設(shè)計的系統(tǒng)架構(gòu)設(shè)計師們在設(shè)計IP時提供參考。
-
看門狗
+關(guān)注
關(guān)注
10文章
557瀏覽量
70667 -
復(fù)用器
+關(guān)注
關(guān)注
1文章
705瀏覽量
28242 -
模數(shù)轉(zhuǎn)換器
+關(guān)注
關(guān)注
26文章
3063瀏覽量
126661 -
FIFO存儲
+關(guān)注
關(guān)注
0文章
103瀏覽量
5953 -
ADC轉(zhuǎn)換器
+關(guān)注
關(guān)注
1文章
28瀏覽量
8306
發(fā)布評論請先 登錄
相關(guān)推薦
評論