SimpleFOClibrary  2.1
MagneticSensorAnalog.cpp
Go to the documentation of this file.
1 #include "MagneticSensorAnalog.h"
2 
8 MagneticSensorAnalog::MagneticSensorAnalog(uint8_t _pinAnalog, int _min_raw_count, int _max_raw_count){
9 
10  pinAnalog = _pinAnalog;
11 
12  cpr = _max_raw_count - _min_raw_count;
13  min_raw_count = _min_raw_count;
14  max_raw_count = _max_raw_count;
15 
16  if(pullup == Pullup::INTERN){
17  pinMode(pinAnalog, INPUT_PULLUP);
18  }else{
19  pinMode(pinAnalog, INPUT);
20  }
21 
22 }
23 
24 
26 
27  // velocity calculation init
28  angle_prev = 0;
29  velocity_calc_timestamp = _micros();
30 
31  // full rotations tracking number
32  full_rotation_offset = 0;
33  raw_count_prev = getRawCount();
34 }
35 
36 // Shaft angle calculation
37 // angle is in radians [rad]
39  // raw data from the sensor
40  raw_count = getRawCount();
41 
42  int delta = raw_count - raw_count_prev;
43  // if overflow happened track it as full rotation
44  if(abs(delta) > (0.8*cpr) ) full_rotation_offset += delta > 0 ? -_2PI : _2PI;
45 
46  float angle = full_rotation_offset + ( (float) (raw_count) / (float)cpr) * _2PI;
47 
48  // calculate velocity here
49  long now = _micros();
50  float Ts = ( now - velocity_calc_timestamp)*1e-6;
51  // quick fix for strange cases (micros overflow)
52  if(Ts <= 0 || Ts > 0.5) Ts = 1e-3;
53  velocity = (angle - angle_prev)/Ts;
54 
55  // save variables for future pass
56  raw_count_prev = raw_count;
57  angle_prev = angle;
58  velocity_calc_timestamp = now;
59 
60  return angle;
61 }
62 
63 // Shaft velocity calculation
65  // TODO: Refactor?: to avoid angle being called twice, velocity is pre-calculted during getAngle
66  return velocity;
67 }
68 
69 // function reading the raw counter of the magnetic sensor
70 int MagneticSensorAnalog::getRawCount(){
71  return analogRead(pinAnalog);
72 }
INTERN
@ INTERN
Use internal pullups.
Definition: Sensor.h:18
MagneticSensorAnalog::init
void init()
Definition: MagneticSensorAnalog.cpp:25
angle
@ angle
Position/angle motion control.
Definition: FOCMotor.h:30
MagneticSensorAnalog::getVelocity
float getVelocity() override
Definition: MagneticSensorAnalog.cpp:64
MagneticSensorAnalog::getAngle
float getAngle() override
Definition: MagneticSensorAnalog.cpp:38
MagneticSensorAnalog.h
MagneticSensorAnalog::MagneticSensorAnalog
MagneticSensorAnalog(uint8_t _pinAnalog, int _min=0, int _max=0)
Definition: MagneticSensorAnalog.cpp:8
MagneticSensorAnalog::pullup
Pullup pullup
Definition: MagneticSensorAnalog.h:28
_2PI
#define _2PI
Definition: foc_utils.h:23
MagneticSensorAnalog::pinAnalog
int pinAnalog
encoder hardware pin A
Definition: MagneticSensorAnalog.h:25
_micros
unsigned long _micros()
Definition: time_utils.cpp:21