EQEP如何使用問題

2019-07-17 16:24发布

本帖最后由 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;

}

0条回答

一周热门 更多>