1、在 F2812 的 ROM 中,有 3K16 位被保留用于存放数学公式表以及未来的开发。主要应用于高速度和高精度的实时计算,比同等程度的 ANSIC C 语言效率更高,同时可以节省用户更多的设计和调试时间。在此我对 IQmath 的应用做一下总结,纯属个人见解,仅供大家参考。1 IQmath 库为了应用 IQmath,首先要从 TI 官方网站下载 IQmath 库,文档名称为 SPRC087。我们主要应用库里面的:IQmath.cmd ,IQmathLib.h, IQmath.lib。新建一个工程,将 IQmath.lib,IQmath.cmd 添加到工程,同时在 main()函数之前增加语句
2、:#include “IQmathLib.h”。注意:rts2800.lib 和 DSP281x_Headers_nonBIOS.cmd 也要加到工程里面。当然也可以不用 IQmath.cmd 文件,而用自己的 CMD 文件,只要在你的 CMD 里面添加以下代码即可:MEMORYPAGE 0:BOOTROM (RW) : origin = 0x3ff000 , length = 0x000fc0RAMH0 (RW) : origin = 0x3f8000 , length = 0x002000 SECTIONSIQmathTables : load = BOOTROM , type = NOL
3、OAD , PAGE=0 IQmath : load = RAMH0 , PAGE=0 以上代码的红色部分可以适当修改。IQmathTables 段必须设置为 NOLOAD 型。2 IQmath 应用完成以上几步之后就可以在你的主函数里应用 IQmath 提供的函数进行计算了。建议在应用之前把 IQmathLib.h 浏览一下,了解各个函数是怎样实现的。下面举一个简单的例子:#include “DSP281x_Device.h“#include “IQmathLib.h“#define PI 3.14159_iq sinout_iq;float sinout_flt;void main(voi
4、d)InitSysCtrl();InitXintf();DINT;IER=0X0000;IFR=0X0000;sinout_iq=_IQ29sin(_IQ29mpy(_IQ29(0.25),_IQ29(PI);sinout_flt=_IQ29toF(sinout_iq);for(;) 上述代码的功能是计算 sin(/4)的值,然后赋给 sinout_flt,计算结果如图 2.1 所示。图 2.1 实例计算结果 sinout_iq 值的格式为 _iq29 类型(也就是 long 型,参见 IQmathLib.h),所以要通过函数_IQ29toF( sinout_iq)转化为 float 类型,才
5、是我们需要的最终结果。 除个别函数外,一般情况下,计算公式里的所有变量都为一个 iq 类型,如上述主函数的第 6 行语句,全为_iq29 类型。函数的具体讲解请参考 IQmath 手册,在此不再啰嗦。 3 Q 格式的选择 IQmath 一共提供了 30 种 Q 格式,具体选择哪种格式要兼顾精度和值的大小依据下表而定:例如将数 5.0 转为 Q 格式,只能从_iq1_iq28 里面选择,而不能转化为_iq29 和_iq30 表示,因为_iq29 能转化的最大值为 3.999999998,否则会发生溢出。所以在定 Q 格式时要对数的范围做一下估计。也正是由于这个原因,有些三角函数不能采用_iq30
6、 格式。4 计算 arcsin 与 arccos很多人有这样的疑问,函数表里面为什么没有提供 arccos()和 arcsin()函数呢?怎样才能计算这两个函数呢?其实只要你的高等数学过关的话,就很容易理解。因为arccos()和 arcsin()可以通过反正切函数 atan()间接求得,而函数表里面恰好提供了反正切函数,参见以下两个公式:arcsin(X) = atan(X / sqr(-X * X + 1) 反正弦arccos(X) = atan(-X / sqr(-X * X + 1) + 2 * atan(1) 反余弦arcsec(X) = atan(X / sqr(X * X - 1) + sgn(X) - 1) * (2 * atan(1) 反正割arccosec(X) = atan(X / sqr(X * X - 1) + (sgn(X) - 1) * (2 * atan(1) 反余割