Skip to content

Commit c27bc4b

Browse files
Merge pull request #416 from dekutree64/dev
Fix for #415 sin/cos integer overflow on 16-bit CPUs
2 parents eb4fd7f + b203b83 commit c27bc4b

File tree

1 file changed

+6
-5
lines changed

1 file changed

+6
-5
lines changed

src/common/foc_utils.cpp

+6-5
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,21 @@ __attribute__((weak)) float _sin(float a){
99
// 16 bit precision on sine value, 8 bit fractional value for interpolation, 6bit LUT size
1010
// resulting precision compared to stdlib sine is 0.00006480 (RMS difference in range -PI,PI for 3217 steps)
1111
static uint16_t sine_array[65] = {0,804,1608,2411,3212,4011,4808,5602,6393,7180,7962,8740,9512,10279,11039,11793,12540,13279,14010,14733,15447,16151,16846,17531,18205,18868,19520,20160,20788,21403,22006,22595,23170,23732,24279,24812,25330,25833,26320,26791,27246,27684,28106,28511,28899,29269,29622,29957,30274,30572,30853,31114,31357,31581,31786,31972,32138,32286,32413,32522,32610,32679,32729,32758,32768};
12+
int32_t t1, t2;
1213
unsigned int i = (unsigned int)(a * (64*4*256.0f/_2PI));
13-
int t1, t2, frac = i & 0xff;
14+
int frac = i & 0xff;
1415
i = (i >> 8) & 0xff;
1516
if (i < 64) {
16-
t1 = sine_array[i]; t2 = sine_array[i+1];
17+
t1 = (int32_t)sine_array[i]; t2 = (int32_t)sine_array[i+1];
1718
}
1819
else if(i < 128) {
19-
t1 = sine_array[128 - i]; t2 = sine_array[127 - i];
20+
t1 = (int32_t)sine_array[128 - i]; t2 = (int32_t)sine_array[127 - i];
2021
}
2122
else if(i < 192) {
22-
t1 = -sine_array[-128 + i]; t2 = -sine_array[-127 + i];
23+
t1 = -(int32_t)sine_array[-128 + i]; t2 = -(int32_t)sine_array[-127 + i];
2324
}
2425
else {
25-
t1 = -sine_array[256 - i]; t2 = -sine_array[255 - i];
26+
t1 = -(int32_t)sine_array[256 - i]; t2 = -(int32_t)sine_array[255 - i];
2627
}
2728
return (1.0f/32768.0f) * (t1 + (((t2 - t1) * frac) >> 8));
2829
}

0 commit comments

Comments
 (0)