本帖最后由 youmark2001 于 2017-4-28 16:45 编辑
有人知道我現在在做ENCODER的進入DSP我是用3.3V A B Z進去DSP 進入腳位是P8 6PIN 7PIN 8PIN腳位,可是我進去之後我只能看到我的數值一值跑 但是我知道要如何應用在後面 我想要做ENCODER得到角度去做後續的轉速運算跟馬達頻率運算,我想請問一下我後續這邊要怎麼做才可以實現? 因為是新手剛接觸DSP想請問板上的各位大大可以給我個指導嗎 我程式如下幫我看一下哪裡有寫錯還是要修改謝謝
void EQEP_Init(void) //eQEP_Init副程式
{
#if (CPU_FRQ_150MHZ)
EQep1Regs.QUPRD=150000; // 1000HZ=0.1mS
// 這個暫存器包含在單位時間中做週期的計數來產生週期性的
// 單位時間中斷",來鎖存eQEP的位置訊息,並可以選擇在定期
// 間隔產生中斷,即用這個時間來定期產生中斷,再用中斷副程
// 式來把偵測Encoder所計數到的值存起來
#endif
EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO20 = 1; // Enable pullup on GPIO20 (EQEP1A)
GpioCtrlRegs.GPAPUD.bit.GPIO21 = 1; // Enable pullup on GPIO21 (EQEP1B)
GpioCtrlRegs.GPAPUD.bit.GPIO22 = 0; // Enable pullup on GPIO22 (EQEP1S)
GpioCtrlRegs.GPAPUD.bit.GPIO23 = 1; // Enable pullup on GPIO23 (EQEP1I)
GpioCtrlRegs.GPAQSEL2.bit.GPIO20 = 3; // Synch to SYSCLKOUT
GpioCtrlRegs.GPAQSEL2.bit.GPIO21 = 3; // Synch to SYSCLKOUT
GpioCtrlRegs.GPAQSEL2.bit.GPIO22 = 0; // Synch to SYSCLKOUT
GpioCtrlRegs.GPAQSEL2.bit.GPIO23 = 3; // Synch to SYSCLKOUT
GpioCtrlRegs.GPAMUX2.bit.GPIO20 = 1; // GPIO20 = EQEP1A
GpioCtrlRegs.GPAMUX2.bit.GPIO21 = 1; // GPIO21 = EQEP1B
GpioCtrlRegs.GPAMUX2.bit.GPIO22 = 0; // GPIO22 = EQEP1S
GpioCtrlRegs.GPAMUX2.bit.GPIO23 = 1; // GPIO23 = EQEP1I
EDIS;
/*QDECCTL控制器*/
EQep1Regs.QDECCTL.bit.QSRC = 01; //向上計數模式頻率,測量設定頻率量測計數方式為上數,此暫存器設定位置控制器計數方式
EQep1Regs.QDECCTL.bit.SOEN = 1; //啟用位置比較同步輸出
EQep1Regs.QDECCTL.bit.SPSEL = 0; //索引引腳用於同步輸出
EQep1Regs.QDECCTL.bit.XCR = 0; //2倍分辨率:計數的上升/下降緣,此暫存器設定計數上緣或上下源皆計數
/*QEPCTL控制暫存器*/
EQep1Regs.QEPCTL.bit.FREE_SOFT = 0x2; //設定Position counter.Watchdog.Unit timer.Capture Timer不受模擬器的引響而停止
EQep1Regs.QEPCTL.bit.PCRM = 0x0; //在索引事件設定位置計數器在index腳位(Z點)產生信號時reset
EQep1Regs.QEPCTL.bit.QPEN = 1; //啟用eQEP位置計數器
EQep1Regs.QEPCTL.bit.QCLM = 1; //單位時間內鎖定。位置計數器設定Position counter.capture timer和capture period的值在單位時間輸出時分別鎖存到QPOSLAT.QCTMRLAT和QCPRDLAT暫存器中,此暫存器設定eQEP的捕捉拴鎖模式
EQep1Regs.QEPCTL.bit.UTE = 0; // eQEP單位定時器禁用
/*QPOSCTL相位比較控制暫存器*/
EQep1Regs.QPOSCTL.bit.PCSHDW = 1; //位置比較陰影啟用
EQep1Regs.QPOSCTL.bit.PCLOAD = 0; //位置比較陰影加載模式(載入QPOSCNT = 0)
EQep1Regs.QPOSCTL.bit.PCPOL = 0; //同步輸出極性,高電平有效脈衝輸出
EQep1Regs.QPOSCTL.bit.PCE = 1; //啟用位置比較單位
EQep1Regs.QPOSCTL.bit.PCSPW = 0x000; //選擇位置比較同步輸出脈衝寬度,1 * 4 * SYSCLKOUT週期
/*QCAPCTL偵測控制暫存器*/
EQep1Regs.QCAPCTL.bit.CEN = 1; //啟用eQEP捕獲單元
EQep1Regs.QCAPCTL.bit.CCPS = 0x0; // eQEP捕獲定時器時鐘預分頻器,設定eQEP捕捉計數器時脈為CAPCLK = SYSCLKOUT/128,即除頻=(7)
EQep1Regs.QCAPCTL.bit.UPPS = 0x0; //設定CAPCLK = SYSCLKOUT/1 = 150MHz,此暫存器設定eQEP單元的除頻器
/*QPOSMAX最大位置計數器*/
EQep1Regs.QPOSMAX = 8000; //設定位置計數器最大的值
/*QCLR中斷清除暫存器*/
EQep1Regs.QCLR.bit.INT = 1; //清除中斷標誌,如果事件標誌設置為1,則允許生成進一步的中斷
/*QEINT超時中斷力暫存器*/
EQep1Regs.QEINT.bit.UTO = 1; //單位超時中斷使能
} //eQEP_Init副程式結束
中斷副程式
interrupt void EQEP_isr(void) //(eQEP)encoder計數器中斷副程式
{
!!EQep1Regs.QPOSCNT; //該32位位置計數器寄存器根據方向在每個eQEP脈衝上向上/向下計數輸入。該計數器作為位置積分器,其計數值與位置成比例從給出參考點。
EQep1Regs.QPOSINIT; //該寄存器包含用於初始化位置計數器的位置值,基於外部選通或索引事件。位置計數器可以通過軟件進行初始化。
EQep1Regs.QPOSCMP; //將該寄存器中的位置比較值與位置計數器(QPOSCNT)進行比較在比較匹配時生成同步輸出和/或中斷。
EQep1Regs.QPOSILAT; //位置計數器值在索引事件上鎖存到該寄存器中,如QEPCTL [IEL]位。
EQep1Regs.QPOSLAT; //在單位超時事件中,位置計數器值被鎖存到該寄存器中。
EQep1Regs.QUTMR; //該寄存器用作生成單位時間事件的時基。當此計時器值匹配時單位時間值,生成單位時間事件。
!!EQep1Regs.QCTMR; //65535此寄存器為邊緣捕獲單元提供時基。
!!EQep1Regs.QCPRD; //該寄存器保存最後連續的eQEP位置事件之間的周期計數值
EQep1Regs.QCTMRLAT; //可以在兩個事件上將eQEP捕獲定時器值鎖存到該寄存器中,即單位超時事件,讀取eQEP位置計數器。
EQep1Regs.QCPRDLAT; //eQEP捕獲週期值可以在兩個事件上被鎖存到該寄存器中,即單位超時事件,讀取eQEP位置計數器。
EQep1Regs.QCLR.bit.INT = 1; // 清除中斷旗標並致能中斷
PieCtrlRegs.PIEACK.all = 0x0010;
}
|