SimpleFOClibrary  2.1
HallSensor.h
Go to the documentation of this file.
1 #ifndef HALL_SENSOR_LIB_H
2 #define HALL_SENSOR_LIB_H
3 
4 #include "Arduino.h"
5 #include "../common/base_classes/Sensor.h"
6 #include "../common/foc_utils.h"
7 #include "../common/time_utils.h"
8 
9 // seq 1 > 5 > 4 > 6 > 2 > 3 > 1 000 001 010 011 100 101 110 111
10 const int8_t ELECTRIC_SECTORS[8] = { -1, 0, 4, 5, 2, 1, 3 , -1 };
11 
12 class HallSensor: public Sensor{
13  public:
22  HallSensor(int encA, int encB, int encC, int pp);
23 
25  void init();
35  void enableInterrupts(void (*doA)() = nullptr, void(*doB)() = nullptr, void(*doC)() = nullptr);
36 
37  // HallSensor interrupt callback functions
39  void handleA();
41  void handleB();
43  void handleC();
44 
45 
46  // pins A and B
47  int pinA;
48  int pinB;
49  int pinC;
50 
51  // HallSensor configuration
53  float cpr;
54 
55  // Abstract functions of the Sensor class implementation
57  float getAngle() override;
59  float getVelocity() override;
60 
61  // whether last step was CW (+1) or CCW (-1).
63 
64  void attachSectorCallback(void (*onSectorChange)(int a) = nullptr);
65 
66  // the current 3bit state of the hall sensors
67  volatile int8_t hall_state;
68  // the current sector of the sensor. Each sector is 60deg electrical
69  volatile int8_t electric_sector;
70  // the number of electric rotations
71  volatile long electric_rotations;
72  // this is sometimes useful to identify interrupt issues (e.g. weak or no pullup resulting in 1000s of interrupts)
73  volatile long total_interrupts;
74 
75  private:
76 
77  Direction decodeDirection(int oldState, int newState);
78  void updateState();
79 
80  volatile long pulse_timestamp;
81  volatile int A_active;
82  volatile int B_active;
83  volatile int C_active;
84 
85  // function pointer for on sector change call back
86  void (*onSectorChange)(int sector) = nullptr;
87 
88  volatile long pulse_diff;
89 
90 };
91 
92 
93 #endif
HallSensor::cpr
float cpr
HallSensor cpr number.
Definition: HallSensor.h:53
HallSensor::direction
Direction direction
Definition: HallSensor.h:62
HallSensor::pinA
int pinA
HallSensor hardware pin A.
Definition: HallSensor.h:47
HallSensor::pinC
int pinC
HallSensor hardware pin C.
Definition: HallSensor.h:49
HallSensor::enableInterrupts
void enableInterrupts(void(*doA)()=nullptr, void(*doB)()=nullptr, void(*doC)()=nullptr)
Definition: HallSensor.cpp:144
HallSensor::pinB
int pinB
HallSensor hardware pin B.
Definition: HallSensor.h:48
HallSensor::getAngle
float getAngle() override
Definition: HallSensor.cpp:98
Pullup
Pullup
Definition: Sensor.h:17
HallSensor::handleC
void handleC()
Definition: HallSensor.cpp:36
HallSensor
Definition: HallSensor.h:12
HallSensor::getVelocity
float getVelocity() override
Definition: HallSensor.cpp:106
HallSensor::handleB
void handleB()
Definition: HallSensor.cpp:30
Direction
Direction
Definition: Sensor.h:7
HallSensor::hall_state
volatile int8_t hall_state
Definition: HallSensor.h:67
HallSensor::electric_rotations
volatile long electric_rotations
Definition: HallSensor.h:71
HallSensor::electric_sector
volatile int8_t electric_sector
Definition: HallSensor.h:69
HallSensor::init
void init()
Definition: HallSensor.cpp:117
HallSensor::total_interrupts
volatile long total_interrupts
Definition: HallSensor.h:73
HallSensor::handleA
void handleA()
Definition: HallSensor.cpp:25
ELECTRIC_SECTORS
const int8_t ELECTRIC_SECTORS[8]
Definition: HallSensor.h:10
HallSensor::attachSectorCallback
void attachSectorCallback(void(*onSectorChange)(int a)=nullptr)
Definition: HallSensor.cpp:91
HallSensor::HallSensor
HallSensor(int encA, int encB, int encC, int pp)
Definition: HallSensor.cpp:9
Sensor
Definition: Sensor.h:26
HallSensor::pullup
Pullup pullup
Configuration parameter internal or external pullups.
Definition: HallSensor.h:52