Kodingan KRAI 2017

Dependencies:   mbed DigitDisplay PID Motor Ping millis

Committer:
SalbiFaza
Date:
Sun Feb 24 10:39:24 2019 +0000
Revision:
0:dd4c20b9a83e
bismillah

Who changed what in which revision?

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