Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
ESCON_encoder.cpp@0:c763749ece81, 2020-03-23 (annotated)
- Committer:
- dsfqfqds
- Date:
- Mon Mar 23 11:21:10 2020 +0000
- Revision:
- 0:c763749ece81
HRI;
Who changed what in which revision?
| User | Revision | Line number | New 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 | } |