SimpleFOClibrary 2.4.0
Loading...
Searching...
No Matches
GenericCurrentSense.cpp
Go to the documentation of this file.
2
3// GenericCurrentSense constructor
4GenericCurrentSense::GenericCurrentSense(PhaseCurrent_s (*readCallback)(), void (*initCallback)()){
5 // if function provided add it to the
6 if(readCallback != nullptr) this->readCallback = readCallback;
7 if(initCallback != nullptr) this->initCallback = initCallback;
8}
9
10// Inline sensor init function
12 // configure ADC variables
13 if(initCallback != nullptr) initCallback();
14 // calibrate zero offsets
15 calibrateOffsets();
16 // set the initialized flag
18 // return success
19 return 1;
20}
21// Function finding zero offsets of the ADC
22void GenericCurrentSense::calibrateOffsets(){
23 const int calibration_rounds = 1000;
24
25 // find adc offset = zero current voltage
26 offset_ia = 0;
27 offset_ib = 0;
28 offset_ic = 0;
29 // read the adc voltage 1000 times ( arbitrary number )
30 for (int i = 0; i < calibration_rounds; i++) {
31 PhaseCurrent_s current = readCallback();
32 offset_ia += current.a;
33 offset_ib += current.b;
34 offset_ic += current.c;
35 _delay(1);
36 }
37 // calculate the mean offsets
38 offset_ia = offset_ia / calibration_rounds;
39 offset_ib = offset_ib / calibration_rounds;
40 offset_ic = offset_ic / calibration_rounds;
41}
42
43// read all three phase currents (if possible 2 or 3)
45 PhaseCurrent_s current = readCallback();
46 current.a = (current.a - offset_ia); // amps
47 current.b = (current.b - offset_ib); // amps
48 current.c = (current.c - offset_ic); // amps
49 return current;
50}
51
52// Function aligning the current sense with motor driver
53// if all pins are connected well none of this is really necessary! - can be avoided
54// returns flag
55// 0 - fail
56// 1 - success and nothing changed
57int GenericCurrentSense::driverAlign(float voltage, bool modulation_centered){
58 _UNUSED(voltage) ; // remove unused parameter warning
59 int exit_flag = 1;
60 if(skip_align) return exit_flag;
61 if (!initialized) return 0;
62 return exit_flag;
63}
@ voltage
Torque control using voltage.
Definition FOCMotor.h:63
bool skip_align
variable signaling that the phase current direction should be verified during initFOC()
void * params
pointer to hardware specific parameters of current sensing
GenericCurrentSense(PhaseCurrent_s(*readCallback)()=nullptr, void(*initCallback)()=nullptr)
PhaseCurrent_s(* readCallback)()
function pointer to sensor reading
void(* initCallback)()
function pointer to sensor initialisation
PhaseCurrent_s getPhaseCurrents() override
int driverAlign(float align_voltage, bool modulation_centered) override
#define SIMPLEFOC_CURRENT_SENSE_INIT_FAILED
#define _UNUSED(v)
Definition foc_utils.h:14
float c
Definition foc_utils.h:68
float a
Definition foc_utils.h:66
float b
Definition foc_utils.h:67
void _delay(unsigned long ms)
Definition time_utils.cpp:5