code encoderKRTMI 2019

Committer:
SalbiFaza
Date:
Sat Feb 23 11:15:53 2019 +0000
Revision:
0:fd29d4db8c40
Bismillah

Who changed what in which revision?

UserRevisionLine numberNew contents of line
SalbiFaza 0:fd29d4db8c40 1 /********************************************************/
SalbiFaza 0:fd29d4db8c40 2 /* Library untuk pembacaan Encoder */
SalbiFaza 0:fd29d4db8c40 3 /* Adapsi dari encoderKRAI */
SalbiFaza 0:fd29d4db8c40 4 /* */
SalbiFaza 0:fd29d4db8c40 5 /* Encoder yang sudah dicoba : */
SalbiFaza 0:fd29d4db8c40 6 /* 1. Autonics */
SalbiFaza 0:fd29d4db8c40 7 /* 2. Encoder bawaan Motor */
SalbiFaza 0:fd29d4db8c40 8 /* */
SalbiFaza 0:fd29d4db8c40 9 /* ______________________ */
SalbiFaza 0:fd29d4db8c40 10 /* |______Autonics______| */
SalbiFaza 0:fd29d4db8c40 11 /* | Out A = Input 1 | */
SalbiFaza 0:fd29d4db8c40 12 /* | Out B = Input 2 | */
SalbiFaza 0:fd29d4db8c40 13 /* | 5V | */
SalbiFaza 0:fd29d4db8c40 14 /* |_Gnd________________| */
SalbiFaza 0:fd29d4db8c40 15 /* */
SalbiFaza 0:fd29d4db8c40 16 /********************************************************/
SalbiFaza 0:fd29d4db8c40 17
SalbiFaza 0:fd29d4db8c40 18 #include "mbed.h"
SalbiFaza 0:fd29d4db8c40 19
SalbiFaza 0:fd29d4db8c40 20 #include "encoderKRTMI.h"
SalbiFaza 0:fd29d4db8c40 21
SalbiFaza 0:fd29d4db8c40 22 encoderKRTMI::encoderKRTMI(PinName channelA,
SalbiFaza 0:fd29d4db8c40 23 PinName channelB,
SalbiFaza 0:fd29d4db8c40 24 int pulsesPerRev,
SalbiFaza 0:fd29d4db8c40 25 Encoding encoding) : channelA_(channelA), channelB_(channelB)
SalbiFaza 0:fd29d4db8c40 26 {
SalbiFaza 0:fd29d4db8c40 27 pulses_ = 0;
SalbiFaza 0:fd29d4db8c40 28 revolutions_ = 0;
SalbiFaza 0:fd29d4db8c40 29 pulsesPerRev_ = pulsesPerRev;
SalbiFaza 0:fd29d4db8c40 30 encoding_ = encoding;
SalbiFaza 0:fd29d4db8c40 31
SalbiFaza 0:fd29d4db8c40 32 //Workout what the current state is.
SalbiFaza 0:fd29d4db8c40 33 int chanA = channelA_.read();
SalbiFaza 0:fd29d4db8c40 34 int chanB = channelB_.read();
SalbiFaza 0:fd29d4db8c40 35
SalbiFaza 0:fd29d4db8c40 36 //2-bit state.
SalbiFaza 0:fd29d4db8c40 37 currState_ = (chanA << 1) | (chanB);
SalbiFaza 0:fd29d4db8c40 38 prevState_ = currState_;
SalbiFaza 0:fd29d4db8c40 39
SalbiFaza 0:fd29d4db8c40 40 //X2 encoding uses interrupts on only channel A.
SalbiFaza 0:fd29d4db8c40 41 //X4 encoding uses interrupts on channel A,
SalbiFaza 0:fd29d4db8c40 42 //and on channel B.
SalbiFaza 0:fd29d4db8c40 43 channelA_.rise(this, &encoderKRTMI::encode);
SalbiFaza 0:fd29d4db8c40 44 channelA_.fall(this, &encoderKRTMI::encode);
SalbiFaza 0:fd29d4db8c40 45
SalbiFaza 0:fd29d4db8c40 46 //If we're using X4 encoding, then attach interrupts to channel B too.
SalbiFaza 0:fd29d4db8c40 47 if (encoding == X4_ENCODING) {
SalbiFaza 0:fd29d4db8c40 48 channelB_.rise(this, &encoderKRTMI::encode);
SalbiFaza 0:fd29d4db8c40 49 channelB_.fall(this, &encoderKRTMI::encode);
SalbiFaza 0:fd29d4db8c40 50 }
SalbiFaza 0:fd29d4db8c40 51 }
SalbiFaza 0:fd29d4db8c40 52
SalbiFaza 0:fd29d4db8c40 53 void encoderKRTMI::reset(void) {
SalbiFaza 0:fd29d4db8c40 54
SalbiFaza 0:fd29d4db8c40 55 pulses_ = 0;
SalbiFaza 0:fd29d4db8c40 56 revolutions_ = 0;
SalbiFaza 0:fd29d4db8c40 57
SalbiFaza 0:fd29d4db8c40 58 }
SalbiFaza 0:fd29d4db8c40 59
SalbiFaza 0:fd29d4db8c40 60 /*int encoderKRTMI::getCurrentState(void) {
SalbiFaza 0:fd29d4db8c40 61
SalbiFaza 0:fd29d4db8c40 62 return currState_;
SalbiFaza 0:fd29d4db8c40 63
SalbiFaza 0:fd29d4db8c40 64 }*/
SalbiFaza 0:fd29d4db8c40 65
SalbiFaza 0:fd29d4db8c40 66 int encoderKRTMI::getPulses(void) {
SalbiFaza 0:fd29d4db8c40 67
SalbiFaza 0:fd29d4db8c40 68 return pulses_;
SalbiFaza 0:fd29d4db8c40 69
SalbiFaza 0:fd29d4db8c40 70 }
SalbiFaza 0:fd29d4db8c40 71
SalbiFaza 0:fd29d4db8c40 72 int encoderKRTMI::getRevolutions(void) {
SalbiFaza 0:fd29d4db8c40 73
SalbiFaza 0:fd29d4db8c40 74 revolutions_ = pulses_ / pulsesPerRev_;
SalbiFaza 0:fd29d4db8c40 75 return revolutions_;
SalbiFaza 0:fd29d4db8c40 76
SalbiFaza 0:fd29d4db8c40 77 }
SalbiFaza 0:fd29d4db8c40 78
SalbiFaza 0:fd29d4db8c40 79 ////////////////////////////////////////////////////////
SalbiFaza 0:fd29d4db8c40 80
SalbiFaza 0:fd29d4db8c40 81 void encoderKRTMI::encode(void) {
SalbiFaza 0:fd29d4db8c40 82
SalbiFaza 0:fd29d4db8c40 83 int change = 0;
SalbiFaza 0:fd29d4db8c40 84 int chanA = channelA_.read();
SalbiFaza 0:fd29d4db8c40 85 int chanB = channelB_.read();
SalbiFaza 0:fd29d4db8c40 86
SalbiFaza 0:fd29d4db8c40 87 //2-bit state.
SalbiFaza 0:fd29d4db8c40 88 currState_ = (chanA << 1) | (chanB);
SalbiFaza 0:fd29d4db8c40 89
SalbiFaza 0:fd29d4db8c40 90 if (encoding_ == X2_ENCODING) {
SalbiFaza 0:fd29d4db8c40 91
SalbiFaza 0:fd29d4db8c40 92 //11->00->11->00 is counter clockwise rotation or "forward".
SalbiFaza 0:fd29d4db8c40 93 if ((prevState_ == 0x3 && currState_ == 0x0) ||
SalbiFaza 0:fd29d4db8c40 94 (prevState_ == 0x0 && currState_ == 0x3)) {
SalbiFaza 0:fd29d4db8c40 95
SalbiFaza 0:fd29d4db8c40 96 pulses_++;
SalbiFaza 0:fd29d4db8c40 97
SalbiFaza 0:fd29d4db8c40 98 }
SalbiFaza 0:fd29d4db8c40 99 //10->01->10->01 is clockwise rotation or "backward".
SalbiFaza 0:fd29d4db8c40 100 else if ((prevState_ == 0x2 && currState_ == 0x1) ||
SalbiFaza 0:fd29d4db8c40 101 (prevState_ == 0x1 && currState_ == 0x2)) {
SalbiFaza 0:fd29d4db8c40 102
SalbiFaza 0:fd29d4db8c40 103 pulses_--;
SalbiFaza 0:fd29d4db8c40 104
SalbiFaza 0:fd29d4db8c40 105 }
SalbiFaza 0:fd29d4db8c40 106
SalbiFaza 0:fd29d4db8c40 107 } else if (encoding_ == X4_ENCODING) {
SalbiFaza 0:fd29d4db8c40 108
SalbiFaza 0:fd29d4db8c40 109 //Entered a new valid state.
SalbiFaza 0:fd29d4db8c40 110 if (((currState_ ^ prevState_) != INVALID) && (currState_ != prevState_)) {
SalbiFaza 0:fd29d4db8c40 111 //2 bit state. Right hand bit of prev XOR left hand bit of current
SalbiFaza 0:fd29d4db8c40 112 //gives 0 if clockwise rotation and 1 if counter clockwise rotation.
SalbiFaza 0:fd29d4db8c40 113 change = (prevState_ & PREV_MASK) ^ ((currState_ & CURR_MASK) >> 1);
SalbiFaza 0:fd29d4db8c40 114
SalbiFaza 0:fd29d4db8c40 115 if (change == 0) {
SalbiFaza 0:fd29d4db8c40 116 change = -1;
SalbiFaza 0:fd29d4db8c40 117 }
SalbiFaza 0:fd29d4db8c40 118
SalbiFaza 0:fd29d4db8c40 119 pulses_ -= change;
SalbiFaza 0:fd29d4db8c40 120 }
SalbiFaza 0:fd29d4db8c40 121
SalbiFaza 0:fd29d4db8c40 122 }
SalbiFaza 0:fd29d4db8c40 123
SalbiFaza 0:fd29d4db8c40 124 prevState_ = currState_;
SalbiFaza 0:fd29d4db8c40 125
SalbiFaza 0:fd29d4db8c40 126 }