如何将读取的 ADC 值转换为浮点数?

How to convert reading ADC Value to Float?

我想将 ADC 值转换为浮点数。 这是我的代码:

uint32_t ADCValue;
char str[15];

          ADCValue = HAL_ADC_GetValue(&hadc1);
          ADCValue=ADCValue*3.3/4095;
          sprintf(str, "%d", Voltage);
          HAL_UART_Transmit(&huart2, (uint8_t*)(&str), 6, 100);
          HAL_UART_Transmit(&huart2, (uint8_t*) "\n\r", 2, 100);
          HAL_Delay(500);

我正在 3.3V 读取 4095 的值,但我正在将 3 传输到缓冲区。我想传输准确的电压值。

你可能想要这个:

ADCValue = HAL_ADC_GetValue(&hadc1);
float fADCValue = (float)ADCValue*3.3 / 4095.0;
int txlength = sprintf(str, "%.2f", fADCValue);
HAL_UART_Transmit(&huart2, (uint8_t*)(&str), txlength, 100);
HAL_UART_Transmit(&huart2, (uint8_t*) "\n\r", 2, 100);
HAL_Delay(500);

注意:这仅在 float 类型在您的平台上可用时有效。

如果浮点不可用,你可以使用这个:

ADCValue = HAL_ADC_GetValue(&hadc1);
ADCValue = ADCValue * 330 / 4095;
int len = sprintf(str, "%d.%02d", ADCValue / 100, ADCValue % 100);
HAL_UART_Transmit(&huart2, (uint8_t*)(&str), leb, 100);
HAL_UART_Transmit(&huart2, (uint8_t*) "\n\r", 2, 100);

这是一个快速的 hack,当然还有改进的余地。

示范[​​=13=].

这应该可以解决问题

float Adcvalue_f;
uint32_t ADCValue;
char str[15];
....
ADCValue = HAL_ADC_GetValue(&hadc1); 
ADCValue_f =ADCValue*3.3/4095;
sprintf(str, "%2.2f", AdcValue_f);   //Adjust the .2 as per required precision
HAL_UART_Transmit(&huart2, (uint8_t*)(&str), 6, 100);
HAL_UART_Transmit(&huart2, (uint8_t*) "\n\r", 2, 100);

首先没有明显的理由说明您需要在此处使用浮点数。他们不必要地慢。只需这样做:

uint32_t millivolts = ADCValue*3300/4095.

输入 4095,结果为 3299mV。这可能比您通过浮点数获得的结果更准确,因为 floating-point 不准确。

除了其他好的答案外,请考虑:

整数除法截断了数学商的小数部分。

而是执行舍入整数除法。对于无符号整数数学,在除法前加上除数的一半。

// ADCValue=ADCValue*3.3/4095;

unsigned Voltage = // millivolts
Voltage = (ADCValue*3300 + 4095/2)/4095.