lib路径:E:\ti\c2000\C2000Ware_3_03_00_00\libraries\math\IQmath\c28\lib
总结就是:使用fpu加速和不使用fpu加速的,coff格式和eabi格式的
索引加函数lib
我使用eabi格式,fpu加速的。
试一试例子
我对Q进行全局定义,不然改起来太麻烦。
#include<IQmathLib.h>
#define PI 3.14159
#define GLOBAL_Q 29
float input_F,sin_out_F;
long GlobalQ = GLOBAL_Q; // Used for legacy GEL & Graph Debug.
_iq input, sin_out;
void main(void )
{
/* 0.25 x PI radians represented in Q29 format */
input=_IQ(0.25*PI);
//input_F=_IQtoF(input);
sin_out =_IQsin(input);
sin_out_F=_IQtoF(sin_out );
}
新建工程
添加工程需要基本文件
添加lib和头文件,cmd
开始设置
折叠C文件
设置属性
检查路径
可以删掉libc.a
添加预定义,因为我使用flash
添加测试代码
提示一个错误,因为我把inc文件夹放到include里面,两个办法,添加路径或者改变路径,我把inc移出来,在当前文件夹吧
出现内存分配出错,这个一般两个原因,1、预定义没有加_FLASH,2、同时存在两个cmd
删除原来的cmd,保留一个
编译成功,调试看看结果
调试出错,这是因为我还没接板子。。。。。。。。。。。。。。。。。
观察值的变化
调试结果
但这个值是什么意思呢?
头文件里面的一段定义
#define _IQ30(A) (long) ((A) * 1073741824.0L)
#define _IQ29(A) (long) ((A) * 536870912.0L)
#define _IQ28(A) (long) ((A) * 268435456.0L)
#define _IQ27(A) (long) ((A) * 134217728.0L)
#define _IQ26(A) (long) ((A) * 67108864.0L)
乘法
#define _IQmpy2(A) ((A)<<1)
#define _IQmpy4(A) ((A)<<2)
#define _IQmpy8(A) ((A)<<3)
#define _IQmpy16(A) ((A)<<4)
#define _IQmpy32(A) ((A)<<5)
#define _IQmpy64(A) ((A)<<6)
除法
#define _IQdiv2(A) ((A)>>1)
#define _IQdiv4(A) ((A)>>2)
#define _IQdiv8(A) ((A)>>3)
#define _IQdiv16(A) ((A)>>4)
#define _IQdiv32(A) ((A)>>5)
#define _IQdiv64(A) ((A)>>6)
IQ29(0.25*pi)=0.25*3.14159*2^29=421657072
IQ29sin()
_IQ29toF() 转换为浮点数
计算器三角函数输入用角度,有点坑到我了
使用_IQ()转换浮点数,一定不能超过范围
定义一个全局的Q
// Select the global Q value to use:
#define GLOBAL_Q 24
long GlobalQ = GLOBAL_Q; // Used for legacy GEL & Graph Debug.
_IQmpy()乘法
_IQdiv()除法
_IQlog()对数
_IQexp()
IQ数据转换
IQmath的IQ型不像FLOAT32分成3个部分,而是分成了2个部分,整数(符号位包括其中)位和小数位,我仔细看了下IQmath官方的手册,其实每个IQ都是个LONG型,通过不同的位数的定标(其实就是定小数点的位置),来实现不同精度的小数和取值范围,那么IQ15就是用低15位来表示小数位,用来表示整数的部分就是高(32-15)位了,那么照这个思路,我们要把一个整形Uint6直接赋给IQ15也是很容易的了,只要赋值后,再将IQ值向左移位15位就好了。
参考文档
E:\ti\c2000\C2000Ware_3_03_00_00\libraries\math\IQmath\c28\docs IQmath_Quickstart.pdf