将Q18.2转换为浮点数

时间:2018-04-29 12:35:13

标签: c floating-point fixed-point

我正试图从MPL3115读取压力值。 在第14.3章,ds说:

  

压力数据存储为带有小数部分的20位无符号整数。该   OUT_P_MSB(01h),OUT_P_CSB(02h)和OUT_P_LSB(03h)的第7位到第6位   寄存器包含Pascals中的整数部分。 OUT_P_LSB的第5到4位包含   分数分量。该值代表Q18.2定点格式,其中   有18个整数位和2个小数位。

这是我的(测试)Microchip XMEGA(GCC)代码:

#define MPL3115_ADDRESS                 0x60
#define MPL3115_REG_PRESSURE_DATA       0x01

bool _ReadRegister(uint8_t address, uint8_t *readBuf, uint8_t readCount)
{
    TWI_MasterWriteRead(&twiMaster, MPL3115_ADDRESS, &address, 1, readCount);
    while (twiMaster.status != TWIM_STATUS_READY);
    memcpy(readBuf, (void *) twiMaster.readData, readCount);
    return true;
}

bool MPL3115_ReadPressure(float *value) {
    uint8_t raw[3];

    _ReadRegister(MPL3115_REG_PRESSURE_DATA, raw, 3);
    uint32_t data = (((uint32_t) raw[0]) << 16) | (((uint32_t) raw[1]) << 8) | raw[2];
    uint32_t q18n2 = data >> 4;

    *value = (double) q18n2 / 4;
    return true;
}

我很确定i2c系列正在工作,因为我可以成功读取同一芯片的温度。 我将其配置为气压计模式和128次过采样(CTRL_REG1 = 0x38)。 在调试模式下,我读取了以下值:

  • raw0 = 0x18
  • raw1 = 0x25
  • raw2 = 0x70
  • data = 1582448

获得Pascal的压力我必须右移4位数据:

  • q18n2 = 98908

现在将Q18.2转换为浮点数我应该乘以2 ^ -n或除以4:

  • value = 24727 Pa

这应该是Pascal,所以除以100得到mBar = 247.27 mBar ...我不太可能在这里有这样的压力!顺便说一句,现在应该在1008 mBar左右。

我的想法是否有任何错误?

1 个答案:

答案 0 :(得分:2)

您必须右移6位数据,然后添加小数部分(2位* 0.25)。

*value = (raw0 << 10) | (raw1 << 2) | (raw2 >> 6);
*value += 0.25 * ((raw2 >> 4) & 0x03);