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.
Dependencies: mbed ros_lib_melodic
src/encoder.h@6:ed47deb76adf, 2021-06-08 (annotated)
- Committer:
- krogedal
- Date:
- Tue Jun 08 20:55:08 2021 +0000
- Revision:
- 6:ed47deb76adf
- Parent:
- 5:44b2454a5eea
Might work now?
Who changed what in which revision?
| User | Revision | Line number | New contents of line | 
|---|---|---|---|
| krogedal | 5:44b2454a5eea | 1 | /** | 
| krogedal | 5:44b2454a5eea | 2 | * @file encoder.h | 
| krogedal | 5:44b2454a5eea | 3 | * This class is based upon the QEI class by Aaron Berk and the encoder class I wrote during ESP in 2nd year. | 
| krogedal | 5:44b2454a5eea | 4 | * | 
| krogedal | 5:44b2454a5eea | 5 | * @author Simon Krogedal | 
| krogedal | 5:44b2454a5eea | 6 | * | 
| krogedal | 5:44b2454a5eea | 7 | * @version 0.1 | 
| krogedal | 5:44b2454a5eea | 8 | */ | 
| krogedal | 5:44b2454a5eea | 9 | |
| krogedal | 0:441289ea4e29 | 10 | #ifndef KARBOT_ENCODER_H | 
| krogedal | 0:441289ea4e29 | 11 | #define KARBOT_ENCODER_H | 
| krogedal | 0:441289ea4e29 | 12 | |
| krogedal | 5:44b2454a5eea | 13 | |
| krogedal | 0:441289ea4e29 | 14 | #include "mbed.h" | 
| krogedal | 0:441289ea4e29 | 15 | |
| krogedal | 3:4b6080e86761 | 16 | |
| krogedal | 0:441289ea4e29 | 17 | #define PREV_MASK 0x1 //Mask for the previous state in determining direction | 
| krogedal | 0:441289ea4e29 | 18 | //of rotation. | 
| krogedal | 0:441289ea4e29 | 19 | #define CURR_MASK 0x2 //Mask for the current state in determining direction | 
| krogedal | 0:441289ea4e29 | 20 | //of rotation. | 
| krogedal | 0:441289ea4e29 | 21 | #define INVALID 0x3 //XORing two states where both bits have changed. | 
| krogedal | 0:441289ea4e29 | 22 | |
| krogedal | 5:44b2454a5eea | 23 | /** encoder Class | 
| krogedal | 5:44b2454a5eea | 24 | * | 
| krogedal | 6:ed47deb76adf | 25 | * Class for measuring quadrature magnetic encoders requiring internal pullups | 
| krogedal | 5:44b2454a5eea | 26 | * | 
| krogedal | 5:44b2454a5eea | 27 | * @author Simon Krogedal | 
| krogedal | 5:44b2454a5eea | 28 | * | 
| krogedal | 5:44b2454a5eea | 29 | * 27/05/2021 | 
| krogedal | 5:44b2454a5eea | 30 | * | 
| krogedal | 5:44b2454a5eea | 31 | * Team 9 4th Year project | 
| krogedal | 5:44b2454a5eea | 32 | * | 
| krogedal | 5:44b2454a5eea | 33 | * | 
| krogedal | 5:44b2454a5eea | 34 | * for NUCLEO-F401RE | 
| krogedal | 5:44b2454a5eea | 35 | * | 
| krogedal | 5:44b2454a5eea | 36 | * @version 0.2 | 
| krogedal | 5:44b2454a5eea | 37 | * | 
| krogedal | 5:44b2454a5eea | 38 | */ | 
| krogedal | 0:441289ea4e29 | 39 | class encoder { | 
| krogedal | 0:441289ea4e29 | 40 | |
| krogedal | 6:ed47deb76adf | 41 | public: | 
| krogedal | 0:441289ea4e29 | 42 | |
| krogedal | 6:ed47deb76adf | 43 | /** Direction enumerator | 
| krogedal | 5:44b2454a5eea | 44 | */ | 
| krogedal | 6:ed47deb76adf | 45 | typedef enum { | 
| krogedal | 6:ed47deb76adf | 46 | Left, // Left side motor, CCW rotation is forward | 
| krogedal | 6:ed47deb76adf | 47 | Right // Right side motor, CW rotation is forward | 
| krogedal | 6:ed47deb76adf | 48 | } Side; | 
| krogedal | 0:441289ea4e29 | 49 | |
| krogedal | 5:44b2454a5eea | 50 | /** Create an instance | 
| krogedal | 5:44b2454a5eea | 51 | * | 
| krogedal | 5:44b2454a5eea | 52 | * @param chanA Encoder channel A pin | 
| krogedal | 5:44b2454a5eea | 53 | * @param chanB Encoder channel B pin | 
| krogedal | 5:44b2454a5eea | 54 | * @param CPR Encoder clicks per revolution | 
| krogedal | 6:ed47deb76adf | 55 | * @param side Left side or right side motor, defines whether counter-clockwise rotation is forwards (left) or backwards (right) (when looking at the robot from outside) | 
| krogedal | 6:ed47deb76adf | 56 | * @param Period Sampling period of the wheel speed | 
| krogedal | 5:44b2454a5eea | 57 | * @note Too short samling period gives a noisy reading, too long and dynamics are lost | 
| krogedal | 6:ed47deb76adf | 58 | * @param diameter Wheel diameter in meters | 
| krogedal | 5:44b2454a5eea | 59 | */ | 
| krogedal | 6:ed47deb76adf | 60 | encoder(PinName chanA, PinName chanB, int CPR, Side side, double Period, double diameter); | 
| krogedal | 5:44b2454a5eea | 61 | |
| krogedal | 5:44b2454a5eea | 62 | /** Get wheel speed | 
| krogedal | 5:44b2454a5eea | 63 | * @returns Wheel speed in meters/second | 
| krogedal | 5:44b2454a5eea | 64 | */ | 
| krogedal | 5:44b2454a5eea | 65 | double getSpeed(void); | 
| krogedal | 0:441289ea4e29 | 66 | |
| krogedal | 5:44b2454a5eea | 67 | /** Get distance travelled | 
| krogedal | 5:44b2454a5eea | 68 | * @returns Distance travelled in meters | 
| krogedal | 5:44b2454a5eea | 69 | */ | 
| krogedal | 5:44b2454a5eea | 70 | double getDistance(void); | 
| krogedal | 5:44b2454a5eea | 71 | |
| krogedal | 5:44b2454a5eea | 72 | /** Get distance travelled | 
| krogedal | 5:44b2454a5eea | 73 | * @returns Distance travelled in meters since last reset | 
| krogedal | 5:44b2454a5eea | 74 | */ | 
| krogedal | 5:44b2454a5eea | 75 | double tempDist(void); | 
| krogedal | 5:44b2454a5eea | 76 | |
| krogedal | 5:44b2454a5eea | 77 | /// Reset distance measurement | 
| krogedal | 5:44b2454a5eea | 78 | void distRst(void); | 
| krogedal | 5:44b2454a5eea | 79 | |
| krogedal | 5:44b2454a5eea | 80 | /// Reset distance measurement | 
| krogedal | 5:44b2454a5eea | 81 | void tempRst(void); | 
| krogedal | 5:44b2454a5eea | 82 | |
| krogedal | 5:44b2454a5eea | 83 | /// Start encoder reading | 
| krogedal | 5:44b2454a5eea | 84 | void start(void); | 
| krogedal | 5:44b2454a5eea | 85 | |
| krogedal | 5:44b2454a5eea | 86 | /// Stop encoder reading | 
| krogedal | 5:44b2454a5eea | 87 | void reset(void); | 
| krogedal | 0:441289ea4e29 | 88 | |
| krogedal | 0:441289ea4e29 | 89 | /** | 
| krogedal | 0:441289ea4e29 | 90 | * Read the state of the encoder. | 
| krogedal | 0:441289ea4e29 | 91 | * | 
| krogedal | 0:441289ea4e29 | 92 | * @return The current state of the encoder as a 2-bit number, where: | 
| krogedal | 0:441289ea4e29 | 93 | * bit 1 = The reading from channel B | 
| krogedal | 0:441289ea4e29 | 94 | * bit 2 = The reading from channel A | 
| krogedal | 0:441289ea4e29 | 95 | */ | 
| krogedal | 0:441289ea4e29 | 96 | int getCurrentState(void); | 
| krogedal | 0:441289ea4e29 | 97 | |
| krogedal | 0:441289ea4e29 | 98 | /** | 
| krogedal | 0:441289ea4e29 | 99 | * Read the number of pulses recorded by the encoder. | 
| krogedal | 0:441289ea4e29 | 100 | * | 
| krogedal | 0:441289ea4e29 | 101 | * @return Number of pulses which have occured. | 
| krogedal | 0:441289ea4e29 | 102 | */ | 
| krogedal | 0:441289ea4e29 | 103 | int getPulses(void); | 
| krogedal | 0:441289ea4e29 | 104 | |
| krogedal | 6:ed47deb76adf | 105 | private: | 
| krogedal | 6:ed47deb76adf | 106 | int tot_clicks, temp_tot; // clicks since last distance reset | 
| krogedal | 6:ed47deb76adf | 107 | double click_rate, click_store;// clickrate | 
| krogedal | 6:ed47deb76adf | 108 | bool c_d; // left or right bool | 
| krogedal | 6:ed47deb76adf | 109 | |
| krogedal | 6:ed47deb76adf | 110 | /** | 
| krogedal | 6:ed47deb76adf | 111 | * Update the pulse count. | 
| krogedal | 6:ed47deb76adf | 112 | * | 
| krogedal | 6:ed47deb76adf | 113 | * Called on every rising/falling edge of channels A/B. | 
| krogedal | 6:ed47deb76adf | 114 | * | 
| krogedal | 6:ed47deb76adf | 115 | * Reads the state of the channels and determines whether a pulse forward | 
| krogedal | 6:ed47deb76adf | 116 | * or backward has occured, updating the count appropriately. | 
| krogedal | 6:ed47deb76adf | 117 | */ | 
| krogedal | 6:ed47deb76adf | 118 | void encode(void); | 
| krogedal | 6:ed47deb76adf | 119 | |
| krogedal | 6:ed47deb76adf | 120 | InterruptIn channelA_; | 
| krogedal | 6:ed47deb76adf | 121 | InterruptIn channelB_; | 
| krogedal | 6:ed47deb76adf | 122 | |
| krogedal | 6:ed47deb76adf | 123 | int pulsesPerRev_; | 
| krogedal | 6:ed47deb76adf | 124 | int prevState_; | 
| krogedal | 6:ed47deb76adf | 125 | int currState_; | 
| krogedal | 6:ed47deb76adf | 126 | |
| krogedal | 6:ed47deb76adf | 127 | volatile int pulses_; | 
| krogedal | 6:ed47deb76adf | 128 | |
| krogedal | 6:ed47deb76adf | 129 | Side side_; | 
| krogedal | 6:ed47deb76adf | 130 | |
| krogedal | 6:ed47deb76adf | 131 | protected: | 
| krogedal | 6:ed47deb76adf | 132 | |
| krogedal | 6:ed47deb76adf | 133 | Ticker sampler; /// ticker object to sample speed | 
| krogedal | 6:ed47deb76adf | 134 | double period, enc_const; /// sampling period and wheel constant | 
| krogedal | 6:ed47deb76adf | 135 | |
| krogedal | 6:ed47deb76adf | 136 | /// Sample function called by ticker object | 
| krogedal | 6:ed47deb76adf | 137 | void sample_func(void); | 
| krogedal | 6:ed47deb76adf | 138 | |
| krogedal | 6:ed47deb76adf | 139 | /** Get wheel speed | 
| krogedal | 6:ed47deb76adf | 140 | * @returns Wheel speed in clicks/second | 
| krogedal | 6:ed47deb76adf | 141 | */ | 
| krogedal | 6:ed47deb76adf | 142 | double getClicks(void); | 
| krogedal | 6:ed47deb76adf | 143 | |
| krogedal | 0:441289ea4e29 | 144 | }; | 
| krogedal | 0:441289ea4e29 | 145 | |
| krogedal | 0:441289ea4e29 | 146 | #endif |