中斷和觸發(fā)路由
在圖17中的示例中,所有事件時間均參考PWM周期;因此,兩個定時器都由PWM SYNC脈沖觸發(fā)。PWM sync脈沖作為硬件觸發(fā)與ADCC定時器相關(guān)聯(lián)的前提是配置TRU,使PWM sync脈沖作為主觸發(fā)信號與ADCC觸發(fā)從機(jī)相關(guān)聯(lián)。隨后,ADCC定時器必須與ADCC觸發(fā)相關(guān)聯(lián)。
圖18顯示相應(yīng)觸發(fā)路由的概念圖;該路由涉及觸發(fā)主機(jī)19 (PWM0 SYNC)與觸發(fā)從機(jī)24 (ADCC_TRIG0)之間的連接,本例中該連接可通過將主機(jī)編號寫入適當(dāng)?shù)膹臋C(jī)選擇寄存器TRU_SSR24來實(shí)現(xiàn)。之后,通過在ADC_CTL寄存器中為TRIGSEL位設(shè)置相應(yīng)的值,將ADCC_TRIG0觸發(fā)路由至兩個定時器。
圖18. 從PWM SYNC至ADCC定時器的觸發(fā)路由
此觸發(fā)路由配置可以提供硬件的直連鏈路,將PWM時序與ADC采樣相關(guān)聯(lián),而不會在路徑上產(chǎn)生軟件延遲。觸發(fā)主機(jī)也可從其他源路由,如GPIO引腳中斷、定時器和計(jì)數(shù)器事件。如此配置便可提供精確同步,比如與ADSP-CM408F控制的其他轉(zhuǎn)換器進(jìn)行采樣同步。
此外,完整的ADCC定時器幀能作為觸發(fā)主機(jī)與其他外設(shè)或核心從機(jī)相關(guān)聯(lián)。
由于本例中采用了DMA傳輸模式,因此所有事件中斷都應(yīng)當(dāng)在ADCC_EIMSK寄存器中屏蔽。同樣,提供驅(qū)動程序API,用來在寄存器中設(shè)置適當(dāng)?shù)闹袛喾?wù)例程,實(shí)現(xiàn)DMA模式下的幀中斷。
利用觸發(fā)路由提供增強(qiáng)型精確采樣時序
像上文所述那樣,要從當(dāng)前采樣時序中移除片選脈寬滯后,需要稍微不同的觸發(fā)路由配置。在此情況中,ADCC定時器是通過GP定時器觸發(fā)器觸發(fā)的,而該觸發(fā)器本身是通過PWM sync觸發(fā)的。此序列可參見圖11。
數(shù)據(jù)訪問和存儲器分配
如圖14和圖15所示,可通過讀取內(nèi)核MMR訪問ADC數(shù)據(jù),或通過DMA傳輸使其能在SRAM中訪問。在內(nèi)核模式下,無需配置特定存儲器分配,即可實(shí)現(xiàn)除變量外的內(nèi)核MMR讀取數(shù)據(jù)的寫操作。然而在DMA模式下,必須分配特定的存儲器區(qū)域,然后進(jìn)行配置,才能實(shí)現(xiàn)DMA訪問,并且每個定時器都必須配置。所需的存儲器大小取決于每個定時器相關(guān)的幀尺寸,以及新的幀覆蓋之前需要在存儲器中存儲多少幀。
表19顯示SRAM映射概念,以及控制SRAM配置的相關(guān)ADCC寄存器。ADCC_BPTR寄存器必須存儲指向存儲器基址的指針,才能存儲ADC樣本。若存儲器緩沖器中需要存儲多個幀,則ADCC_FRINC寄存器中應(yīng)包含指針的偏移值,使其指向下一幀的基址。在線性緩沖模式下(通過向ADCC_CBSIZ寄存器寫入零來激活),會以持續(xù)增加的線性化方式在存儲器中存儲額外的幀,中間隔開一個幀的增量值。若向ADCC_CBSIZ寫入非零值M,則會激活循環(huán)緩沖,且在幀的基址指針返回ADCC_BPTR值并開始覆蓋現(xiàn)有幀數(shù)據(jù)之前向存儲器寫入M幀。
圖19. ADC DMA傳輸?shù)拇鎯ζ髋渲?/p>
在圖17中的電機(jī)控制應(yīng)用示例中,每個PWM周期都會采集ADC樣本,并即刻用于控制和監(jiān)控應(yīng)用中。因此,將樣本以線性方式存儲毫無意義,因?yàn)榇鎯ζ鲗⒑芸爝^載。在此類應(yīng)用中,最好在啟用循環(huán)緩沖時將M限制為1或更小的值,或者將ADCC_FRINC值設(shè)為0并在每個PWM周期中覆蓋幀。簡化這項(xiàng)任務(wù)的驅(qū)動程序應(yīng)用編程接口(API)可在“ADCC軟件支持”部分找到。
ADCC軟件支持
與ADSP-CM40x EZKIT一同提供的ADI Enablement Software軟件包內(nèi)含一系列API函數(shù)調(diào)用命令,可簡化本應(yīng)用筆記中討論的ADCC模塊設(shè)置。這些調(diào)用命令監(jiān)控不同寄存器的正確配置以及需要執(zhí)行的任何狀態(tài)確認(rèn)。
示例代碼
本應(yīng)用筆記中的示例代碼逐步說明配置并使用圖17中電機(jī)控制應(yīng)用的方法。器件驅(qū)動程序會增加額外開銷,但極大地簡化ADCC模塊寄存器編程。
代碼的第一部分定義一系列參數(shù)和配置常數(shù),用于驅(qū)動程序API調(diào)用。
第1行至第10行定義每個定時器的幀和關(guān)聯(lián)的數(shù)據(jù)緩沖器大小。分配樣本緩沖器長度時,將包含系數(shù)2作為安全措施,用于調(diào)試目的。由于ADC樣本傳輸至存儲器的操作完全通過硬件觸發(fā)(包括DMA),因此在將新的緩沖器提交給驅(qū)動程序以及復(fù)位ADC緩沖器指針之前,如果在第122行插入軟件斷點(diǎn),則可能導(dǎo)致存儲器被覆寫。以一個額外緩沖作為裕量可防止出現(xiàn)此類調(diào)試相關(guān)問題。緩沖器中的幀數(shù)目定義為1,這表示每次收到新幀,API便會覆寫存儲器緩沖器,即每個定時器僅需針對1個幀進(jìn)行存儲器分配。
第11行到第16行以ACLK周期數(shù)形式定義每個事件的采樣時間,如表3所示。
注意,SMP_TIME1、SMP_TIME2和SMP_TIME3僅以一個ACLK周期分隔。該設(shè)置使這些事件在ADC0內(nèi)以流水線方式進(jìn)行處理。
第17行至第44行定義每個ADC通道的控制字、6個采樣事件的通道映射,以及數(shù)據(jù)緩沖器中每個事件的數(shù)組索引。
?
第45行至第59行聲明ADC操作所需的變量和函數(shù)原型。ADCC存儲器緩沖器和ADCC定時器存儲器緩沖器的存儲器分配大小由API預(yù)定義,且不得進(jìn)行更改。一個ADCC設(shè)置函數(shù)、一個TRU設(shè)置函數(shù)以及兩個ISR回調(diào)函數(shù)(每個ADCC定時器各一個回調(diào)函數(shù))對寄存器進(jìn)行設(shè)置。
第60行至91行包含主ADCC配置函數(shù)SetupADC()。第一步是設(shè)置事件配置表,即含有事件編號、ADC控制字、ADC定時器、同步采樣以及每個事件的存儲器偏置的struct。
正確完成ADCC事件配置后,必須開啟ADCC實(shí)例,以及與該實(shí)例相關(guān)的所有ADCC定時器。然后,必須在寄存器中設(shè)置每個定時器幀中斷的驅(qū)動程序回調(diào)函數(shù)名(第72行至73行)。隨后,使能DMA模式(第74行),配置ADCC時鐘和芯片選擇(第75行至第78行)。
第81行將第62行定義的EventCFG指令傳遞至adi_adcc_ConfigEvent驅(qū)動程序函數(shù),隨后adi_adcc_SetEventMask驅(qū)動程序函數(shù)按需使能或屏蔽事件。本例中,使能全部事件。為了獲得最高的ADC吞吐速率,使能雙位數(shù)據(jù)接口很重要,代碼見第83行,這表示能在8個ADC時鐘周期內(nèi)傳輸ADC的16位數(shù)據(jù)。(注意,如果沒有使能雙位接口,則第76行中的NCK以及第77行和第78行中的tCSCS必須分別設(shè)為16和17)。然后進(jìn)行數(shù)據(jù)緩沖器的存儲器分配,數(shù)據(jù)緩沖器將提交至ADCC,以便通過adi_adcc_SubmitBuffer調(diào)用進(jìn)行填充。adi_adcc_SubmitBuffer API僅在DMA模式下工作;因此使用該API之前必須先設(shè)置DMA模式。該驅(qū)動程序函數(shù)由主應(yīng)用程序再次調(diào)用(第105行),以便應(yīng)用程序完成數(shù)據(jù)提取后將緩沖器歸還給ADCC控制。最終,完成全部配置后,需要使能定時器實(shí)例以及ADCC自身。
第92行至第97行包含TRU的設(shè)置步驟。它包括開啟TRU實(shí)例、將觸發(fā)從PWM sync主機(jī)路由至ADCC從機(jī),以及使能TRU。
如前文所述,在應(yīng)用層處理ADC數(shù)據(jù)由ADCC定時器回調(diào)函數(shù)實(shí)現(xiàn),該回調(diào)函數(shù)后跟一個中斷,此中斷在完成定時器事件以及相關(guān)的DMA傳輸后發(fā)出。
第98至第127行實(shí)現(xiàn)回調(diào)函數(shù)。緩沖數(shù)據(jù)在緩沖器的相應(yīng)位置處提取,并保存至適當(dāng)?shù)娜肿兞恐小1纠校潞蟮南辔浑娏鲾?shù)據(jù)立即用于電機(jī)控制算法中,通過第117行中的算法調(diào)用函數(shù)MotorControl()從定時器1回調(diào)函數(shù)中調(diào)用。
注意,ADCC事件定時器中斷服務(wù)是訪問ADCC數(shù)據(jù)時發(fā)生的唯一軟件調(diào)用例程。同步與時序均在硬件層面中實(shí)現(xiàn)。
第128行至第136行包含的附加代碼片段可插入TRU和ADCC設(shè)置函數(shù),以使能圖11所示的增強(qiáng)型精確采樣時序功能。第128行至第129行中設(shè)置了從PWM SYNC至GP定時器TMR7再至ADCC定時器0觸發(fā)的硬件觸發(fā)路由路徑。第130行至第136行包含的示例代碼可插入ADC設(shè)置函數(shù),以正確配置和使能GP定時器TMR7,從而提供正確的延遲。
評論