中斷和觸發路由
在圖17中的示例中,所有事件時間均參考PWM周期;因此,兩個定時器都由PWM SYNC脈沖觸發。PWM sync脈沖作為硬件觸發與ADCC定時器相關聯的前提是配置TRU,使PWM sync脈沖作為主觸發信號與ADCC觸發從機相關聯。隨后,ADCC定時器必須與ADCC觸發相關聯。
圖18顯示相應觸發路由的概念圖;該路由涉及觸發主機19 (PWM0 SYNC)與觸發從機24 (ADCC_TRIG0)之間的連接,本例中該連接可通過將主機編號寫入適當的從機選擇寄存器TRU_SSR24來實現。之后,通過在ADC_CTL寄存器中為TRIGSEL位設置相應的值,將ADCC_TRIG0觸發路由至兩個定時器。

圖18. 從PWM SYNC至ADCC定時器的觸發路由
此觸發路由配置可以提供硬件的直連鏈路,將PWM時序與ADC采樣相關聯,而不會在路徑上產生軟件延遲。觸發主機也可從其他源路由,如GPIO引腳中斷、定時器和計數器事件。如此配置便可提供精確同步,比如與ADSP-CM408F控制的其他轉換器進行采樣同步。
此外,完整的ADCC定時器幀能作為觸發主機與其他外設或核心從機相關聯。
由于本例中采用了DMA傳輸模式,因此所有事件中斷都應當在ADCC_EIMSK寄存器中屏蔽。同樣,提供驅動程序API,用來在寄存器中設置適當的中斷服務例程,實現DMA模式下的幀中斷。
利用觸發路由提供增強型精確采樣時序
像上文所述那樣,要從當前采樣時序中移除片選脈寬滯后,需要稍微不同的觸發路由配置。在此情況中,ADCC定時器是通過GP定時器觸發器觸發的,而該觸發器本身是通過PWM sync觸發的。此序列可參見圖11。
數據訪問和存儲器分配
如圖14和圖15所示,可通過讀取內核MMR訪問ADC數據,或通過DMA傳輸使其能在SRAM中訪問。在內核模式下,無需配置特定存儲器分配,即可實現除變量外的內核MMR讀取數據的寫操作。然而在DMA模式下,必須分配特定的存儲器區域,然后進行配置,才能實現DMA訪問,并且每個定時器都必須配置。所需的存儲器大小取決于每個定時器相關的幀尺寸,以及新的幀覆蓋之前需要在存儲器中存儲多少幀。
表19顯示SRAM映射概念,以及控制SRAM配置的相關ADCC寄存器。ADCC_BPTR寄存器必須存儲指向存儲器基址的指針,才能存儲ADC樣本。若存儲器緩沖器中需要存儲多個幀,則ADCC_FRINC寄存器中應包含指針的偏移值,使其指向下一幀的基址。在線性緩沖模式下(通過向ADCC_CBSIZ寄存器寫入零來激活),會以持續增加的線性化方式在存儲器中存儲額外的幀,中間隔開一個幀的增量值。若向ADCC_CBSIZ寫入非零值M,則會激活循環緩沖,且在幀的基址指針返回ADCC_BPTR值并開始覆蓋現有幀數據之前向存儲器寫入M幀。

圖19. ADC DMA傳輸的存儲器配置
在圖17中的電機控制應用示例中,每個PWM周期都會采集ADC樣本,并即刻用于控制和監控應用中。因此,將樣本以線性方式存儲毫無意義,因為存儲器將很快過載。在此類應用中,最好在啟用循環緩沖時將M限制為1或更小的值,或者將ADCC_FRINC值設為0并在每個PWM周期中覆蓋幀。簡化這項任務的驅動程序應用編程接口(API)可在“ADCC軟件支持”部分找到。
ADCC軟件支持
與ADSP-CM40x EZKIT一同提供的ADI Enablement Software軟件包內含一系列API函數調用命令,可簡化本應用筆記中討論的ADCC模塊設置。這些調用命令監控不同寄存器的正確配置以及需要執行的任何狀態確認。
示例代碼
本應用筆記中的示例代碼逐步說明配置并使用圖17中電機控制應用的方法。器件驅動程序會增加額外開銷,但極大地簡化ADCC模塊寄存器編程。
代碼的第一部分定義一系列參數和配置常數,用于驅動程序API調用。
第1行至第10行定義每個定時器的幀和關聯的數據緩沖器大小。分配樣本緩沖器長度時,將包含系數2作為安全措施,用于調試目的。由于ADC樣本傳輸至存儲器的操作完全通過硬件觸發(包括DMA),因此在將新的緩沖器提交給驅動程序以及復位ADC緩沖器指針之前,如果在第122行插入軟件斷點,則可能導致存儲器被覆寫。以一個額外緩沖作為裕量可防止出現此類調試相關問題。緩沖器中的幀數目定義為1,這表示每次收到新幀,API便會覆寫存儲器緩沖器,即每個定時器僅需針對1個幀進行存儲器分配。
第11行到第16行以ACLK周期數形式定義每個事件的采樣時間,如表3所示。
注意,SMP_TIME1、SMP_TIME2和SMP_TIME3僅以一個ACLK周期分隔。該設置使這些事件在ADC0內以流水線方式進行處理。
第17行至第44行定義每個ADC通道的控制字、6個采樣事件的通道映射,以及數據緩沖器中每個事件的數組索引。
?
第45行至第59行聲明ADC操作所需的變量和函數原型。ADCC存儲器緩沖器和ADCC定時器存儲器緩沖器的存儲器分配大小由API預定義,且不得進行更改。一個ADCC設置函數、一個TRU設置函數以及兩個ISR回調函數(每個ADCC定時器各一個回調函數)對寄存器進行設置。
第60行至91行包含主ADCC配置函數SetupADC()。第一步是設置事件配置表,即含有事件編號、ADC控制字、ADC定時器、同步采樣以及每個事件的存儲器偏置的struct。
正確完成ADCC事件配置后,必須開啟ADCC實例,以及與該實例相關的所有ADCC定時器。然后,必須在寄存器中設置每個定時器幀中斷的驅動程序回調函數名(第72行至73行)。隨后,使能DMA模式(第74行),配置ADCC時鐘和芯片選擇(第75行至第78行)。
第81行將第62行定義的EventCFG指令傳遞至adi_adcc_ConfigEvent驅動程序函數,隨后adi_adcc_SetEventMask驅動程序函數按需使能或屏蔽事件。本例中,使能全部事件。為了獲得最高的ADC吞吐速率,使能雙位數據接口很重要,代碼見第83行,這表示能在8個ADC時鐘周期內傳輸ADC的16位數據。(注意,如果沒有使能雙位接口,則第76行中的NCK以及第77行和第78行中的tCSCS必須分別設為16和17)。然后進行數據緩沖器的存儲器分配,數據緩沖器將提交至ADCC,以便通過adi_adcc_SubmitBuffer調用進行填充。adi_adcc_SubmitBuffer API僅在DMA模式下工作;因此使用該API之前必須先設置DMA模式。該驅動程序函數由主應用程序再次調用(第105行),以便應用程序完成數據提取后將緩沖器歸還給ADCC控制。最終,完成全部配置后,需要使能定時器實例以及ADCC自身。
第92行至第97行包含TRU的設置步驟。它包括開啟TRU實例、將觸發從PWM sync主機路由至ADCC從機,以及使能TRU。
如前文所述,在應用層處理ADC數據由ADCC定時器回調函數實現,該回調函數后跟一個中斷,此中斷在完成定時器事件以及相關的DMA傳輸后發出。
第98至第127行實現回調函數。緩沖數據在緩沖器的相應位置處提取,并保存至適當的全局變量中。本例中,更新后的相位電流數據立即用于電機控制算法中,通過第117行中的算法調用函數MotorControl()從定時器1回調函數中調用。
注意,ADCC事件定時器中斷服務是訪問ADCC數據時發生的唯一軟件調用例程。同步與時序均在硬件層面中實現。
第128行至第136行包含的附加代碼片段可插入TRU和ADCC設置函數,以使能圖11所示的增強型精確采樣時序功能。第128行至第129行中設置了從PWM SYNC至GP定時器TMR7再至ADCC定時器0觸發的硬件觸發路由路徑。第130行至第136行包含的示例代碼可插入ADC設置函數,以正確配置和使能GP定時器TMR7,從而提供正確的延遲。
電子發燒友App












評論