Цифровой датчик температуры DS18B20 : как обрабатывать данные с выхода датчика?

#c #embedded #sensors

#c #встроенный #датчики

Вопрос:

Мне нужно преобразовать данные с выхода датчика, закодированные как 16-bit sign-extended two’s complement number , в значение с плавающей запятой. Ниже приведена информация из спецификации датчика, как это выглядит: введите описание изображения здесь

И это моя первая идея, как это сделать:

 /*
 * Author: Jakub Standarski
 * Email: jstand.jakub.standarski@gmail.com
 *
 * Date: 03.10.2020
 *
 */

/*****************************************************************************/
/* HEADERS */
/*****************************************************************************/

#include <stdint.h>
#include <stdio.h>
#include <string.h>



/*****************************************************************************/
/* PRIVATE VARIABLES */
/*****************************************************************************/

const float temperature_conversion_table[11] = {
    0.0625f, 0.125f, 0.25f, 0.5f, 1.0f, 2.0f, 4.0f, 8.0f, 16.0f, 32.0f, 64.0f};



/*****************************************************************************/
/* PRIVATE FUNCTIONS PROTOTYPES */
/*****************************************************************************/

static float convert_raw_data_into_temperature(int16_t sensor_raw_data);



/*****************************************************************************/
/* MAIN */
/*****************************************************************************/

int main(void)
{
    float temperature_value = convert_raw_data_into_temperature(0xFE6F);
    printf("%.4fn", temperature_value);
    return 0;
}



/*****************************************************************************/
/* PRIVATE FUNCTIONS DEFINITIONS */
/*****************************************************************************/

static float convert_raw_data_into_temperature(int16_t sensor_raw_data)
{
    float temperature_value = 0.0f;

    int bit_index = 11;
    if ((sensor_raw_data amp; (1 << bit_index)) == 0) {
        for (bit_index = 10; bit_index >= 0; bit_index--) {
            if ((sensor_raw_data amp; (1 << bit_index)) != 0) {
                temperature_value  = temperature_conversion_table[bit_index];
            }
        }
    } else {
        temperature_value -= temperature_conversion_table[10];
        for (bit_index = 9; bit_index >= 0; bit_index--) {
            if ((sensor_raw_data amp; (1 << bit_index)) != 0) {
                temperature_value  = temperature_conversion_table[bit_index];
            }
        }
    }

    return temperature_value;
}

  

А теперь вопрос: имеет ли это какой-либо смысл? Есть ли идея получше?

Насколько я знаю, он работает с тестовыми значениями, но я хотел бы знать, есть ли какой-нибудь более элегантный способ сделать это.

Ответ №1:

Попробуйте

 float temperature_value;

temperature_value = (float)sensor_raw_data / 16.0f;
  

Комментарии:

1. Таким образом, это работает как сдвиг вправо на 4 бита, но в области арифметики с плавающей запятой.