最近被_iq弄得有点迷糊,还求指点哇。
有如下代码:
#ifndef GLOBAL_Q
#define GLOBAL_Q 24
#endif
#define OFFSET (_IQ12(0.05))
_iq x;
_iq m;
_iq y;
x =(_iq)ADC_readResult(…); //ADC_readResult返回uint_least16_t型,为ADC结果寄存器里面的值
m = _IQ12mpy(x, OFFSET);
y = x-m;
/***************************/
问题1:这里定义的x、m、y是_IQ24格式的吗?
问题2:ADC结果寄存器里面的值为ADCRESULT,为16位无符号整型,范围为0-4095,上述代码中的x=ADCRESULT/2^24、ADCRESULT*2^24还是就直接等于ADCRESULT?为啥要(_iq)强制转换?
问题3:对于float型强制转换为_iq型,假如有float a=5.1; 那么(_iq) a是为5.1呢还是5.1*2^24?
HeiHei:
1、你可以看看IQmathLib.h的定义,里面有typedef long _iq;,这样其实定义iq格式的数据都是按照long型处理的,所以x m y的数据类型你可以当做是int32,或者是long。
2、x =(_iq)ADC_readResult(…);这一句是个强制类型转换,最关键的是你要理解好下一句m = _IQ12mpy(x, OFFSET);,在这里,x 和 OFFSET数据类型是long型,q值为12,也就是说在_IQ12mpy函数处理的时候认为x是一个q12的数
3、根据问题1的理解 (_iq) a也是个强制类型转换,把一个浮点数转换成了long型