BacaEncoder

Dependencies:   mbed

Committer:
tamamfirdaus
Date:
Mon Mar 18 15:14:43 2019 +0000
Revision:
0:9853fb2d4bd9
BacaEncoder;

Who changed what in which revision?

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