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