在嵌入式单片机中,MCU的运算性能往往是有限的,在嵌入式编程中常常会碰到三角函数的运算,精确的三角函数运算是十分消耗MCU资源的,在这个过程中我们应权衡计算负担和计算精度。
以下是在嵌入式单片机中资源相对紧张对计算精度不是十分严格的情况下实现的三角函数运算,函数通过查表得方法,在确保一定精度的前提下,大大节省了MCU的计算资源。
1.函数声明:
int common_sin_val_calculate(int angle);
int common_cos_val_calculate(int angle);
int common_tan_val_calculate(int angle);
#define SIN(val) common_sin_val_calculate(val) / 100.0
#define COS(val) common_cos_val_calculate(val) / 100.0
#define TAN(val) common_tan_val_calculate(val) / 100.0
2. 数据资源表:
static const int sinTable[91] = {0, 2, 3, 5, 7, 9, 10, 12, 14, 16, 17, 19, 21, 22, 24, 26, 28, 29, 31, 33, 34, 36, 37, 39, 41, 42, 44, 45, 47, 48, 50,
52, 53, 54, 56, 57, 59, 60, 62, 63, 64, 66, 67, 68, 69, 70, 72, 73, 74, 75, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 87, 88, 89, 90, 91, 91,
92, 93, 93, 94, 95, 95, 96, 96, 97, 97, 97, 98, 98, 98, 99, 99, 99, 99, 100, 100, 100, 100, 100, 100};
static const int cosTable[91] = {100, 100, 100, 100, 100, 100, 99, 99, 99, 99, 98, 98, 98, 97, 97, 97, 96, 96, 95, 95, 94, 93, 93, 92, 91, 91, 90, 89,
88, 87, 87, 86, 85, 84, 83, 82, 81, 80, 79, 78, 77, 75, 74, 73, 72, 71, 69, 68, 67, 66, 64, 63, 62, 60, 59, 57, 56, 54, 53, 52, 50, 48, 47, 45,
44, 42, 41, 39, 37, 36, 34, 33, 31, 29, 28, 26, 24, 22, 21, 19, 17, 16, 14, 12, 10, 9, 7, 5, 3, 2, 0};
3.函数实现:
/*angle:(0 ~3600)
return sin(angle) * 100*/
int common_sin_val_calculate(int angle) //
{
angle = (angle + 3600 ) % 3600;
if ((angle >= 0) && (angle <= 900)){
return sinTable[angle / 10];
}
else if ((angle > 900) && (angle <= 1800)){
return cosTable[(angle - 900) / 10];
}
else if ((angle > 1800) && (angle <= 2700)){
return -sinTable[(angle - 1800) / 10];
}
else{
return -cosTable[(angle - 2700) / 10];
}
}
/*angle:(0 ~3600)
return sin(angle) * 100*/
int common_cos_val_calculate(int angle) //
{
angle = (angle + 3600 ) % 3600;
if ((angle >= 0) && (angle <= 900)){
return cosTable[angle / 10];
}
else if ((angle > 900) && (angle <= 1800)){
return -sinTable[(angle - 900) / 10];
}
else if ((angle > 1800) && (angle <= 2700)){
return -cosTable[(angle - 1800) / 10];
}
else{
return sinTable[(angle - 2700) / 10];
}
}
/*angle:(0 ~3600)
return tan(angle) * 100 */
int common_tan_val_calculate(int angle)
{
angle = (angle + 3600 ) % 3600;
if ((angle % 900 ) == 0) return 0;
return common_sin_val_calculate(angle) * 100 / common_cos_val_calculate(angle);
}
实验运行测试得出该方法计算精度可控制在0.01左右,在绝大多数嵌入式场景下精度是相对足够的。
————————————————
版权声明:本文为CSDN博主「嵌入式小宁」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_53592457/article/details/131702856
|
|