编写 DSP 程序时(TMS320F28335),如果直接调用系统自带的 acos 函数,有时会出现莫名其妙的错误 (如同步坐标系中的电流在稳态情况下本来是直流,但可能出现尖峰)。这是因为 acos() 函数存在 Bug 。理论上
acos(−1)=π ,但 DSP 的计算结果可能是 0.
由于只有这一个点有错误,所以可以很容易将该 Bug 排除。
图 1:不同角度下的正弦和余弦值
图 1 给出了不同角度下的正弦和余弦值。显然,发生 Bug 的区域位于图中蓝 {MOD}区域内。如果计算正确的话,下列几个式子无法同时成立。
ar<−0.95
∣∣∣br∣∣∣<0.05
|θ|<0.3or|θ−2π|<0.3
其中,
a,
b 分别为横坐标和纵坐标,他们均可正可负;
θ 是对应的角度值。
上述三个式子中的前两个条件将角度限制在了图 1 中的蓝 {MOD}区域内,而第三个条件又表示角度在 0 附近。因此,如果这几个条件同时满足,说明进入到了 Bug 中,这时候只需要将得到的数值强制变为
π 就好了。
因此,如果横坐标为
a 及纵坐标
b 已知,计算对应的角度值的程序如下:
r = sqrt(a*a + b*b);
theta = acos(a/r);// acos:0-PI
if (b < 0) //PI-2*PI
{
theta = 2*PI - theta;
}
if ( (a/r<0.95) &&
( (b/r<0.05) && (b/r>-0.05) ) &&
( (theta<0.3) || ((2*PI - theta)<0.3) )
)//由于 theta 已限制在0-2pi,所以第三个表达式可简化
{
theta = PI;
}
经过排除 Bug 后的运行结果正常。
实际上,已经有人在 TI 的论坛上反馈过这个错误了,详情请点击
链接。