Drivers for the mini robot designed for Princeton's MAE 433 course.
Dependencies: mbed-dsp mbed-rtos mbed
Dependents: MAE433_Library_Tester RobotBalancerv2
Diff: QuadEnc.cpp
- Revision:
- 0:9afc272fa65f
diff -r 000000000000 -r 9afc272fa65f QuadEnc.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QuadEnc.cpp Fri Jun 24 21:03:20 2016 +0000 @@ -0,0 +1,56 @@ +/** + * @file QuadEnc.cpp + * @date June 2nd, 2016 + * @author Weimen Li + */ + +#include "QuadEnc.hpp" + +QuadEnc::QuadEnc(PinName ChannelA, PinName ChannelB, float CPR) : +count(0), bHasNewCount(false), +CPR(CPR), ChannelAIn(ChannelA), ChannelBIn(ChannelB), ChannelAInter(ChannelA), ChannelBInter(ChannelB), +prevCount(0), prevRevs(0), enc_val(0) { + + // Configure Channel A interrupt to trigger on rise and fall. + ChannelAInter.rise(this, &QuadEnc::QuadEncISR); + ChannelAInter.fall(this, &QuadEnc::QuadEncISR); + + // Configure Channel B interrupt to trigger on rise and fall. + ChannelBInter.rise(this, &QuadEnc::QuadEncISR); + ChannelBInter.fall(this, &QuadEnc::QuadEncISR); + +} + +QuadEnc::~QuadEnc() { + +} + +void QuadEnc::QuadEncISR() { + uint8_t QuadEncData = (ChannelAIn.read() << 1) | ChannelBIn.read(); + const int8_t QuadEncLUT[16] = { 0, -1, 1, 0, 1, 0, 0, -1, -1, 0, 0, 1, 0, 1, + -1, 0 }; + enc_val = enc_val << 2; + enc_val = enc_val | QuadEncData; + count += QuadEncLUT[enc_val & 0b1111]; + bHasNewCount = true; +} + +bool QuadEnc::hasNewCount() { + bool returnVal = bHasNewCount; + bHasNewCount = false; + return returnVal; +} + +float QuadEnc::getRevs() { + // Capture the current count to avoid corruption. + float currentCount = count; + if (prevCount != currentCount) { + prevRevs = currentCount / CPR; + } + return prevRevs; +} + +void QuadEnc::reset() { + count = 0; + bHasNewCount = false; +}