jalan kiri

Dependencies:   Motor PID mbed millis

Fork of Encoder_Base_NasioanalV1 by KRAI 2017

Committer:
rahmadirizki18
Date:
Tue May 30 14:11:07 2017 +0000
Revision:
3:db2dc06c0686
Parent:
0:57124be75a63
jalan kiri

Who changed what in which revision?

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