ロータリーエンコーダーのライブラリです。 角速度 、 角度 、 RPMなどがだせます。

Dependents:   scan2 Test_moter electrocoagulador_teclado 17pwmencoder ... more

バージョンがあがりました。 こちらにあります。 https://developer.mbed.org/users/kikoaac/code/QEI2/ ハードの節約、効率化をしました。複数のQEIを使うのであれば、こちらのほうがいいと思います。

QEI(PinName channelA, PinName channelB, PinName index, int pulsesPerRev, Encoding encoding = X2_ENCODING); Aチ ャンネル、Bチャンネル、Zチャンネル、1周のパルス、タイプ

void reset(void); Pulses=0にする。

int getCurrentState(void); ローテリーエンコーダの現在の値をかえす。(00、01、10、11)

void set(int pul , int rev); pulはPulses,revはRevolutionをセット

int getPulses(void); Pulsesを返す

int getRevolutions(void); Z軸があれば基準からの回転周期をかえす

int getAng_rev(); Z軸がなければこちらを使用してください。

double getAngle(); 基準からの角度(0~360)を返す double getSumangle(); 基準からの角度を返す

double getRPM(); double getRPS(); double getRPMS(); double getRPUS(); 回転周期をかえす。

Committer:
kikoaac
Date:
Fri Apr 17 06:44:34 2015 +0000
Revision:
0:a24686ca50ab
???????????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kikoaac 0:a24686ca50ab 1 #include "QEI.h"
kikoaac 0:a24686ca50ab 2
kikoaac 0:a24686ca50ab 3 QEI::QEI(PinName channelA,
kikoaac 0:a24686ca50ab 4 PinName channelB,
kikoaac 0:a24686ca50ab 5 PinName index,
kikoaac 0:a24686ca50ab 6 int pulsesPerRev,
kikoaac 0:a24686ca50ab 7 Encoding encoding
kikoaac 0:a24686ca50ab 8 ) : channelA_(channelA), channelB_(channelB),
kikoaac 0:a24686ca50ab 9 index_(index) {
kikoaac 0:a24686ca50ab 10
kikoaac 0:a24686ca50ab 11 pulses_ = 0;
kikoaac 0:a24686ca50ab 12 revolutions_ = 0;
kikoaac 0:a24686ca50ab 13 pulsesPerRev_ = pulsesPerRev;
kikoaac 0:a24686ca50ab 14 encoding_ = encoding;
kikoaac 0:a24686ca50ab 15
kikoaac 0:a24686ca50ab 16 //Workout what the current state is.
kikoaac 0:a24686ca50ab 17 int chanA = channelA_.read();
kikoaac 0:a24686ca50ab 18 int chanB = channelB_.read();
kikoaac 0:a24686ca50ab 19
kikoaac 0:a24686ca50ab 20 //2-bit state.
kikoaac 0:a24686ca50ab 21 currState_ = (chanA << 1) | (chanB);
kikoaac 0:a24686ca50ab 22 prevState_ = currState_;
kikoaac 0:a24686ca50ab 23
kikoaac 0:a24686ca50ab 24 channelA_.rise(this, &QEI::encode);
kikoaac 0:a24686ca50ab 25 channelA_.fall(this, &QEI::encode);
kikoaac 0:a24686ca50ab 26
kikoaac 0:a24686ca50ab 27
kikoaac 0:a24686ca50ab 28 if (encoding == X4_ENCODING) {
kikoaac 0:a24686ca50ab 29 channelB_.rise(this, &QEI::encode);
kikoaac 0:a24686ca50ab 30 channelB_.fall(this, &QEI::encode);
kikoaac 0:a24686ca50ab 31 }
kikoaac 0:a24686ca50ab 32 if (index != NC) {
kikoaac 0:a24686ca50ab 33 index_.rise(this, &QEI::index);
kikoaac 0:a24686ca50ab 34 }
kikoaac 0:a24686ca50ab 35
kikoaac 0:a24686ca50ab 36 }
kikoaac 0:a24686ca50ab 37
kikoaac 0:a24686ca50ab 38 void QEI::reset(void) {
kikoaac 0:a24686ca50ab 39
kikoaac 0:a24686ca50ab 40 pulses_ = 0;
kikoaac 0:a24686ca50ab 41 revolutions_ = 0;
kikoaac 0:a24686ca50ab 42 round_rev = 0;
kikoaac 0:a24686ca50ab 43 sumangle = angle_ =0;
kikoaac 0:a24686ca50ab 44 }
kikoaac 0:a24686ca50ab 45 void QEI::set(int pul , int rev) {
kikoaac 0:a24686ca50ab 46
kikoaac 0:a24686ca50ab 47 pulses_ = pul;
kikoaac 0:a24686ca50ab 48 revolutions_ = rev;
kikoaac 0:a24686ca50ab 49
kikoaac 0:a24686ca50ab 50 }
kikoaac 0:a24686ca50ab 51 int QEI::getCurrentState(void) {
kikoaac 0:a24686ca50ab 52
kikoaac 0:a24686ca50ab 53 return currState_;
kikoaac 0:a24686ca50ab 54
kikoaac 0:a24686ca50ab 55 }
kikoaac 0:a24686ca50ab 56
kikoaac 0:a24686ca50ab 57 int QEI::getPulses(void) {
kikoaac 0:a24686ca50ab 58
kikoaac 0:a24686ca50ab 59 return pulses_;
kikoaac 0:a24686ca50ab 60
kikoaac 0:a24686ca50ab 61 }
kikoaac 0:a24686ca50ab 62
kikoaac 0:a24686ca50ab 63 int QEI::getRevolutions(void) {
kikoaac 0:a24686ca50ab 64
kikoaac 0:a24686ca50ab 65 return revolutions_;
kikoaac 0:a24686ca50ab 66
kikoaac 0:a24686ca50ab 67 }
kikoaac 0:a24686ca50ab 68 double QEI::getAngle()
kikoaac 0:a24686ca50ab 69 {
kikoaac 0:a24686ca50ab 70 return angle_;
kikoaac 0:a24686ca50ab 71 }
kikoaac 0:a24686ca50ab 72 int QEI::getAng_rev()
kikoaac 0:a24686ca50ab 73 {
kikoaac 0:a24686ca50ab 74 return round_rev;
kikoaac 0:a24686ca50ab 75 }
kikoaac 0:a24686ca50ab 76 double QEI::getSumangle()
kikoaac 0:a24686ca50ab 77 {
kikoaac 0:a24686ca50ab 78 return sumangle;
kikoaac 0:a24686ca50ab 79 }
kikoaac 0:a24686ca50ab 80
kikoaac 0:a24686ca50ab 81 double QEI::getRPM()
kikoaac 0:a24686ca50ab 82 {
kikoaac 0:a24686ca50ab 83 static double prev_angle;
kikoaac 0:a24686ca50ab 84 Mper.stop();
kikoaac 0:a24686ca50ab 85
kikoaac 0:a24686ca50ab 86 RPM = (sumangle - prev_angle) / Mper.read() * 60.0 / 360;
kikoaac 0:a24686ca50ab 87 Mper.reset();
kikoaac 0:a24686ca50ab 88 Mper.start();
kikoaac 0:a24686ca50ab 89 prev_angle = sumangle;
kikoaac 0:a24686ca50ab 90 return RPM;
kikoaac 0:a24686ca50ab 91 }
kikoaac 0:a24686ca50ab 92 double QEI::getRPS()
kikoaac 0:a24686ca50ab 93 {
kikoaac 0:a24686ca50ab 94 static double prev_angle;
kikoaac 0:a24686ca50ab 95 Rper.stop();
kikoaac 0:a24686ca50ab 96
kikoaac 0:a24686ca50ab 97 RPS = (sumangle - prev_angle) / Rper.read() / 360;
kikoaac 0:a24686ca50ab 98 Rper.reset();
kikoaac 0:a24686ca50ab 99 Rper.start();
kikoaac 0:a24686ca50ab 100 prev_angle = sumangle;
kikoaac 0:a24686ca50ab 101 return RPS;
kikoaac 0:a24686ca50ab 102 }
kikoaac 0:a24686ca50ab 103 double QEI::getRPMS()
kikoaac 0:a24686ca50ab 104 { static double prev_angle;
kikoaac 0:a24686ca50ab 105 MSper.stop();
kikoaac 0:a24686ca50ab 106
kikoaac 0:a24686ca50ab 107 RPMS = (sumangle - prev_angle) / (double)MSper.read_ms() / 360;
kikoaac 0:a24686ca50ab 108 MSper.reset();
kikoaac 0:a24686ca50ab 109 MSper.start();
kikoaac 0:a24686ca50ab 110 prev_angle = sumangle;
kikoaac 0:a24686ca50ab 111 return RPMS;
kikoaac 0:a24686ca50ab 112 }
kikoaac 0:a24686ca50ab 113 double QEI::getRPUS()
kikoaac 0:a24686ca50ab 114 { static double prev_angle;
kikoaac 0:a24686ca50ab 115 USper.stop();
kikoaac 0:a24686ca50ab 116
kikoaac 0:a24686ca50ab 117 RPUS = (sumangle - prev_angle) / (double)USper.read_us() / 360;
kikoaac 0:a24686ca50ab 118 USper.reset();
kikoaac 0:a24686ca50ab 119 USper.start();
kikoaac 0:a24686ca50ab 120 prev_angle = sumangle;
kikoaac 0:a24686ca50ab 121 return RPUS;
kikoaac 0:a24686ca50ab 122 }
kikoaac 0:a24686ca50ab 123 void QEI::encode(void) {
kikoaac 0:a24686ca50ab 124
kikoaac 0:a24686ca50ab 125 int change = 0;
kikoaac 0:a24686ca50ab 126 int chanA = channelA_.read();
kikoaac 0:a24686ca50ab 127 int chanB = channelB_.read();
kikoaac 0:a24686ca50ab 128
kikoaac 0:a24686ca50ab 129 currState_ = (chanA << 1) | (chanB);
kikoaac 0:a24686ca50ab 130
kikoaac 0:a24686ca50ab 131 if (encoding_ == X2_ENCODING) {
kikoaac 0:a24686ca50ab 132
kikoaac 0:a24686ca50ab 133 if ((prevState_ == 0x3 && currState_ == 0x0) ||
kikoaac 0:a24686ca50ab 134 (prevState_ == 0x0 && currState_ == 0x3)) {
kikoaac 0:a24686ca50ab 135
kikoaac 0:a24686ca50ab 136 pulses_++;
kikoaac 0:a24686ca50ab 137 angle_pulses++;
kikoaac 0:a24686ca50ab 138
kikoaac 0:a24686ca50ab 139 }
kikoaac 0:a24686ca50ab 140 else if ((prevState_ == 0x2 && currState_ == 0x1) ||
kikoaac 0:a24686ca50ab 141 (prevState_ == 0x1 && currState_ == 0x2)) {
kikoaac 0:a24686ca50ab 142
kikoaac 0:a24686ca50ab 143 pulses_--;
kikoaac 0:a24686ca50ab 144 angle_pulses--;
kikoaac 0:a24686ca50ab 145
kikoaac 0:a24686ca50ab 146 }
kikoaac 0:a24686ca50ab 147
kikoaac 0:a24686ca50ab 148 } else if (encoding_ == X4_ENCODING) {
kikoaac 0:a24686ca50ab 149
kikoaac 0:a24686ca50ab 150 if (((currState_ ^ prevState_) != INVALID) && (currState_ != prevState_)) {
kikoaac 0:a24686ca50ab 151 change = (prevState_ & PREV_MASK) ^ ((currState_ & CURR_MASK) >> 1);
kikoaac 0:a24686ca50ab 152
kikoaac 0:a24686ca50ab 153 if (change == 0) {
kikoaac 0:a24686ca50ab 154 change = -1;
kikoaac 0:a24686ca50ab 155 }
kikoaac 0:a24686ca50ab 156
kikoaac 0:a24686ca50ab 157 pulses_ -= change;
kikoaac 0:a24686ca50ab 158 angle_pulses -= change;
kikoaac 0:a24686ca50ab 159 }
kikoaac 0:a24686ca50ab 160
kikoaac 0:a24686ca50ab 161 }
kikoaac 0:a24686ca50ab 162 angle_ = angle_pulses*360/((double)pulsesPerRev_*4);
kikoaac 0:a24686ca50ab 163 sumangle = pulses_*360/((double)pulsesPerRev_*4);
kikoaac 0:a24686ca50ab 164 if(angle_>=360)
kikoaac 0:a24686ca50ab 165 {
kikoaac 0:a24686ca50ab 166 angle_pulses = angle_ = 0;
kikoaac 0:a24686ca50ab 167 round_rev++;
kikoaac 0:a24686ca50ab 168 }
kikoaac 0:a24686ca50ab 169 else if(angle_<=-360)
kikoaac 0:a24686ca50ab 170 {
kikoaac 0:a24686ca50ab 171 angle_pulses = angle_ = 0;
kikoaac 0:a24686ca50ab 172 round_rev--;
kikoaac 0:a24686ca50ab 173 }
kikoaac 0:a24686ca50ab 174 prevState_ = currState_;
kikoaac 0:a24686ca50ab 175 }
kikoaac 0:a24686ca50ab 176
kikoaac 0:a24686ca50ab 177 void QEI::index(void) {
kikoaac 0:a24686ca50ab 178
kikoaac 0:a24686ca50ab 179 revolutions_++;
kikoaac 0:a24686ca50ab 180
kikoaac 0:a24686ca50ab 181 }
kikoaac 0:a24686ca50ab 182