1
1
#include " foc_utils.h"
2
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
3
9
4
// function approximating the sine calculation by using fixed size array
10
5
// ~40us (float array)
11
6
// ~50us (int array)
12
7
// precision +-0.005
13
8
// it has to receive an angle in between 0 and 2PI
14
- float _sin (float a){
9
+ __attribute__ ((weak)) float _sin(float a){
10
+ // int array instead of float array
11
+ // 4x200 points per 360 deg
12
+ // 2x storage save (int 2Byte float 4 Byte )
13
+ // sin*10000
14
+ static const uint16_t 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};
15
+
15
16
if (a < _PI_2){
16
17
// return sine_array[(int)(199.0f*( a / (_PI/2.0)))];
17
18
// return sine_array[(int)(126.6873f* a)]; // float array optimized
@@ -36,15 +37,15 @@ float _sin(float a){
36
37
// ~56us (int array)
37
38
// precision +-0.005
38
39
// it has to receive an angle in between 0 and 2PI
39
- float _cos (float a){
40
+ __attribute__ ((weak)) float _cos(float a){
40
41
float a_sin = a + _PI_2;
41
42
a_sin = a_sin > _2PI ? a_sin - _2PI : a_sin;
42
43
return _sin (a_sin);
43
44
}
44
45
45
46
46
47
// normalizing radian angle to [0,2PI]
47
- float _normalizeAngle (float angle){
48
+ __attribute__ ((weak)) float _normalizeAngle(float angle){
48
49
float a = fmod (angle, _2PI);
49
50
return a >= 0 ? a : (a + _2PI);
50
51
}
@@ -57,15 +58,13 @@ float _electricalAngle(float shaft_angle, int pole_pairs) {
57
58
// square root approximation function using
58
59
// https://reprap.org/forum/read.php?147,219210
59
60
// https://en.wikipedia.org/wiki/Fast_inverse_square_root
60
- float _sqrtApprox (float number) {// low in fat
61
- long i;
62
- float y;
61
+ __attribute__ ((weak)) float _sqrtApprox(float number) {// low in fat
63
62
// float x;
64
63
// const float f = 1.5F; // better precision
65
64
66
65
// x = number * 0.5F;
67
- y = number;
68
- i = * ( long * ) &y;
66
+ float y = number;
67
+ long i = * ( long * ) &y;
69
68
i = 0x5f375a86 - ( i >> 1 );
70
69
y = * ( float * ) &i;
71
70
// y = y * ( f - ( x * y * y ) ); // better precision
0 commit comments