This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

MotorWare中电压采集疑问

Other Parts Discussed in Thread: DRV8301, MOTORWARE

DRV8301_REVB,F2806M

各位好!有个问题,在调试motorware代码时(所用的motorware_1_01_00_14),读取ADC的电压,例如线电压,源代码如下:

  // read the dcBus voltage value  
value = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_7);     // divide by 2^numAdcBits = 2^12  
value = _IQ12mpy(value,voltage_sf);  
pAdcData->dcBus = value;

查看IQmathLib.h可以知道GLOBAL_Q 为 24,但是这里采用IQ12的乘法即_IQ12mpy(  )实现,请问是如何实现的?

其后的注释说是除以ADC的位数,由IQ24除以2^12时候直接利用_IQmpy(  )实现?

Thank you in advance!~

Zhang YJ

 

  • value的结果是result强制转换来的所以其值是IQ0,voltage_sf是IQ24,使用_IQ12mpy结果就是IQ12,而global是IQ24,这样就是除以2^12了

  • "value的结果是result强制转换来的所以其值是IQ0" 应该是强制转换为(_iq)吧?而_iq默认的是全局IQ即IQ24而非IQ0.

    另外_IQ12mpy(IQ24,IQ24)返回的结果是IQ24/2^12? 如果是,这个是怎么得来的?谢谢!

  • YJ Zhang 说:

    "value的结果是result强制转换来的所以其值是IQ0" 应该是强制转换为(_iq)吧?而_iq默认的是全局IQ即IQ24而非IQ0.

    另外_IQ12mpy(IQ24,IQ24)返回的结果是IQ24/2^12? 如果是,这个是怎么得来的?谢谢!

    强制类型转换类型是iq格式但是值是不变的,所以其实他的实际值还是原来的值,你说的那个转换为IQ24的得要大写。

    IQ0和IQ24相乘,和两个IQ12相乘可以等价。

  • 恩,好的,谢谢!加上你的上个回答,有些理解了。还想问个问题,在TI文档《C28x IQmath Library_V1.5c   June 6, 2010 》中Page9 页讲到使用IQ格式时候有别名定义如下:

    typedef   long    _iq;     /* Fixed point data type: GLOBAL_Q format */
     typedef   long    _iq30;   /* Fixed point data type: Q30 format      */
    typedef   long    _iq29;   /* Fixed point data type: Q29 format      */

    即使用_iq对long数据类型进行定义,定义出来的是IQ0的格式还是GLOBAL_Q格式?怎么理解?谢谢!~

  • 定义的是GLOBAL_Q格式的