[TOC] # 前言 - 本篇以實現Event Manager的QEP功能為目標,介紹QEP設定 - 見 <Event Manager(EV)Reference Guide> 3.5節 和 <手把手教你DSP> 12.5節 - F2812 有兩個QEP電路可直接判斷計數,想實現更多QEP功能只能靠軟體方式判斷計數完成 # EV 的 QEP ## QEP 簡介 - 見[新訓FPGA](https://hackmd.io/gcwxE_ENSviIpOjB_HLSuQ#%E6%96%B0%E8%A8%93%E9%A0%85%E7%9B%AE3-%E2%80%93-QEP) - DSP內置的QEP電路能偵測編碼器A、B相的變化並且判別計數增減,解析度能提升到編碼器脈衝數的4倍 - 每個 EV 各有一個QEP電路,每個QEP各有兩支接腳 - EVA : <font color="red">CAP1_QEP1、CAP2QEP2</font> - EVB : <font color="red">CAP4_QEP3、CAP5QEP4</font> ## 工作原理 ### QEP結構 - EVA的QEP對應<font color="red"> EV_timer2 </font>的計數, EVB的QEP對應<font color="red"> EV_timer4 </font>的計數 - CAPCONx 的 bit 13、14 控制接腳CAPx_QEPy 引腳是否作為捕獲功能的輸入,但從架構圖來看接腳式直接進去QEP電路的,因此不用做QEP輸入始能的相關操作 - TxCON 的 bit 4、5 決定 timer 的計數時鐘來源是否來自QEP -  -  ### 暫存器設定 - TxCON 的 TCLKS (bit 5、4) 設為(1, 1)可設定計時器基於QEP輸入 - 先前已經知道TxCNT會計數到T2PR - 1的值便歸零,可以設定 <p class="text-center"> T2PR的值 = 編碼器 pulse 數 *4 -1 </p> 如此計數到T2PR的值也剛好旋轉一圈 # QEP實作範例 ## 設定流程 - 選用EVA的QEP,設定timer2 控制暫存器 - 時鐘源選QEP - 計數模式改為 directional-up/down mode - timer2 預除頻設為1 - 啟用timer2 - 設定設定timer2 週期暫存器 - GPIO設定為QEP輸入 ## 範例程式 ``` c++= //======== GPTCONx Parameter =========== // Compare Output enable #define GPTIM_CO_ENABLE 1 #define GPTIM_CO_DISABLE 0 // Compare Polarity #define GPTIM_CP_FORCED_LOW 0 #define GPTIM_CP_EFF_LOW 1 #define GPTIM_CP_EFF_HIGH 2 #define GPTIM_CP_FORCED_HIGH 3 //======== TxCON Parameter =========== #define UP_DOWN_COUNTING_MODE 1 #define UP_COUNTING_MODE 2 #define DIR_UP_DOWN_COUNTING_MODE 3 #define GPTIM_PRESCALAR_1 0 #define GPTIM_PRESCALAR_2 1 #define GPTIM_PRESCALAR_4 2 #define GPTIM_PRESCALAR_8 3 #define GPTIM_PRESCALAR_16 4 #define GPTIM_ENABLE 1 #define GPTIM_DISABLE 0 #define GPTIM_CLK_SRC_INTERNAL 0 #define GPTIM_CLK_SRC_EXTERNAL 1 #define GPTIM_CLK_SRC_RESERVED 2 #define GPTIM_CLK_SRC_QEPINTERNAL 3 #define GPTIM_CAP_ENABLE 1 #define GPTIM_CAP_DISABLE 0 void GPIO_select(void){ // for IMU GPIO pin select EALLOW; // Set GPIO A pin 8 as QEP input . GpioMuxRegs.GPAMUX.bit.CAP1Q1_GPIOA8 = 1; GpioMuxRegs.GPADIR.bit.GPIOA8 = 0; // Set GPIO A pin 9 as QEP input GpioMuxRegs.GPAMUX.bit.CAP2Q2_GPIOA9 = 1 GpioMuxRegs.GPADIR.bit.GPIOA9 = 0; EDIS; } void init_eva_timer2(void){ // Using for QEP. //--------------------------------------------------------------------------- // Set the Period for the GP timer 2 EvaRegs.T2PR = ENCODER_PULSE * 4; // Period EvaRegs.T2CNT = 0; // Set the counter for GP timer 2 //--------------------------------------------------------------------------- // directional-Up/-Down count mode. // Input clock prescaler = x/1. // Then Timer enable. // EvaRegs.T2CON.all = 0xD870; // 11-0-11-000-0-1-11-00-0-0 EvaRegs.T2CON.bit.FREE = 1; EvaRegs.T2CON.bit.SOFT = 1; EvaRegs.T2CON.bit.TMODE = DIR_UP_DOWN_COUNTING_MODE; EvaRegs.T2CON.bit.TPS = GPTIM_PRESCALAR_1; EvaRegs.T2CON.bit.TCLKS10 = GPTIM_CLK_SRC_QEPINTERNAL; EvaRegs.T2CON.bit.TENABLE = GPTIM_ENABLE; } interrupt void eva_timer1_isr(void){ // ISR Task //--------------------------------------------------------------------------- count = EvaRegs.T2CNT; EvbRegs.T3CMPR = count*10; // Enable more interrupts from this timer //--------------------------------------------------------------------------- EvaRegs.EVAIMRA.bit.T1PINT = 1; // Clear Interrupt Flag //--------------------------------------------------------------------------- // Note: To be safe, use a mask value to write to the entire // EVAIFRA register. Writing to one bit will cause a read-modify-write // operation that may have the result of writing 1's to clear // bits other then those intended. EvaRegs.EVAIFRA.bit.T1PINT = 1; //--------------------------------------------------------------------------- // Acknowledge interrupt to receive more interrupts from PIE group 2 PieCtrlRegs.PIEACK.all = PIEACK_GROUP2; return; } ```
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.