#define _USE_MATH_DEFINES #include #include "stm32f3xx_hal.h" #include "globals.h" const uint16_t sintab[91]= { 0,571,1143,1714,2285,2855,3425,3993,4560,5125,5689,6252,6812,7370,7927,8480,9031,9580,10125,10667,11206,11742,12274,12803,13327,13847, 14364,14875,15383,15885,16383,16876,17363,17846,18323,18794,19259,19719,20173,20620,21062,21497,21925,22347,22761,23169,23570,23964,24350, 24729,25100,25464,25820,26168,26509,26841,27165,27480,27787,28086,28377,28658,28931,29195,29450,29696,29934,30162,30381,30590,30790,30981,31163, 31335,31497,31650,31793,31927,32050,32164,32269,32363,32448,32522,32587,32642,32687,32722,32747,32762,32767 }; #define sincoeff (1.0f/32767.0f) // ramené ŕ sin[0°..89°] #ifdef CCMRAM __attribute__((section("ccmram"))) #endif // future optim 2x : sin(90-x) = cos(x) ; sin(90+x) = cos(x); sin(x) = cos(90-x) ; cos(90+x) = -sin(x) // Optim 2x : sin(x+180)=-sin(x) ; cos(x+180)=-cos(x) // Optim 2x : cos(180-x)=-cos(x) ; sin(180-x) = sin(x) float sinfsm(float x) { int i; i = (x*180.0f/M_PI); i = i % 360; if (i<0) i+=360; // 4 cadrans. if (i>=270) // 270..359 return -sincoeff*sintab[360-i]; else if (i>=180) // 180..269 return -sincoeff*sintab[i-180]; else if (i>=90) // 90..179 return sincoeff*sintab[180-i]; else // 0..89 return sincoeff*sintab[i]; } #ifdef CCMRAM __attribute__((section("ccmram"))) #endif // future optim 2x : cos(x)= sin(90-x) ; cos(x)=sin(90+x) ; sin(x) = cos(90-x) ; cos(90+x) = -sin(x) float cosfsm(float x) { int i; i = (x*180.0f/M_PI); i = i % 360; if (i<0) i+=360; // 4 cadrans. if (i>=270) // 270..359 return sincoeff*sintab[i-270]; else if (i>=180) // 180..269 return -sincoeff*sintab[270-i]; // sin(180-x) = sin(x) else if (i>=90) // 90..179 return -sincoeff*sintab[i-90]; else // 0..89 return sincoeff*sintab[90-i]; } float tanfsm(float x) { return sinfsm(x)/cosfsm(x); }