ZHCADY9 April   2024 LM73 , LM75B , LM95071 , TMP100 , TMP101 , TMP102 , TMP103 , TMP104 , TMP107 , TMP1075 , TMP108 , TMP112 , TMP114 , TMP116 , TMP117 , TMP121 , TMP122 , TMP123 , TMP124 , TMP126 , TMP144 , TMP175 , TMP1826 , TMP1827 , TMP275 , TMP400 , TMP401 , TMP411 , TMP421 , TMP422 , TMP423 , TMP431 , TMP432 , TMP435 , TMP451 , TMP461 , TMP464 , TMP468 , TMP4718 , TMP75 , TMP75B , TMP75C

 

  1.   1
  2.   摘要
  3.   商标
  4. 1引言
    1. 1.1 二进制补码
      1. 1.1.1 二进制补码特征
    2. 1.2 Q 格式
    3. 1.3 常见温度数据格式
    4. 1.4 高精度温度数据格式
  5. 2代码示例
    1. 2.1  16 位(采用 Q7 表示法)
      1. 2.1.1 属性
      2. 2.1.2 C 代码
    2. 2.2  12 位(采用 Q4 表示法)
      1. 2.2.1 属性
      2. 2.2.2 C 代码
    3. 2.3  13 位(采用 Q4 表示法)(EM=1)
      1. 2.3.1 属性
      2. 2.3.2 C 代码
    4. 2.4  13 位(采用 Q4 表示法)
      1. 2.4.1 属性
      2. 2.4.2 C 代码
    5. 2.5  14 位(采用 Q6 表示法)
      1. 2.5.1 属性
      2. 2.5.2 C 代码
    6. 2.6  TMP182x 格式
      1. 2.6.1 属性
      2. 2.6.2 C 代码
    7. 2.7  14 位(采用 Q5 表示法)
      1. 2.7.1 属性
      2. 2.7.2 C 代码
    8. 2.8  8 位(无 Q 表示法)
      1. 2.8.1 属性
      2. 2.8.2 C 代码
    9. 2.9  11 位(采用 Q3 表示法)
      1. 2.9.1 属性
      2. 2.9.2 C 代码
    10. 2.10 不采用二进制补码的器件
      1. 2.10.1 属性
      2. 2.10.2 C 代码
  6. 3其他编程语言
    1. 3.1 解析
    2. 3.2 二进制补码
    3. 3.3 丢弃未使用的位
    4. 3.4 应用 Q 格式
  7. 4总结
  8. 5参考资料
  9. 6附录:Q 应用源代码
  10. 7附录:器件概要表

应用 Q 格式

  • 该值必须转换为浮点数据类型,然后乘以器件分辨率。
  • 如果需要避免使用浮点数据类型,则可以通过右移来丢弃小数位的温度数据。或者,可以使用整数数据类型来存储 mC(毫摄氏度)数据,方法是在右移之前将温度值乘以 1000。
/* C Decode 12-bit Q4 */
unsigned char b1 = 0xff;
unsigned char b2 = 0xf0;

/* combine 8 bit bytes into 16 bit word, 
 apply signed type cast to upper byte */
int x = (signed char) b1 << 8 | b2; 

/* shift to discard unused bits */
int y = x >> 4;

/* Q4 is 2^-4 = 1/16 = 0.0625
 cannot use shift operators on float
 use multiply or divide to create right shift */
float a = y * 0.0625f;

/* discard Q4 bits for a whole number result */
int b = y >> 4;

/* scale by 1000 then shift by Q# to get 
 fractional result without float data type */
int c = y * 1000 >> 4; /* milliCelsius */

/* a is -0.0625, b is -1, and c is -63 */
printf("x:%d y:%d a:%f b:%d c:%d\n",x,y,a,b,c);
/* C Encode 12-bit Q4 */
float in = -0.0625f;

/* Q4 is 2^-4 = 1/16 = 0.0625 
 cannot use shift operators on float
 emulate left shift using multiply */
short int r = in * 16;

/* left shift to create unused/discard bits */
short int s = r << 4;

/* s is 0xFFF0 */
printf("r:%d s:%d sx:%hx",r,s,s);
  • 表 3-7 显示了 12 位 Q4 的完整 Excel 设计。第 1 行展示了对从传感器接收的数据进行解码,而第 2 行展示了对要发送到器件的数据进行编码。
表 3-7 Q 格式的 Excel 示例
ABCDE
11810=HEX2DEC(A1)=IF(B1>=2^15,B1-2^16,B1)=INT(C1*2^-4)=D1*0.0625
2-0.0625=IF(A2<0,A2+2^8,A2)=INT(B2*2^4)=C2*2^4=DEC2HEX(D2)
表 3-8 Q 格式的 Excel 计算结果
A B C D E
1 1810 6160 6160 385 24.0625
2 -0.0625 255.9375 4095 65520 FFF0

以下代码展示了一个针对 12 位 Q4 的完整 JavaScript 和 Python 解码设计,可用于读取温度数据。

/* JavaScript */
function decode(x) {return (((x & 0x8000) ? x - 0x10000 : x) >> 4) * 0.0625}
let x = decode(0x1810)
let y = decode(0xFFF0)
/* x is 24.0625 and y is -0.0625 */
# Python
def decode(x): return ((x-0x10000 if (x & 0x8000) else x) >> 4) * 0.0625
x = decode(0x1810)
y = decode(0xFFF0)
# x is 24.0625
# y is -0.0625

以下代码展示了一个针对 12 位 Q4 的温度编码 JavaScript 和 Python 设计,可用于对温度限制或偏移设置进行编码。

/* JavaScript */
function encode(x) {return ((x < 0 ? x + 0x100 : x) * 16) << 4}
let x = encode(24.0625).toString(16)
let y = encode(-0.0625).toString(16)
/* x is '1810' and y is 'fff0' */
# Python
def encode(x): return int((x+0x100 if (x < 0) else x) * 16) << 4
x = hex(encode(24.0625))
y = hex(encode(-0.0625))
# x is '0x1810'
# y is '0xfff0'