From 0837df22dd4a2482d31b9acbc9e88f8ac45dd1fd Mon Sep 17 00:00:00 2001 From: clough42 Date: Sun, 12 Jan 2020 17:20:02 -0700 Subject: [PATCH] Add configuration to use second encoder (EQEP2) (#46) * Add setting to use second encoder. * Got EQEP2 working. Rolled version number. --- els-f280049c/Configuration.h | 6 ++++ els-f280049c/Encoder.cpp | 66 +++++++++++++++++++++------------- els-f280049c/Encoder.h | 10 +++++- els-f280049c/SanityCheck.h | 4 +++ els-f280049c/UserInterface.cpp | 2 +- 5 files changed, 62 insertions(+), 26 deletions(-) diff --git a/els-f280049c/Configuration.h b/els-f280049c/Configuration.h index c6dcace..5486775 100644 --- a/els-f280049c/Configuration.h +++ b/els-f280049c/Configuration.h @@ -89,8 +89,14 @@ // four times the number of pulses. For example, if you have a 1024 P/R // encoder, you need to enter 4096 here. //================================================================================ + +// Encoder resolution (counts per revolution) #define ENCODER_RESOLUTION 4096 +// Which encoder input to use +#define ENCODER_USE_EQEP1 +//#define ENCODER_USE_EQEP2 + diff --git a/els-f280049c/Encoder.cpp b/els-f280049c/Encoder.cpp index fa12e1f..e9b6c64 100644 --- a/els-f280049c/Encoder.cpp +++ b/els-f280049c/Encoder.cpp @@ -38,45 +38,63 @@ void Encoder :: initHardware(void) { EALLOW; - GpioCtrlRegs.GPBPUD.bit.GPIO35 = 0; // Enable pull-up on GPIO20 (EQEP1A) - GpioCtrlRegs.GPBPUD.bit.GPIO37 = 0; // Enable pull-up on GPIO21 (EQEP1B) - GpioCtrlRegs.GPBPUD.bit.GPIO59 = 0; // Enable pull-up on GPIO23 (EQEP1I) +#ifdef ENCODER_USE_EQEP1 + GpioCtrlRegs.GPBPUD.bit.GPIO35 = 0; // Enable pull-up on GPIO35 (EQEP1A) + GpioCtrlRegs.GPBPUD.bit.GPIO37 = 0; // Enable pull-up on GPIO371 (EQEP1B) + GpioCtrlRegs.GPBPUD.bit.GPIO59 = 0; // Enable pull-up on GPIO59 (EQEP1I) - GpioCtrlRegs.GPBQSEL1.bit.GPIO35 = 0; // Sync to SYSCLKOUT GPIO20 (EQEP1A) - GpioCtrlRegs.GPBQSEL1.bit.GPIO37 = 0; // Sync to SYSCLKOUT GPIO21 (EQEP1B) - GpioCtrlRegs.GPBQSEL2.bit.GPIO59 = 0; // Sync to SYSCLKOUT GPIO23 (EQEP1I) + GpioCtrlRegs.GPBQSEL1.bit.GPIO35 = 0; // Sync to SYSCLKOUT GPIO35 (EQEP1A) + GpioCtrlRegs.GPBQSEL1.bit.GPIO37 = 0; // Sync to SYSCLKOUT GPIO37 (EQEP1B) + GpioCtrlRegs.GPBQSEL2.bit.GPIO59 = 0; // Sync to SYSCLKOUT GPIO59 (EQEP1I) - GpioCtrlRegs.GPBMUX1.bit.GPIO35 = 1; // Configure GPIO20 as EQEP1A + GpioCtrlRegs.GPBMUX1.bit.GPIO35 = 1; // Configure GPIO35 as EQEP1A GpioCtrlRegs.GPBGMUX1.bit.GPIO35 = 2; - GpioCtrlRegs.GPBMUX1.bit.GPIO37 = 1; // Configure GPIO20 as EQEP1A + GpioCtrlRegs.GPBMUX1.bit.GPIO37 = 1; // Configure GPIO37 as EQEP1B GpioCtrlRegs.GPBGMUX1.bit.GPIO37 = 2; - GpioCtrlRegs.GPBMUX2.bit.GPIO59 = 3; // Configure GPIO20 as EQEP1A + GpioCtrlRegs.GPBMUX2.bit.GPIO59 = 3; // Configure GPIO59 as EQEP1I GpioCtrlRegs.GPBGMUX2.bit.GPIO59 = 2; +#endif +#ifdef ENCODER_USE_EQEP2 + GpioCtrlRegs.GPAPUD.bit.GPIO14 = 0; // Enable pull-up on GPIO14 (EQEP2A) + GpioCtrlRegs.GPAPUD.bit.GPIO15 = 0; // Enable pull-up on GPIO15 (EQEP2B) + GpioCtrlRegs.GPAPUD.bit.GPIO26 = 0; // Enable pull-up on GPIO26 (EQEP2I) + + GpioCtrlRegs.GPAQSEL1.bit.GPIO14 = 0; // Sync to SYSCLKOUT GPIO14 (EQEP2A) + GpioCtrlRegs.GPAQSEL1.bit.GPIO15 = 0; // Sync to SYSCLKOUT GPIO15 (EQEP2B) + GpioCtrlRegs.GPAQSEL2.bit.GPIO26 = 0; // Sync to SYSCLKOUT GPIO26 (EQEP2I) + + GpioCtrlRegs.GPAMUX1.bit.GPIO14 = 2; // Configure GPIO14 as EQEP2A + GpioCtrlRegs.GPAGMUX1.bit.GPIO14 = 2; + GpioCtrlRegs.GPAMUX1.bit.GPIO15 = 2; // Configure GPIO15 as EQEP2B + GpioCtrlRegs.GPAGMUX1.bit.GPIO15 = 2; + GpioCtrlRegs.GPAMUX2.bit.GPIO26 = 2; // Configure GPIO26 as EQEP2I + GpioCtrlRegs.GPAGMUX2.bit.GPIO26 = 0; +#endif EDIS; - EQep1Regs.QDECCTL.bit.QSRC = 0; // QEP quadrature count mode - EQep1Regs.QDECCTL.bit.IGATE = 1; // gate the index pin - EQep1Regs.QDECCTL.bit.QAP = 1; // invert A input - EQep1Regs.QDECCTL.bit.QBP = 1; // invert B input - EQep1Regs.QDECCTL.bit.QIP = 1; // invert index input - EQep1Regs.QEPCTL.bit.FREE_SOFT = 2; // unaffected by emulation suspend - EQep1Regs.QEPCTL.bit.PCRM = 1; // position count reset on maximum position - EQep1Regs.QPOSMAX = _ENCODER_MAX_COUNT; // Max position count + ENCODER_REGS.QDECCTL.bit.QSRC = 0; // QEP quadrature count mode + ENCODER_REGS.QDECCTL.bit.IGATE = 1; // gate the index pin + ENCODER_REGS.QDECCTL.bit.QAP = 1; // invert A input + ENCODER_REGS.QDECCTL.bit.QBP = 1; // invert B input + ENCODER_REGS.QDECCTL.bit.QIP = 1; // invert index input + ENCODER_REGS.QEPCTL.bit.FREE_SOFT = 2; // unaffected by emulation suspend + ENCODER_REGS.QEPCTL.bit.PCRM = 1; // position count reset on maximum position + ENCODER_REGS.QPOSMAX = _ENCODER_MAX_COUNT; // Max position count - EQep1Regs.QUPRD = CPU_CLOCK_HZ / RPM_CALC_RATE_HZ; // Unit Timer latch at RPM_CALC_RATE_HZ Hz - EQep1Regs.QEPCTL.bit.UTE=1; // Unit Timeout Enable - EQep1Regs.QEPCTL.bit.QCLM=1; // Latch on unit time out + ENCODER_REGS.QUPRD = CPU_CLOCK_HZ / RPM_CALC_RATE_HZ; // Unit Timer latch at RPM_CALC_RATE_HZ Hz + ENCODER_REGS.QEPCTL.bit.UTE=1; // Unit Timeout Enable + ENCODER_REGS.QEPCTL.bit.QCLM=1; // Latch on unit time out - EQep1Regs.QEPCTL.bit.QPEN=1; // QEP enable + ENCODER_REGS.QEPCTL.bit.QPEN=1; // QEP enable } Uint16 Encoder :: getRPM(void) { - if(EQep1Regs.QFLG.bit.UTO==1) // If unit timeout (one 10Hz period) + if(ENCODER_REGS.QFLG.bit.UTO==1) // If unit timeout (one 10Hz period) { - Uint32 current = EQep1Regs.QPOSLAT; + Uint32 current = ENCODER_REGS.QPOSLAT; Uint32 count = (current > previous) ? current - previous : previous - current; // deal with over/underflow @@ -87,7 +105,7 @@ Uint16 Encoder :: getRPM(void) rpm = count * 60 * RPM_CALC_RATE_HZ / ENCODER_RESOLUTION; previous = current; - EQep1Regs.QCLR.bit.UTO=1; // Clear interrupt flag + ENCODER_REGS.QCLR.bit.UTO=1; // Clear interrupt flag } return rpm; diff --git a/els-f280049c/Encoder.h b/els-f280049c/Encoder.h index ef772a3..e3545bf 100644 --- a/els-f280049c/Encoder.h +++ b/els-f280049c/Encoder.h @@ -28,6 +28,14 @@ #define __ENCODER_H #include "F28x_Project.h" +#include "Configuration.h" + +#ifdef ENCODER_USE_EQEP1 +#define ENCODER_REGS EQep1Regs +#endif +#ifdef ENCODER_USE_EQEP2 +#define ENCODER_REGS EQep2Regs +#endif #define _ENCODER_MAX_COUNT 0x00ffffff @@ -50,7 +58,7 @@ class Encoder inline Uint32 Encoder :: getPosition(void) { - return EQep1Regs.QPOSCNT; + return ENCODER_REGS.QPOSCNT; } inline Uint32 Encoder :: getMaxCount(void) diff --git a/els-f280049c/SanityCheck.h b/els-f280049c/SanityCheck.h index 74c0c65..d4e56c7 100644 --- a/els-f280049c/SanityCheck.h +++ b/els-f280049c/SanityCheck.h @@ -72,6 +72,10 @@ #endif #endif +#if defined(ENCODER_USE_EQEP1) && defined (ENCODER_USE_EQEP2) +#error Define only one of ENCODER_USE_EQEP1 or ENCODER_USE_EQEP2 +#endif + #endif // __SANITYCHECK_H diff --git a/els-f280049c/UserInterface.cpp b/els-f280049c/UserInterface.cpp index 29d5418..b30337b 100644 --- a/els-f280049c/UserInterface.cpp +++ b/els-f280049c/UserInterface.cpp @@ -28,7 +28,7 @@ const MESSAGE STARTUP_MESSAGE_2 = { - .message = { LETTER_E, LETTER_L, LETTER_S, DASH, ONE | POINT, ONE | POINT, ZERO, ONE }, + .message = { LETTER_E, LETTER_L, LETTER_S, DASH, ONE | POINT, ONE | POINT, ZERO, TWO }, .displayTime = UI_REFRESH_RATE_HZ * 1.5 };