Control project for the Lift-arm. Works with ROS Melodic
Dependencies: mbed Servo ros_lib_melodic ULN2003_StepperDriver Async_4pin_Stepper
src/encoder.h
- Committer:
- krogedal
- Date:
- 2021-05-31
- Revision:
- 4:9edb248c6431
- Parent:
- 3:4b6080e86761
File content as of revision 4:9edb248c6431:
#ifndef KARBOT_ENCODER_H #define KARBOT_ENCODER_H /* Karbot encoder class * * This class is based upon the QEI class by Aaron Berk and the encoder class * I wrote during ESP in 2nd year * * Written by Simon Krogedal * 27/05/21 * Team 9 4th Year project * * for NUCLEO-F401RE * */ #include "mbed.h" #define PREV_MASK 0x1 //Mask for the previous state in determining direction //of rotation. #define CURR_MASK 0x2 //Mask for the current state in determining direction //of rotation. #define INVALID 0x3 //XORing two states where both bits have changed. class encoder { private: int tot_clicks, temp_tot; // clicks since last distance reset double click_rate, click_store;// clickrate bool c_d; // left or right bool /** * Update the pulse count. * * Called on every rising/falling edge of channels A/B. * * Reads the state of the channels and determines whether a pulse forward * or backward has occured, updating the count appropriately. */ void encode(void); InterruptIn channelA_; InterruptIn channelB_; int pulsesPerRev_; int prevState_; int currState_; volatile int pulses_; protected: Ticker sampler; // ticker object to sample speed double period, enc_const; // sampling period and wheel constant void sample_func(void); // sample function double getClicks(void); // returns clickrate public: // Constructor takes 3 encoder input pins, CPR, left or right bool, sampling period, and a wheel-size constant encoder(PinName chanA, PinName chanB, int CPR, bool c, double p, double ec); double getSpeed(void); // returns wheel speed double getDistance(void); // returns distance travelled double tempDist(void); // returns distance travelled void distRst(void); // resets distance void tempRst(void); // resets distance void start(void); // starts recording distance void reset(void); // resets counting /** * Read the state of the encoder. * * @return The current state of the encoder as a 2-bit number, where: * bit 1 = The reading from channel B * bit 2 = The reading from channel A */ int getCurrentState(void); /** * Read the number of pulses recorded by the encoder. * * @return Number of pulses which have occured. */ int getPulses(void); }; #endif