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