如何量測CLA的任務執行時間?使用PWM的Trip-Zone模式來偵測!

TI生產的C2000系列高階MCU有個特色是CLA協同處理器,全名是Control Law Acclerater。他可以協助MCU進行浮點數運算,同時操作周邊模組如同ADC, GPIO, PWM或者I2C等,達到雙核心計算的效果。但早期的微控制器系列如F28035,沒辦法直接控制GPIO來顯示CLA的運作時間,這時候就只能靠PWM模組來輸出訊號。就讓我們來看看如何設定PWM模組量測CLA執行時間。{alertInfo}

目錄

    CLA簡介

    CLA核心是獨立於C2000核心的計算單元,可以同時與C28x核心同時進行運算,達到並列處理的優勢。CLA大多被應用在計算數位濾波器、數位補償器或者PID控制器的應用。
    CLA運行的程式是以task(任務)為單位,一共有task1-task8 八個任務可供使用者指派。但他沒辦法向C28x和核心一樣有一個背景執行的任務,需要靠外部訊號來觸發CLA進行運算。
    常見用來觸發CLA任務的訊號有EPWM, ADCEOC, EXINT等等,也可以靠C28x核心本身軟體觸發CLA任務執行。而CLA與C28x核心還有一個很重要注意的地方是他們訊息傳遞的方式,也就是記憶體存取的權限。他只能執行儲存在RAM裡面的程式碼,因此在初始化CLA時一定要將CLA task的程式內容透過memcpy把程式從Flash複製到RAM內。
    CLA與CPU的通訊記憶體依據寫入的核心不同,分成CPU to CLA Message與CLA to CPU Message兩種。
    這兩種RAM顧名思義,CPU->CLA Message是CPU可以讀寫,而CLA只能讀取,CLA->CPU Message是CLA可以讀寫但CPU只能讀。這兩個記憶體的實際位址會依據晶片型號有所不同,以F280035為例,CLA->CPU Message起始位址是0x1480,而CPU->CLA Message則是0x1500,如下圖所示:

    PWM模組簡介

    C2000系列MCU如同其他廠商的MCU一樣,有各種不同的周邊模組,PWM模組是專為馬達控制、切換式電源、逆變器與轉換器等等應用獨立設計的。他不僅可以設定兩個訊號輸出為互補模式之外,也可以設定兩個輸出的相位差、頻率、死區時間(dead time)以及工作週期等等。相較於入門MCU使用計時器作為PWM訊號的產生器,獨立的PWM模組帶來的是更可靠的硬體鎖定(lock out),避免因軟體轉寫錯誤產生的損失,如上下臂MOSFET因為死區時間設定錯誤導致短路燒毀。
    他的工作原理是一個可上數、下數或上下數的計數器,透過PWM時脈觸發。當計數器達到一定的值後,可以控制PWM腳位做出特定的行為,如設定為High, Low, 維持不變或者高阻抗。當計數器計數到設定的週期值後,便會重新歸零開始計算。
    PWM模組需要先設定時脈樹(clock tree),並且設定PWM的頻率,並設定數位比較器來調整工作週期。舉例來說可以設定一個時脈樹等於核心時脈,並且頻率是80kHz的方波,同時將計數器的數字設定在50%頻率,當計數到50%時將腳位設為Low, 數到週期時則重新設為High。這樣就得到一個80kHz, 50% Duty的方波。這裡只提供一個初始化模組的思路,詳細的數值還是要參考MCU的Datasheet為準。
    
        // Initial EPWM4 module to 80kHz, 50% duty
        EPwm4Regs.TBCTR                     = 0;                // Clear counter
        EPwm4Regs.TBPRD                     = BOOST_TBPRD-1;    // 80kHz boost
    
        EPwm4Regs.TBCTL.bit.HSPCLKDIV       = 1;
        EPwm4Regs.TBCTL.bit.CLKDIV          = 1;
        EPwm4Regs.TBCTL.bit.PHSEN           = 0;       			//Disable sync
        EPwm4Regs.TBCTL.bit.SYNCOSEL        = TB_SYNC_IN;       //TB_SYNC_DISABLE;
    
        EPwm4Regs.TBPHS.half.TBPHS          = 0;
        EPwm4Regs.TBCTL.bit.PRDLD           = TB_SHADOW;        // Enable shadow register
        EPwm4Regs.TBCTL.bit.CTRMODE         = TB_COUNT_UP;      // Up-Count mode
        EPwm4Regs.TBCTL.bit.FREE_SOFT       = 2;                // Free_Run
    
        EPwm4Regs.CMPCTL.bit.SHDWAMODE      = CC_SHADOW;        // Enable shadow register
        EPwm4Regs.CMPCTL.bit.LOADAMODE      = CC_CTR_PRD;       // Load shadow register on CTR = PRD
        EPwm4Regs.CMPA.half.CMPA            = BOOST_DUTY_L;
    
        EPwm4Regs.AQCTLA.bit.ZRO            = AQ_SET;           // Set EPWMA when counter equals Zero
        EPwm4Regs.AQCTLA.bit.CAU            = AQ_CLEAR;         // clear EPWMA when counter equals CMPA at up-count
        

    量測CLA運行時間

    TI提供常見的CLA量測方法,第一種是透過另一組PWM模組或者CPU Timer在背景計時,當執行到CLA任務的時候透過ctr1抓取當下的技術器值,而結束的時候再用ctr2抓取計數器值,兩者相減並除上PWM的時脈週期就是執行時間。這種方法優點是設定簡單容易直覺,但缺點是沒辦法用示波器直接量測實際運行時的時間,需要透過除錯器(Debugger)連接並監控變數的數值才能看到效果。
    
      	ctr1 = EPwm1Regs.TBCTR;
    	//
    	//..... code to be measured here .....
    	//
    	ctr2 = EPwm1Regs.TBCTR;
    	delta_t = ctr2 - ctr1;
      
    另一種GPIO不適用在F28035 MCU,這也是你會點進來這篇文章的原因之一。如同上面所說的,我們要把EPWM腳位A當成GPIO使用,首先要先設定好頻率與週期,這邊隨便設定就可以了,因為我們並不會真的用到它。
    
        // EPWM3  configuration - CLA task measuring
    
        EPwm3Regs.TBCTR = 0;
        EPwm3Regs.TBPRD = 6000 - 1;        // EPWM3 frequency is 10kHz
        // Configure EPWM to run at SYSCLK
        EPwm3Regs.TBCTL.bit.HSPCLKDIV   = TB_DIV1;
        EPwm3Regs.TBCTL.bit.CLKDIV      = TB_DIV1;
        EPwm3Regs.TBCTL.bit.PHSEN       = TB_DISABLE;
        EPwm3Regs.TBCTL.bit.SYNCOSEL    = TB_CTR_ZERO;          // sync at counter = 0
      
    接著設定PWM計數器歸零與數到指定數字時,EPWM3 A腳位的輸出都是低電位,因此把AQCTLA都設定成0。
    
        EPwm3Regs.AQCTLA.bit.ZRO        = AQ_CLEAR;           //EPWMA CLEAR
        EPwm3Regs.AQCTLA.bit.CAU        = AQ_CLEAR;		 	  //EPWMA CLEAR
      
    再來把EPWM模組的Trip-Zone打開,這個模組是用來緊急“絆住”輸出的,大多數用在保護功能上,如OCP, OVP等等。這裡設定有TZ事件(DCAEVT1)發生的時候,將輸出設定為High。
    
        EPwm3Regs.TZSEL.bit.DCAEVT1     = TZ_ENABLE;            // Enable DCAEVT1 to trigger OSHT trip
        EPwm3Regs.TZCTL.bit.DCAEVT1     = TZ_FORCE_HI;          // EPWM3A does nothing particular to DCAEVT1
      
    最後設定好EPWM是上數模式,並且啟動EPWM輸出。別忘了EALLOW與EDIS這兩個保護指令。
    
        EPwm3Regs.TBCTL.bit.CTRMODE     = TB_COUNT_UP;          // up count mode
        EPwm3Regs.TBCTL.bit.PRDLD       = TB_IMMEDIATE;         // set Immediate load
        // ...
        SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;   // Enable TBCLK
    
      
    在CLA程式碼內,使用TZFRC暫存器的OST(Oneshot Mode)來強制觸發TZ事件,但還有要注意的事情是CLA裏面不能直接使用EALLOW或EDIS這種組語巨集,需要使用__meallow()與__medis來代替:
    
      	// Force triggrt DCAEVT1
        __meallow();
        EPwm3Regs.TZFRC.bit.OST = 1;
        __medis();
        //
        //... CLA code to measure performance
        //
        // Force reset DCAEVT1
        __meallow();
        EPwm3Regs.TZCLR.bit.OST = 1;
        __medis();
       
    以上就是使用CLA來觸發EPWM並使用示波器觀看執行時間的範例介紹,詳細的設定方式還是要以MCU資料手冊為準!

    CLA task運算量比較

    拿到實際情況下測試,黃色是CLA執行時間的波形,紅色是CLA觸發訊號(這邊綁定在ADCINT1_ISR),藍色是ADCINT2_ISR的執行時間。從這個例子來看,CLA被吃好吃滿,本來預計是要以80kHz觸發的訊號現在因為執行時間太久降到30kHz左右才能觸發。

    結論

    使用較舊的C2000系列DSP,因為技術問題沒辦法在CLA內操作GPIO Register。這邊文章用EPWM的Trip-Zone達到跟GPIO相同的效果。
    首先設定EPWM的行為都是低準位,接著啟用TZ暫存器。在CLA內用TZFRC.bit.OST來強制觸發Oneshot的Trip-Zone事件,事件發生就會強制將PWM設定成High。接著使用TZCLR.bit.OST來清除事件,讓腳為回歸低準位。使用這種方法可以更直觀的觀察到CLA效能與執行時間,還有任務跟其他中斷訊號的相互關係。

    參考資料

  1. CLA Debugging Tips - TI
  2. TMSF28035 Data Sheet - TI
  3. CLA Frequently Asked Question - TI
  4. Post a Comment

    留個言吧

    較新的 較舊