Rotary Encoder handling library for mbed

Dependents:   MIDI_CW Gemphet8

Committer:
ChuckTimber
Date:
Tue Aug 12 01:56:59 2014 +0000
Revision:
5:3e6931797218
Parent:
4:916992052518
Child:
6:abd0d8d58fed
Modified documents.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ChuckTimber 0:c905f9e6866f 1 #include "REnc.h"
ChuckTimber 0:c905f9e6866f 2 #include "mbed.h"
ChuckTimber 0:c905f9e6866f 3
ChuckTimber 4:916992052518 4 /**
ChuckTimber 4:916992052518 5 * @file REnc.cpp
ChuckTimber 4:916992052518 6 * Project Rotary Encoder handling Library
ChuckTimber 4:916992052518 7 * @brief Rotary Encoder handling library for mbed
ChuckTimber 4:916992052518 8 * @version 1.0
ChuckTimber 4:916992052518 9 * @author Chuck Timber
ChuckTimber 4:916992052518 10 * @date 12/08/2014
ChuckTimber 4:916992052518 11 */
ChuckTimber 4:916992052518 12 /** class to handle a rotary encoder
ChuckTimber 0:c905f9e6866f 13 *
ChuckTimber 0:c905f9e6866f 14 */
ChuckTimber 0:c905f9e6866f 15
ChuckTimber 0:c905f9e6866f 16 using namespace mbed;
ChuckTimber 0:c905f9e6866f 17
ChuckTimber 1:2732adb68dad 18 // private function
ChuckTimber 1:2732adb68dad 19 /** sample_encoder input and process
ChuckTimber 1:2732adb68dad 20 *
ChuckTimber 1:2732adb68dad 21 */
ChuckTimber 0:c905f9e6866f 22 void REnc::sample_encoder(void)
ChuckTimber 0:c905f9e6866f 23 {
ChuckTimber 0:c905f9e6866f 24 static unsigned char i;
ChuckTimber 1:2732adb68dad 25 static unsigned int cnt;
ChuckTimber 1:2732adb68dad 26
ChuckTimber 0:c905f9e6866f 27 i = (i << 2) + ((~_pinb & 0x01)<< 1) + (~_pina & 0x1);
ChuckTimber 0:c905f9e6866f 28 i &= 0xf;
ChuckTimber 0:c905f9e6866f 29
ChuckTimber 0:c905f9e6866f 30 switch (i) {
ChuckTimber 0:c905f9e6866f 31 case 0x7:
ChuckTimber 0:c905f9e6866f 32 case 0xe:
ChuckTimber 3:9dfe441065e9 33 CMD = CLOCKWISE;
ChuckTimber 2:46173a05338e 34 cnt = RENC_EXECUTION_DELAY;
ChuckTimber 1:2732adb68dad 35 STABLE = 0;
ChuckTimber 4:916992052518 36 if (mCCCallback != NULL) { mCCCallback(); CMD = STOP; }
ChuckTimber 0:c905f9e6866f 37 break;
ChuckTimber 0:c905f9e6866f 38 case 0xb:
ChuckTimber 0:c905f9e6866f 39 case 0xd:
ChuckTimber 3:9dfe441065e9 40 CMD = COUNTERCLOCKWISE;
ChuckTimber 2:46173a05338e 41 cnt = RENC_EXECUTION_DELAY;
ChuckTimber 1:2732adb68dad 42 STABLE = 0;
ChuckTimber 4:916992052518 43 if (mCCWCallback != NULL) { mCCWCallback(); CMD = STOP; }
ChuckTimber 0:c905f9e6866f 44 break;
ChuckTimber 0:c905f9e6866f 45 default:
ChuckTimber 1:2732adb68dad 46 CMD = STOP;
ChuckTimber 1:2732adb68dad 47 if (cnt)
ChuckTimber 1:2732adb68dad 48 cnt--;
ChuckTimber 1:2732adb68dad 49 else
ChuckTimber 1:2732adb68dad 50 STABLE = 1;
ChuckTimber 0:c905f9e6866f 51 }
ChuckTimber 0:c905f9e6866f 52 }
ChuckTimber 0:c905f9e6866f 53
ChuckTimber 4:916992052518 54 /** set callback function to Clockwise TURN */
ChuckTimber 4:916992052518 55 void REnc::setHandleCC(void (*fptr)(void)) { mCCCallback = fptr; }
ChuckTimber 4:916992052518 56 /** set callback function to Counterclockwise TURN */
ChuckTimber 4:916992052518 57 void REnc::setHandleCCW(void (*fptr)(void)) { mCCWCallback = fptr; }
ChuckTimber 0:c905f9e6866f 58
ChuckTimber 5:3e6931797218 59 /// constructor
ChuckTimber 4:916992052518 60 /** Create an REnc object connected to DigitalIn pins
ChuckTimber 4:916992052518 61 *
ChuckTimber 4:916992052518 62 * @param pina - Digital Input to A-phase of the rotary encoder
ChuckTimber 4:916992052518 63 * @param pinb - Digital Input to B-phase of the rotary encoder
ChuckTimber 4:916992052518 64 */
ChuckTimber 0:c905f9e6866f 65 REnc::REnc(PinName pina, PinName pinb) : _pina(pina), _pinb(pinb)
ChuckTimber 0:c905f9e6866f 66 {
ChuckTimber 4:916992052518 67 _pina.mode(PullUp);
ChuckTimber 4:916992052518 68 _pinb.mode(PullUp);
ChuckTimber 1:2732adb68dad 69 CMD = STOP;
ChuckTimber 2:46173a05338e 70 STABLE = 1;
ChuckTimber 4:916992052518 71 mCCCallback = NULL;
ChuckTimber 4:916992052518 72 mCCWCallback = NULL;
ChuckTimber 2:46173a05338e 73 _tick.attach(this, &REnc::sample_encoder, RENC_SAMPLING_PERIOD);
ChuckTimber 0:c905f9e6866f 74 }