Wheel control software for satellite microcontroller running the motors on the Karbor

Dependencies:   mbed ros_lib_melodic

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?

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