SimpleFOClibrary  2.1
foc_utils.cpp
Go to the documentation of this file.
1 #include "foc_utils.h"
2 
3 // int array instead of float array
4 // 4x200 points per 360 deg
5 // 2x storage save (int 2Byte float 4 Byte )
6 // sin*10000
7 const int sine_array[200] = {0,79,158,237,316,395,473,552,631,710,789,867,946,1024,1103,1181,1260,1338,1416,1494,1572,1650,1728,1806,1883,1961,2038,2115,2192,2269,2346,2423,2499,2575,2652,2728,2804,2879,2955,3030,3105,3180,3255,3329,3404,3478,3552,3625,3699,3772,3845,3918,3990,4063,4135,4206,4278,4349,4420,4491,4561,4631,4701,4770,4840,4909,4977,5046,5113,5181,5249,5316,5382,5449,5515,5580,5646,5711,5775,5839,5903,5967,6030,6093,6155,6217,6279,6340,6401,6461,6521,6581,6640,6699,6758,6815,6873,6930,6987,7043,7099,7154,7209,7264,7318,7371,7424,7477,7529,7581,7632,7683,7733,7783,7832,7881,7930,7977,8025,8072,8118,8164,8209,8254,8298,8342,8385,8428,8470,8512,8553,8594,8634,8673,8712,8751,8789,8826,8863,8899,8935,8970,9005,9039,9072,9105,9138,9169,9201,9231,9261,9291,9320,9348,9376,9403,9429,9455,9481,9506,9530,9554,9577,9599,9621,9642,9663,9683,9702,9721,9739,9757,9774,9790,9806,9821,9836,9850,9863,9876,9888,9899,9910,9920,9930,9939,9947,9955,9962,9969,9975,9980,9985,9989,9992,9995,9997,9999,10000,10000};
8 
9 // function approximating the sine calculation by using fixed size array
10 // ~40us (float array)
11 // ~50us (int array)
12 // precision +-0.005
13 // it has to receive an angle in between 0 and 2PI
14 float _sin(float a){
15  if(a < _PI_2){
16  //return sine_array[(int)(199.0*( a / (_PI/2.0)))];
17  //return sine_array[(int)(126.6873* a)]; // float array optimized
18  return 0.0001*sine_array[_round(126.6873* a)]; // int array optimized
19  }else if(a < _PI){
20  // return sine_array[(int)(199.0*(1.0 - (a-_PI/2.0) / (_PI/2.0)))];
21  //return sine_array[398 - (int)(126.6873*a)]; // float array optimized
22  return 0.0001*sine_array[398 - _round(126.6873*a)]; // int array optimized
23  }else if(a < _3PI_2){
24  // return -sine_array[(int)(199.0*((a - _PI) / (_PI/2.0)))];
25  //return -sine_array[-398 + (int)(126.6873*a)]; // float array optimized
26  return -0.0001*sine_array[-398 + _round(126.6873*a)]; // int array optimized
27  } else {
28  // return -sine_array[(int)(199.0*(1.0 - (a - 3*_PI/2) / (_PI/2.0)))];
29  //return -sine_array[796 - (int)(126.6873*a)]; // float array optimized
30  return -0.0001*sine_array[796 - _round(126.6873*a)]; // int array optimized
31  }
32 }
33 
34 // function approximating cosine calculation by using fixed size array
35 // ~55us (float array)
36 // ~56us (int array)
37 // precision +-0.005
38 // it has to receive an angle in between 0 and 2PI
39 float _cos(float a){
40  float a_sin = a + _PI_2;
41  a_sin = a_sin > _2PI ? a_sin - _2PI : a_sin;
42  return _sin(a_sin);
43 }
44 
45 
46 // normalizing radian angle to [0,2PI]
47 float _normalizeAngle(float angle){
48  float a = fmod(angle, _2PI);
49  return a >= 0 ? a : (a + _2PI);
50 }
51 
52 // Electrical angle calculation
53 float _electricalAngle(float shaft_angle, int pole_pairs) {
54  return (shaft_angle * pole_pairs);
55 }
56 
57 // square root approximation function using
58 // https://reprap.org/forum/read.php?147,219210
59 // https://en.wikipedia.org/wiki/Fast_inverse_square_root
60 float _sqrtApprox(float number) {//low in fat
61  long i;
62  float y;
63  // float x;
64  // const float f = 1.5F; // better precision
65 
66  // x = number * 0.5F;
67  y = number;
68  i = * ( long * ) &y;
69  i = 0x5f375a86 - ( i >> 1 );
70  y = * ( float * ) &i;
71  // y = y * ( f - ( x * y * y ) ); // better precision
72  return number * y;
73 }
_sin
float _sin(float a)
Definition: foc_utils.cpp:14
_PI
#define _PI
Definition: foc_utils.h:20
angle
@ angle
Position/angle motion control.
Definition: FOCMotor.h:30
foc_utils.h
_normalizeAngle
float _normalizeAngle(float angle)
Definition: foc_utils.cpp:47
_PI_2
#define _PI_2
Definition: foc_utils.h:21
_round
#define _round(x)
Definition: foc_utils.h:8
_electricalAngle
float _electricalAngle(float shaft_angle, int pole_pairs)
Definition: foc_utils.cpp:53
_sqrtApprox
float _sqrtApprox(float number)
Definition: foc_utils.cpp:60
_2PI
#define _2PI
Definition: foc_utils.h:23
sine_array
const int sine_array[200]
Definition: foc_utils.cpp:7
_cos
float _cos(float a)
Definition: foc_utils.cpp:39
_3PI_2
#define _3PI_2
Definition: foc_utils.h:24