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.

[参考译文] 传感器与IQ数学库中的两个补码格式

Guru**** 2028700 points
Other Parts Discussed in Thread: TMP102
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/573438/two-s-complement-format-from-sensor-vs-iq-math-library

主题:TMP102中讨论的其他部件

大家好,  

我有几个TMP102通过i2c连接到我的F2.8027万微控制器。 一切都很好。 我还使用IQ数学库(顺便说一句,这是一件很棒的事情)。 我的传感器以分数二补码格式返回温度,因此实际上已经是Q值。 我将读出值(来自i2c)存储在UINT16中,函数返回_IQ格式。

但是,来自TMP102的数据仅为12b。 像_iq4 (或_iq8,具体取决于对齐情况)一样处理(投射)它们仅适用于正数。 对于负数,我需要检查最重要的位(位11),然后修改32b变量(_IQ编号)中的其余位。

长话短说,如果第11位是负的,我需要将位31:12设置为1。

现在,问题是:

最优雅的方法是什么?  

提前感谢!  

Jiri

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Jiri:

    执行此操作的最优雅方法是什么?  [/引述]

    将12位值转换为带符号整数,左移4,右移4

    Int16_t A =((Int16_t) RAW << 4)>> 4)

    当您右移带符号整数时,它将标记Extend,即最大的位移入。 在程序集中,它转换为逻辑左移4,然后是算术右移4

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Vishal,

    谢谢! 我测试了两个不同的版本。

    第一个是您的:

    Int32数据;
    数据=(((Int32) hal _I2CRead (add,reg,2)<< 16)>> 20);
    返回(_iq4)数据); 

    我的hal_I2CRead函数返回UINT32。 来自TMP102的12b结果与左对齐。 因此,我向左移动16次,向右移动20次,转到ger _iq4。

    第二个版本来自 http://graphics.stanford.edu/~seander/bithacks.html#FixedSignExtend "Sign Extending from a Constant bit-width"它使用 了在C中使用位过滤器的漂亮技巧

    结构{Int32 x:12;}数据;
    data.x =(hal _ I2CRead (add,reg,2)>> 4);
    返回((_iq4)data.x); 

    我还需要检查启用优化时会发生什么。

    此致,Jiri