Belum semua kombinasi. Start = mode rotasi otomatis. Mode otomatis = L1 dan R1 untuk iterasi. Select = keluar mode rotasi otomatis.

Dependencies:   Motor PID mbed millis

Fork of BASE_NASIONAL_V2 by KRAI 2017

Committer:
gustavaditya
Date:
Sun Jun 11 19:22:01 2017 +0000
Revision:
0:312d1d0781ac
BASE ROTASI OTOMATIS SEKUENSIAL

Who changed what in which revision?

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