92 lines
2.9 KiB
C++
92 lines
2.9 KiB
C++
#ifndef ENCODER_LIB_H
|
|
#define ENCODER_LIB_H
|
|
|
|
#include "Arduino.h"
|
|
#include "../common/foc_utils.h"
|
|
#include "../common/time_utils.h"
|
|
#include "../common/base_classes/Sensor.h"
|
|
|
|
|
|
/**
|
|
* Quadrature mode configuration structure
|
|
*/
|
|
enum Quadrature : uint8_t {
|
|
ON = 0x00, //!< Enable quadrature mode CPR = 4xPPR
|
|
OFF = 0x01 //!< Disable quadrature mode / CPR = PPR
|
|
};
|
|
|
|
class Encoder: public Sensor{
|
|
public:
|
|
/**
|
|
Encoder class constructor
|
|
@param encA encoder B pin
|
|
@param encB encoder B pin
|
|
@param ppr impulses per rotation (cpr=ppr*4)
|
|
@param index index pin number (optional input)
|
|
*/
|
|
Encoder(int encA, int encB , float ppr, int index = 0);
|
|
|
|
/** encoder initialise pins */
|
|
void init() override;
|
|
/**
|
|
* function enabling hardware interrupts for the encoder channels with provided callback functions
|
|
* if callback is not provided then the interrupt is not enabled
|
|
*
|
|
* @param doA pointer to the A channel interrupt handler function
|
|
* @param doB pointer to the B channel interrupt handler function
|
|
* @param doIndex pointer to the Index channel interrupt handler function
|
|
*
|
|
*/
|
|
void enableInterrupts(void (*doA)() = nullptr, void(*doB)() = nullptr, void(*doIndex)() = nullptr);
|
|
|
|
// Encoder interrupt callback functions
|
|
/** A channel callback function */
|
|
void handleA();
|
|
/** B channel callback function */
|
|
void handleB();
|
|
/** Index channel callback function */
|
|
void handleIndex();
|
|
|
|
|
|
// pins A and B
|
|
int pinA; //!< encoder hardware pin A
|
|
int pinB; //!< encoder hardware pin B
|
|
int index_pin; //!< index pin
|
|
|
|
// Encoder configuration
|
|
Pullup pullup; //!< Configuration parameter internal or external pullups
|
|
Quadrature quadrature;//!< Configuration parameter enable or disable quadrature mode
|
|
float cpr;//!< encoder cpr number
|
|
|
|
// Abstract functions of the Sensor class implementation
|
|
/** get current angle (rad) */
|
|
float getSensorAngle() override;
|
|
/** get current angular velocity (rad/s) */
|
|
float getVelocity() override;
|
|
virtual void update() override;
|
|
|
|
/**
|
|
* returns 0 if it does need search for absolute zero
|
|
* 0 - encoder without index
|
|
* 1 - ecoder with index
|
|
*/
|
|
int needsSearch() override;
|
|
|
|
private:
|
|
int hasIndex(); //!< function returning 1 if encoder has index pin and 0 if not.
|
|
|
|
volatile long pulse_counter;//!< current pulse counter
|
|
volatile long pulse_timestamp;//!< last impulse timestamp in us
|
|
volatile int A_active; //!< current active states of A channel
|
|
volatile int B_active; //!< current active states of B channel
|
|
volatile int I_active; //!< current active states of Index channel
|
|
volatile bool index_found = false; //!< flag stating that the index has been found
|
|
|
|
// velocity calculation variables
|
|
float prev_Th, pulse_per_second;
|
|
volatile long prev_pulse_counter, prev_timestamp_us;
|
|
};
|
|
|
|
|
|
#endif
|