11#include " foc_utils.h"
22
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 };
83
94// function approximating the sine calculation by using fixed size array
105// ~40us (float array)
116// ~50us (int array)
127// precision +-0.005
138// 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+
1516 if (a < _PI_2){
1617 // return sine_array[(int)(199.0f*( a / (_PI/2.0)))];
1718 // return sine_array[(int)(126.6873f* a)]; // float array optimized
@@ -36,15 +37,15 @@ float _sin(float a){
3637// ~56us (int array)
3738// precision +-0.005
3839// it has to receive an angle in between 0 and 2PI
39- float _cos (float a){
40+ __attribute__ ((weak)) float _cos(float a){
4041 float a_sin = a + _PI_2;
4142 a_sin = a_sin > _2PI ? a_sin - _2PI : a_sin;
4243 return _sin (a_sin);
4344}
4445
4546
4647// normalizing radian angle to [0,2PI]
47- float _normalizeAngle (float angle){
48+ __attribute__ ((weak)) float _normalizeAngle(float angle){
4849 float a = fmod (angle, _2PI);
4950 return a >= 0 ? a : (a + _2PI);
5051}
@@ -57,15 +58,13 @@ float _electricalAngle(float shaft_angle, int pole_pairs) {
5758// square root approximation function using
5859// https://reprap.org/forum/read.php?147,219210
5960// 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
6362 // float x;
6463 // const float f = 1.5F; // better precision
6564
6665 // x = number * 0.5F;
67- y = number;
68- i = * ( long * ) &y;
66+ float y = number;
67+ long i = * ( long * ) &y;
6968 i = 0x5f375a86 - ( i >> 1 );
7069 y = * ( float * ) &i;
7170 // y = y * ( f - ( x * y * y ) ); // better precision
0 commit comments