由于有硬件TFPU的单片机AI8051U中,
并 没有 asin 和 acos 的加速支持,
所以在添加了支持硬件TFPU的数学库后,
会出现asin和acos运行不正常的问题。
===使用 atan 来间接实现
但是使用模拟计算又会使得计算时间延长许多,
那有没有什么两全其美的方式呢?
这里给出一种利用atan来间接计算asin和acos的方式,
同时提供验证过的工程,保证方案的正确性
首先是代码部分:
- float asin2(float x) { float t = x / (1.0 + sqrt(1.0 - x * x));return 2.0 * atan(t); }
- float acos2(float x) { float t = sqrt((1.0 - x) / (1.0 + x));return 2.0 * atan(t); }
复制代码
仅需要添加以上两行代码,然后使用asin2(在math库中没有这个名字,这里加个2是避免冲突)
然后就像正常的调用asin和acos就可以了
测试程序如下:
- void main(void)
- {
- P2M0 |= 0x01; P2M1 &= ~0x01;//设置P20为推挽输出,用于测量计算消耗时间
- f1 = 0.5f;
- while(1)
- {
- P20 = 0;
- f2 = sin(f1);
- f3 = asin2(f2);
- f2 = cos(f1);
- f3 = acos2(f2);
- P20 = 1;
- Delay10ms();
- }
- }
复制代码
使用USB硬件仿真进行正确性验证,可以看到,当运行完成f2 = sin(f1);后,f2的值为0.47942555
然后再继续运行一条f3 = asin2(f2);,可以看到f3的值为0.5,与f1的值相同,证明经过sin后,asin2后可以正常还原数值
同时,经过使用示波器测量,可以得到在添加TFPU库和不添加TFPU库下(这个测量屏蔽掉了sin和cos运算,单纯测量asin2和acos2),速度提升大约为90.3us/15.9us≈5.67倍
虽然是间接实现,但是仍然比模拟计算提高了不少的速度。
添加TFPU进行加速的情况下 | 不添加TFPU进行加速的情况下
以下是测试的工程:
asin和acos测试程序.zip
(44.69 KB, 下载次数: 0)
|