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