Jinhyuk Yoon / ESCON_encoder
Committer:
dsfqfqds
Date:
Mon Mar 23 11:21:10 2020 +0000
Revision:
0:c763749ece81
HRI;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dsfqfqds 0:c763749ece81 1 /*
dsfqfqds 0:c763749ece81 2 * @author Jinhyuk Yoon
dsfqfqds 0:c763749ece81 3 *
dsfqfqds 0:c763749ece81 4 * Designed to control ESCON via NUCELO-F767ZI
dsfqfqds 0:c763749ece81 5 */
dsfqfqds 0:c763749ece81 6
dsfqfqds 0:c763749ece81 7 #include "ESCON_encoder.h"
dsfqfqds 0:c763749ece81 8
dsfqfqds 0:c763749ece81 9 ESCON_encoder::ESCON_encoder(PinName channelA_, PinName channelB_, int count_per_turn_) : channelA(channelA_), channelB(channelB_) {
dsfqfqds 0:c763749ece81 10
dsfqfqds 0:c763749ece81 11 pulses = 0;
dsfqfqds 0:c763749ece81 12 revolutions = 0;
dsfqfqds 0:c763749ece81 13 pos_in_degree = 0.0;
dsfqfqds 0:c763749ece81 14 pos_in_radian = 0.0;
dsfqfqds 0:c763749ece81 15 count_per_turn = count_per_turn_;
dsfqfqds 0:c763749ece81 16
dsfqfqds 0:c763749ece81 17 //Workout what the current state is.
dsfqfqds 0:c763749ece81 18 int chanA = channelA.read();
dsfqfqds 0:c763749ece81 19 int chanB = channelB.read();
dsfqfqds 0:c763749ece81 20
dsfqfqds 0:c763749ece81 21 //2-bit state.
dsfqfqds 0:c763749ece81 22 currState = (chanA << 1) | (chanB);
dsfqfqds 0:c763749ece81 23 prevState = currState;
dsfqfqds 0:c763749ece81 24
dsfqfqds 0:c763749ece81 25 //X2 encoding, so uses interrupts on only channel A.
dsfqfqds 0:c763749ece81 26 channelA.rise(this, &ESCON_encoder::encode);
dsfqfqds 0:c763749ece81 27 channelA.fall(this, &ESCON_encoder::encode);
dsfqfqds 0:c763749ece81 28 }
dsfqfqds 0:c763749ece81 29
dsfqfqds 0:c763749ece81 30 void ESCON_encoder::reset(void) {
dsfqfqds 0:c763749ece81 31
dsfqfqds 0:c763749ece81 32 pulses = 0;
dsfqfqds 0:c763749ece81 33 pos_in_degree = 0.0;
dsfqfqds 0:c763749ece81 34 pos_in_radian = 0.0;
dsfqfqds 0:c763749ece81 35
dsfqfqds 0:c763749ece81 36 }
dsfqfqds 0:c763749ece81 37
dsfqfqds 0:c763749ece81 38 int ESCON_encoder::getCurrentState(void) {
dsfqfqds 0:c763749ece81 39
dsfqfqds 0:c763749ece81 40 return currState;
dsfqfqds 0:c763749ece81 41
dsfqfqds 0:c763749ece81 42 }
dsfqfqds 0:c763749ece81 43
dsfqfqds 0:c763749ece81 44 int ESCON_encoder::getPulses(void) {
dsfqfqds 0:c763749ece81 45
dsfqfqds 0:c763749ece81 46 return pulses;
dsfqfqds 0:c763749ece81 47
dsfqfqds 0:c763749ece81 48 }
dsfqfqds 0:c763749ece81 49
dsfqfqds 0:c763749ece81 50 double ESCON_encoder::getPosInDegree(void) {
dsfqfqds 0:c763749ece81 51
dsfqfqds 0:c763749ece81 52 pos_in_degree = pulses / (2 * double(count_per_turn)) * 360;
dsfqfqds 0:c763749ece81 53 return pos_in_degree;
dsfqfqds 0:c763749ece81 54
dsfqfqds 0:c763749ece81 55 }
dsfqfqds 0:c763749ece81 56
dsfqfqds 0:c763749ece81 57 double ESCON_encoder::getPosInRadian(void) {
dsfqfqds 0:c763749ece81 58
dsfqfqds 0:c763749ece81 59 pos_in_radian = pulses / (2 * double(count_per_turn)) * PI / 180 * 360;
dsfqfqds 0:c763749ece81 60 return pos_in_radian;
dsfqfqds 0:c763749ece81 61
dsfqfqds 0:c763749ece81 62 }
dsfqfqds 0:c763749ece81 63
dsfqfqds 0:c763749ece81 64 int ESCON_encoder::getRevolutions(void) {
dsfqfqds 0:c763749ece81 65 revolutions = floor( double(pulses / (2 * double(count_per_turn))) );
dsfqfqds 0:c763749ece81 66 return revolutions;
dsfqfqds 0:c763749ece81 67 }
dsfqfqds 0:c763749ece81 68
dsfqfqds 0:c763749ece81 69
dsfqfqds 0:c763749ece81 70 void ESCON_encoder::encode(void) {
dsfqfqds 0:c763749ece81 71
dsfqfqds 0:c763749ece81 72 int chanA = channelA.read();
dsfqfqds 0:c763749ece81 73 int chanB = channelB.read();
dsfqfqds 0:c763749ece81 74
dsfqfqds 0:c763749ece81 75 //2-bit state.
dsfqfqds 0:c763749ece81 76 currState = (chanA << 1) | (chanB);
dsfqfqds 0:c763749ece81 77
dsfqfqds 0:c763749ece81 78 //11->00->11->00 is counter clockwise rotation or "forward".
dsfqfqds 0:c763749ece81 79 if ((prevState == 0x3 && currState == 0x0) ||
dsfqfqds 0:c763749ece81 80 (prevState == 0x0 && currState == 0x3)) {
dsfqfqds 0:c763749ece81 81
dsfqfqds 0:c763749ece81 82 pulses++;
dsfqfqds 0:c763749ece81 83
dsfqfqds 0:c763749ece81 84 }
dsfqfqds 0:c763749ece81 85 //10->01->10->01 is clockwise rotation or "backward".
dsfqfqds 0:c763749ece81 86 else if ((prevState == 0x2 && currState == 0x1) ||
dsfqfqds 0:c763749ece81 87 (prevState == 0x1 && currState == 0x2)) {
dsfqfqds 0:c763749ece81 88
dsfqfqds 0:c763749ece81 89 pulses--;
dsfqfqds 0:c763749ece81 90
dsfqfqds 0:c763749ece81 91 }
dsfqfqds 0:c763749ece81 92 prevState = currState;
dsfqfqds 0:c763749ece81 93
dsfqfqds 0:c763749ece81 94 }