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

如何将读取的ADC值转换为浮点值?,c,stm32,data-conversion,adc,C,Stm32,Data Conversion,Adc,我想将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,

我想将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);
这是一个快速的破解,当然还有改进的空间


演示。

这应该可以做到

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。这可能比通过浮点数得到的结果更准确,因为浮点数不准确。

除了其他精确答案外,请考虑:

整数除法截断了数学商的派系部分

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

// ADCValue=ADCValue*3.3/4095;

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

ADCValue=ADCValue*3.3/4095
-->
ADCValue=(ADCValue*10)*33/40950
电压是什么?@LPs-为什么额外乘以10?3.3已更改为33。是否要在UART上传输浮点值?@Dummy您发送了33,但您知道如何在从设备上“解码”。使用此代码,我只读取空数据:)我做错了什么?其他UART或
str
我的平台上的空数据可能不适用于浮点类型。@Dummy查看我更新的答案。现在有了一个解决方案,可以解决在您的平台上无法使用浮点数学的问题。@MichaelWalz它成功了。现在我正在阅读浮点数。谢谢。@4386427好主意,答案更新了。但仍然无法发现任何其他与小数相关的问题。您需要使用小数的
02
格式字符串:虽然我同意这里不需要浮点数,但没有理由让它们在这里不那么准确。除非你用什么来支持它,否则这个答案最好不要这样说。