Convert Raw 14 bit Two's Complement to Signed 16 bit Integer

后端 未结 5 895
一向
一向 2021-01-17 14:08

I am doing some work in embedded C with an accelerometer that returns data as a 14 bit 2\'s complement number. I am storing this result directly into a uint16_t

5条回答
  •  无人及你
    2021-01-17 14:54

    I would do simple arithmetic instead. The result is 14-bit signed, which is represented as a number from 0 to 2^14 - 1. Test if the number is 2^13 or above (signifying a negative) and then subtract 2^14.

    int16_t fxls8471qr1_convert_raw_accel_to_mag(uint16_t raw, enum fxls8471qr1_fs_range range) 
    {
      int16_t raw_signed = raw;
      if(raw_signed >= 1 << 13) {
        raw_signed -= 1 << 14;
      }
    
      uint16_t divisor;
      if(range == FXLS8471QR1_FS_RANGE_2G) {
        divisor = FS_DIV_2G;
      }
      else if(range == FXLS8471QR1_FS_RANGE_4G) {
        divisor = FS_DIV_4G;
      }
      else {
        divisor = FS_DIV_8G;
      }
    
      return ((int32_t)raw_signed * RAW_SCALE_FACTOR) / divisor;
    }
    

    Please check my arithmetic. (Do I have 13 and 14 correct?)

提交回复
热议问题