| 
   
 
   
 
 
 由于有硬件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, 下载次数: 66) 
 
 
 |