作者:賽普拉斯半導體公司 胡泊 通過ADC進行信號采樣是MCU應用的常見任務,這可以將連續模擬信號轉換為一系列離散的數字數據供MCU處理。在某些應用中,單個ADC需要以高采樣率對多個通道進行采樣。例如電源監測系統的管理子系統需要對多個穩壓電源的輸出進行采樣,以監測系統的工作狀態;再如在基于傳感器的應用中,MCU需要對多個傳感器進行采樣以實現系統反饋。 我們有位客戶想使用一片賽普拉斯的PSoC4實現用1MSps采樣率采樣16個通道的設計,16個通道的總采樣時長不能超過19μs。但PSoC4內置的多路復用器(SARMUX)只支持8個通道。本文將介紹如何通過PSoC內部的可編程模塊克服這一設計難題。 分析設計需求 首先我們需要仔細分析設計需求。客戶把16個輸入的完整采樣視為一個采樣周期。如圖1所示,一個采樣周期的最大時長限制為19μs。每個采樣周期之間可使用中斷服務請求(ISR)存儲采樣結果。 ![]() 圖1:對16通道采樣的時序。 若要用一個8通道SAR來實現這個目標,我們需要使用PSoC4片內的通用可編程數字模塊(UDB)實現定制設計。該設計使用PSoC4片內的數字信號互聯(DSI)實現多路復用器切換采樣通道,并且在采樣周期結束時將采樣結果緩沖在基于數據通路(datapath)的FIFO中,然后通過中斷服務子程序(ISR)全部讀取出來。 數據通路是UDB模塊中最靈活的部分。每個UDB模塊包含一個數據通路,每個數據通路包含一個具有多個寄存器的8位ALU。UDB結構和數據通路功能的詳細介紹請參閱PSoC4技術參考手冊。每個數據通路可實現一個8字節FIFO。我們需要四個FIFO來緩沖16個12位SAR采樣結果。 ![]() 圖2:16通道SAR采樣。 圖2顯示的是基于DSI的多路復用器,能在多個輸入之間自動切換當前的采樣通道。圖3顯示的是硬件FIFO的概覽圖。 ![]() 圖3:用于緩沖采樣結果的四個8字節FIFO。 配置SAR組件 SAR被配置成單端模式采樣單個輸入通道,輸入電壓范圍在0~Vdd之間,1MSps采樣率。在收到采樣觸發信號后,SAR就開始輸入信號采集,采集結束后產生一個“SDONE”信號,該信號被送入DSI網絡,并被命名為“ADC_SDONE”。PSoC Creator標準組件庫中提供的SAR組件無法支持輸出采樣結果到DSI總線上。因此,我們需要把SAR組件導入到項目中并加以修改,如圖4中的紅色部分所示。 ![]() 圖4:詳細設計—修改SAR組件。 圖5所示的是SAR組件的輸出連接。在SAR_Start函數之后,我們還需要添加一行代碼,使得SAR能將采樣結果輸出到DSI網絡,如下所示: // start SAR component and wait for conversion trigger SAR_Start();? // enable SAR sampling result output on DSI *((reg32 *)(SAR_SAR_CHAN_CONFIG_IND + (uint32)(0 << 2))) |= SAR_DSI_OUT_EN; ![]() 圖5:詳細設計—SAR的輸出連接。 基于DSI的多路復用器 如圖6中藍色部分所示,通過DSI控制的硬件多路復用器取代SARMUX,以用于切換16個通道。采用SWITCH_CLK時鐘觸發Count7單元,以生成通道選擇信號,這樣每次通道轉換可分為兩個階段:信號采集和轉換。 ![]() 圖6:基于DSI的MUX和觸發信號生成。 信號采集完成之后,信號將保持在SAR中,此時可切換輸入通道。因此用于顯示信號采集階段完成的SDONE可用于通道切換。實際上,SWITCH_CLK是基于DSI信號“ADC_SDONE”(SDONE)定義的時鐘,其設置見圖6的“cydwr”頁面。 ![]() 圖7:設計范圍資源的時鐘定義。 Count7單元屬于定制組件,不在標準組件庫的范圍內。它是一個遞減計數器,輸出當前的計數器值給DSI。其默認值初始值為0x7F。因此通道選擇的范圍是從#15到#0。在主程序中添加以下代碼實現對Count7的控制。 /* Enter critical section */ interruptState = CyEnterCriticalSection(); /* Set the Count Start bit */ MYCOUNT7_AUX_CTL |= (1 << 5); /* Exit critical section */ CyExitCriticalSection(interruptState); // set default value of count7 as 0x7F MYCOUNT7_COUNTER = MYCOUNT7_PERIOD; 生成SAR的采樣觸發 第1步:在完成當前采樣工作之前生成下一個觸發信號 由于針對SAR只有一個實際輸入,因此一旦完成對當前通道的采樣,SAR就需要為下一次采樣觸發信號。許多信號都適用于此目的,但觸發信號選擇應遵循以下兩個規則: 1. 在觸發信號和當前采樣完成之間不應存在間隔,甚至觸發信號可以提前發生,這樣就可以降低延遲。 2. 觸發信號必須確保不會破壞當前采樣工作。 根據上述規則,可選擇SDONE和EOC用于觸發。但使用EOC將使每通道采樣時間至~1.4μs,這是因為觸發信號上升沿時刻和SAR開始采樣之間存在開銷。SAR需要至少5個SARADC_CLK時鐘來將DSI觸發信號轉換為信號采樣開始。我們的設計要求更加苛刻。EOC信號與SARADC_CLK上升沿同步。在穿過DSI網絡,并到達SAR的SOC(開始轉換)之后,就已經略滯后于采樣時鐘的上升沿。因此,它需要6個SARADC_CLK時鐘或大約340ns觸發產生耗時。 我們必須尋求另一種觸發信號。幸運的是在SAR工作時,其可存儲一個觸發信號,但僅限一個,用于下一次掃描。因此我們可以使用SDONE觸發轉換。讓觸發產生耗時與SAR轉換時間并行,SAR就可在當前轉換完成之前存儲該觸發事件。現在對16通道的采樣我們能有1μs的轉換時間(見圖12中的SDONE周期)。 第2步:在每次采樣周期結束時暫時停止觸發信號生成 在每次采樣周期結束時,我們需要暫時停止觸發信號生成,否則持續不斷的采樣將使FIFO溢出。如圖6的紅色部分所示,在選擇通道0時,需關閉同步的D觸發器(DFF)以暫時停止觸發器輸出。而在FIFO被ISR清空后,則需使用0x7F重置Count7單元,從而重新啟用DFF輸出。同時,應使用固件觸發的方式在新周期中開始第一通道的采樣,如圖8所示。 ![]() 圖8:SAR ADC時序。 FIFO控制 UDB可配置為8字節FIFO,用于存儲來自DSI網絡的數據。圖9顯示了配置數據通路的概覽圖。FIFO時鐘將數據采樣到FIFO。F0 Load和F1 Load負責啟用或禁用FIFO。兩個狀態信號可提示FIFO Full事件。 ![]() 圖9:針對8字節FIFO的數據路徑配置。 圖10所示的是FIFO的工作時序。12位SAR結果分別存儲在LSB_FIFO和MSB_FIFO中。Count7單元可對從15到0的通道進行排序。因此通道15到8存儲于FIFO上部,通道7到0存儲于FIFO下部。加載信號根據FULL狀態和啟用信號而生成。 ![]() 圖10:FIFO時序。 最后四個通道的結果一旦存儲完畢后就會觸發ISR讀取FIFO。FIFO Enable使用Count7單元的位(如圖11的紅色部分所示),同時該位也與SWITCH_CLK(SDONE)同步。這樣可確保EN變化不會破壞FIFO采樣。 ![]() 圖11:為FIFO生成EN的詳細設計。 設計測試 圖12所示的是一個采樣周期。十六個SDONE和EOC脈沖表示通道轉換。十六個FIFOCLK和一個FIFO的FULL信號可對最后四個結果進行緩沖,用于說明FIFO的工作狀態。請注意,SDONE和FIFOCLK之間的間隔是1μs。 ![]() 圖12:測試結果——一個采樣周期中的信號。 圖13是多個采樣周期的波形。將數據從FIFO存儲到SRAM的兩個周期之間的間隔是大約9.56μs。 ![]() 圖13:測試結果——多個采樣周期。 |