#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 бита, но в области арифметики с плавающей запятой.