Wheel control software for satellite microcontroller running the motors on the Karbor
Dependencies: mbed ros_lib_melodic
src/encoder.h@5:44b2454a5eea, 2021-06-08 (annotated)
- Committer:
- krogedal
- Date:
- Tue Jun 08 15:04:33 2021 +0000
- Revision:
- 5:44b2454a5eea
- Parent:
- 3:4b6080e86761
- Child:
- 6:ed47deb76adf
Minor bug fixes
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 | 5:44b2454a5eea | 25 | * Class for measeuring 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 | * Written by Simon Krogedal |
krogedal | 5:44b2454a5eea | 30 | * |
krogedal | 5:44b2454a5eea | 31 | * 27/05/2021 |
krogedal | 5:44b2454a5eea | 32 | * |
krogedal | 5:44b2454a5eea | 33 | * Team 9 4th Year project |
krogedal | 5:44b2454a5eea | 34 | * |
krogedal | 5:44b2454a5eea | 35 | * |
krogedal | 5:44b2454a5eea | 36 | * for NUCLEO-F401RE |
krogedal | 5:44b2454a5eea | 37 | * |
krogedal | 5:44b2454a5eea | 38 | * @version 0.2 |
krogedal | 5:44b2454a5eea | 39 | * |
krogedal | 5:44b2454a5eea | 40 | */ |
krogedal | 0:441289ea4e29 | 41 | class encoder { |
krogedal | 0:441289ea4e29 | 42 | |
krogedal | 0:441289ea4e29 | 43 | private: |
krogedal | 0:441289ea4e29 | 44 | int tot_clicks, temp_tot; // clicks since last distance reset |
krogedal | 0:441289ea4e29 | 45 | double click_rate, click_store;// clickrate |
krogedal | 0:441289ea4e29 | 46 | bool c_d; // left or right bool |
krogedal | 0:441289ea4e29 | 47 | |
krogedal | 0:441289ea4e29 | 48 | /** |
krogedal | 0:441289ea4e29 | 49 | * Update the pulse count. |
krogedal | 0:441289ea4e29 | 50 | * |
krogedal | 0:441289ea4e29 | 51 | * Called on every rising/falling edge of channels A/B. |
krogedal | 0:441289ea4e29 | 52 | * |
krogedal | 0:441289ea4e29 | 53 | * Reads the state of the channels and determines whether a pulse forward |
krogedal | 0:441289ea4e29 | 54 | * or backward has occured, updating the count appropriately. |
krogedal | 0:441289ea4e29 | 55 | */ |
krogedal | 0:441289ea4e29 | 56 | void encode(void); |
krogedal | 0:441289ea4e29 | 57 | |
krogedal | 0:441289ea4e29 | 58 | InterruptIn channelA_; |
krogedal | 0:441289ea4e29 | 59 | InterruptIn channelB_; |
krogedal | 0:441289ea4e29 | 60 | |
krogedal | 0:441289ea4e29 | 61 | int pulsesPerRev_; |
krogedal | 0:441289ea4e29 | 62 | int prevState_; |
krogedal | 0:441289ea4e29 | 63 | int currState_; |
krogedal | 0:441289ea4e29 | 64 | |
krogedal | 0:441289ea4e29 | 65 | volatile int pulses_; |
krogedal | 0:441289ea4e29 | 66 | |
krogedal | 0:441289ea4e29 | 67 | protected: |
krogedal | 0:441289ea4e29 | 68 | |
krogedal | 5:44b2454a5eea | 69 | Ticker sampler; /// ticker object to sample speed |
krogedal | 5:44b2454a5eea | 70 | double period, enc_const; /// sampling period and wheel constant |
krogedal | 5:44b2454a5eea | 71 | |
krogedal | 5:44b2454a5eea | 72 | /// Sample function called by ticker object |
krogedal | 5:44b2454a5eea | 73 | void sample_func(void); |
krogedal | 5:44b2454a5eea | 74 | |
krogedal | 5:44b2454a5eea | 75 | /** Get wheel speed |
krogedal | 5:44b2454a5eea | 76 | * @returns Wheel speed in clicks/second |
krogedal | 5:44b2454a5eea | 77 | */ |
krogedal | 5:44b2454a5eea | 78 | double getClicks(void); /// returns clickrate |
krogedal | 0:441289ea4e29 | 79 | |
krogedal | 0:441289ea4e29 | 80 | public: |
krogedal | 0:441289ea4e29 | 81 | |
krogedal | 5:44b2454a5eea | 82 | /** Create an instance |
krogedal | 5:44b2454a5eea | 83 | * |
krogedal | 5:44b2454a5eea | 84 | * @param chanA Encoder channel A pin |
krogedal | 5:44b2454a5eea | 85 | * @param chanB Encoder channel B pin |
krogedal | 5:44b2454a5eea | 86 | * @param CPR Encoder clicks per revolution |
krogedal | 5:44b2454a5eea | 87 | * @param c Boolean flag to invert speeds, used to correct for left and right motors |
krogedal | 5:44b2454a5eea | 88 | * @param p Sampling period of the wheel speed |
krogedal | 5:44b2454a5eea | 89 | * @note Too short samling period gives a noisy reading, too long and dynamics are lost |
krogedal | 5:44b2454a5eea | 90 | * @param diameter Wheel diameter |
krogedal | 5:44b2454a5eea | 91 | */ |
krogedal | 5:44b2454a5eea | 92 | encoder(PinName chanA, PinName chanB, int CPR, bool c, double p, double diameter); |
krogedal | 5:44b2454a5eea | 93 | |
krogedal | 5:44b2454a5eea | 94 | /** Get wheel speed |
krogedal | 5:44b2454a5eea | 95 | * @returns Wheel speed in meters/second |
krogedal | 5:44b2454a5eea | 96 | */ |
krogedal | 5:44b2454a5eea | 97 | double getSpeed(void); |
krogedal | 0:441289ea4e29 | 98 | |
krogedal | 5:44b2454a5eea | 99 | /** Get distance travelled |
krogedal | 5:44b2454a5eea | 100 | * @returns Distance travelled in meters |
krogedal | 5:44b2454a5eea | 101 | */ |
krogedal | 5:44b2454a5eea | 102 | double getDistance(void); |
krogedal | 5:44b2454a5eea | 103 | |
krogedal | 5:44b2454a5eea | 104 | /** Get distance travelled |
krogedal | 5:44b2454a5eea | 105 | * @returns Distance travelled in meters since last reset |
krogedal | 5:44b2454a5eea | 106 | */ |
krogedal | 5:44b2454a5eea | 107 | double tempDist(void); |
krogedal | 5:44b2454a5eea | 108 | |
krogedal | 5:44b2454a5eea | 109 | /// Reset distance measurement |
krogedal | 5:44b2454a5eea | 110 | void distRst(void); |
krogedal | 5:44b2454a5eea | 111 | |
krogedal | 5:44b2454a5eea | 112 | /// Reset distance measurement |
krogedal | 5:44b2454a5eea | 113 | void tempRst(void); |
krogedal | 5:44b2454a5eea | 114 | |
krogedal | 5:44b2454a5eea | 115 | /// Start encoder reading |
krogedal | 5:44b2454a5eea | 116 | void start(void); |
krogedal | 5:44b2454a5eea | 117 | |
krogedal | 5:44b2454a5eea | 118 | /// Stop encoder reading |
krogedal | 5:44b2454a5eea | 119 | void reset(void); |
krogedal | 0:441289ea4e29 | 120 | |
krogedal | 0:441289ea4e29 | 121 | /** |
krogedal | 0:441289ea4e29 | 122 | * Read the state of the encoder. |
krogedal | 0:441289ea4e29 | 123 | * |
krogedal | 0:441289ea4e29 | 124 | * @return The current state of the encoder as a 2-bit number, where: |
krogedal | 0:441289ea4e29 | 125 | * bit 1 = The reading from channel B |
krogedal | 0:441289ea4e29 | 126 | * bit 2 = The reading from channel A |
krogedal | 0:441289ea4e29 | 127 | */ |
krogedal | 0:441289ea4e29 | 128 | int getCurrentState(void); |
krogedal | 0:441289ea4e29 | 129 | |
krogedal | 0:441289ea4e29 | 130 | /** |
krogedal | 0:441289ea4e29 | 131 | * Read the number of pulses recorded by the encoder. |
krogedal | 0:441289ea4e29 | 132 | * |
krogedal | 0:441289ea4e29 | 133 | * @return Number of pulses which have occured. |
krogedal | 0:441289ea4e29 | 134 | */ |
krogedal | 0:441289ea4e29 | 135 | int getPulses(void); |
krogedal | 0:441289ea4e29 | 136 | |
krogedal | 0:441289ea4e29 | 137 | }; |
krogedal | 0:441289ea4e29 | 138 | |
krogedal | 0:441289ea4e29 | 139 | #endif |