我想将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。我想传输确切的电压值。
答案 0 :(得分:4)
你可能想要这个:
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);
这是一个快速的黑客攻击,肯定有改进的余地。
示范here。
答案 1 :(得分:4)
首先,你没有必要在这里使用浮点数。他们不必要地慢。只需这样做:
uint32_t millivolts = ADCValue*3300/4095.
对于4095的输入,您得到3299mV的结果。由于浮点不准确,这可能比通过浮点数得到的更准确。
答案 2 :(得分:0)
这应该可以解决问题
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);
答案 3 :(得分:0)
除了其他好的答案,请考虑:
整数除法截断数学商的派系部分。
相反,执行舍入整数除法。使用无符号整数数学,在除法之前加上一半除数。
// ADCValue=ADCValue*3.3/4095;
unsigned Voltage = // millivolts
Voltage = (ADCValue*3300 + 4095/2)/4095.