Rotary Encoder handling library for mbed
Diff: REnc.cpp
- Revision:
- 1:2732adb68dad
- Parent:
- 0:c905f9e6866f
- Child:
- 2:46173a05338e
--- a/REnc.cpp Sat Jul 26 22:49:27 2014 +0000 +++ b/REnc.cpp Wed Aug 06 06:35:47 2014 +0000 @@ -6,20 +6,47 @@ * * Example: * @code + * // REnc sample + * #include "mbed.h" + * #include "REnc.h" + * void proc_REnc_right(void); + * void proc_REnc_left(void); + * + * // void proc_REnc_right(void) { } + * // void proc_REnc_left(void) { } + * + * REnc renc(dp1, dp2); + * + * int main() + * { + * + * // renc.setHandleRight(&proc_REnc_right); + * // renc.setHandleLeft(&proc_REnc_left); + * + * while(1) { + * if (renc.CMD == FORWARD) { + * proc_REnc_right(); + * renc.CMD = STOP; + * } else if (renc.CMD == REVERSE) { + * proc_REnc_left(); + * renc.CMD = STOP; + * } + * } + * } * @endcode */ using namespace mbed; - // constructor - /** Create a Beep object connected to the specified PwmOut pin - * - * @param pin PwmOut pin to connect to - */ +// private function +/** sample_encoder input and process + * + */ void REnc::sample_encoder(void) { static unsigned char i; - + static unsigned int cnt; + i = (i << 2) + ((~_pinb & 0x01)<< 1) + (~_pina & 0x1); i &= 0xf; @@ -27,25 +54,39 @@ case 0x7: case 0xe: CMD = FORWARD; - if (mRightCallback != NULL) { mRightCallback(); CMD = IDLE; } + cnt = 300; + STABLE = 0; + if (mRightCallback != NULL) { mRightCallback(); CMD = STOP; } break; case 0xb: case 0xd: - CMD = BACKWARD; - if (mLeftCallback != NULL) { mLeftCallback(); CMD = IDLE; } + CMD = REVERSE; + cnt = 300; + STABLE = 0; + if (mLeftCallback != NULL) { mLeftCallback(); CMD = STOP; } break; default: - CMD = IDLE; + CMD = STOP; + if (cnt) + cnt--; + else + STABLE = 1; } } void REnc::setHandleRight(void (*fptr)(void)) { mRightCallback = fptr; } void REnc::setHandleLeft(void (*fptr)(void)) { mLeftCallback = fptr; } + // constructor + /** Create an REnc object connected to DigitalIn pins + * + * @param pina - Digital Input to A-phase of the rotary encoder + * @param pinb - Digital Input to B-phase of the rotary encoder + */ REnc::REnc(PinName pina, PinName pinb) : _pina(pina), _pinb(pinb) { - CMD = IDLE; + CMD = STOP; mRightCallback = NULL; mLeftCallback = NULL; - _tick.attach(this, &REnc::sample_encoder, 0.01); + _tick.attach(this, &REnc::sample_encoder, 0.002); }