我使用F28335的公板進行馬達控制,設定ePWM的中斷頻率為20kHz(50us),當馬達在等速時,理論上每一個epwm中斷時所得到的encoder counts應該大致相同,但是卻發生會有誤差50counts的情形,因此,懷疑中斷時間的準確性,想要檢測中斷時間是否相同。
有使用以下的方式進行測試,
1. 開啟CCS6.0 clock
run->clock->enable
run->clock->setup,cycle
2. 程式碼:.
#include <time.h>
clock_t start,stop,substraction,start1[100];
main{
start=clock();
stop=clock();
substraction=stop-start; //檢測過約等於430
}
interrupt void epwmisr(void)
{
GpioDataRegs.GPADAT.bit.GPIO8=1;
if (i<100) start1[i]=clock();
/*我的程式*/ EPwm1Regs.ETCLR.bit.INT = 1; PieCtrlRegs.PIEACK.all = PIEACK_GROUP3; GpioDataRegs.GPADAT.bit.GPIO8=0;
}
3.將start1[100]中的資料,後一個減掉前一個,例如,start1[1]-start[0],這一百筆資料相減的結果大致都會為1800~1835間,再減掉substraction=430,結果為1370~1405。
想請問的是。
1.若中斷程式未加if (i<100) start1[i]=clock();,利用示波器觀察GPIO8可以發現中斷時間是準確的20us,但是,加入if (i<100) start1[i]=clock();再觀察GPIO8會發現中斷時間不準確,這樣利用clock()所得到的值會是準確的嗎?
2.假設clock()所得到的值會是準確,F28335為150MHz,因此,中斷時間計算為(1/150MHz)*1370=9.13us,和我設定的中斷時間不相符,我的計算有錯誤嗎?
3.還有其他方式可以檢測ePWM中斷時間嗎?
謝謝!
Tim Huang:
回复 囧:
我設定timer0,利用CpuTimer0Regs.TIM.all這個暫存器就可以計數!
因此,我後一筆減前一筆的值為7500,7500*(1/150MHz)=50us。
謝謝你的回答。