Simon Krogedal / Karbot_wheel_control

Dependencies:   mbed ros_lib_melodic

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?

UserRevisionLine numberNew 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