【问题标题】:How to convert reading ADC Value to Float?如何将读取的 ADC 值转换为浮点数?
【发布时间】:2017-01-13 08:28:10
【问题描述】:

我想将 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=ADCValue*3.3/4095 --> ADCValue=(ADCValue*10)*33/40950
  • 什么是Voltage
  • @LPs - 为什么要额外乘以 10? 3.3 已更改为 33。
  • 你想在UART上传输浮点值吗?
  • @Dummy 您发送 33 但您知道如何在从设备上“解码”它。

标签: c stm32 data-conversion adc


【解决方案1】:

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

uint32_t millivolts = ADCValue*3300/4095.

对于 4095 的输入,您会得到 3299mV 的结果。由于浮点数不准确,这可能比通过浮点数得到的更准确。

【讨论】:

  • 虽然我同意浮点数在这里不是必需的,但没有理由在这里它们会不那么准确。除非你用一些东西来支持它,否则这个答案最好没有这样的评论。
【解决方案2】:

你可能想要这个:

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,当然还有改进的余地。

演示here

【讨论】:

  • 我的平台可能不适用于浮动类型。
  • @Dummy 查看我的更新答案。现在有一个解决方案可以解决您的平台上无法使用浮点数学的情况。
  • @MichaelWalz 它有效。现在我正在阅读浮点数。谢谢伙计。
  • @4386427 好主意,答案已更新。但仍然无法发现任何其他与小数相关的问题。
  • 小数格式字符串中需要02ideone.com/RBJCmn
【解决方案3】:

这应该可以解决问题

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);

【讨论】:

  • 使用此代码,我只读取空数据:) 我做错了什么?
  • 其他UART或str处的空数据
【解决方案4】:

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

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

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

// ADCValue=ADCValue*3.3/4095;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-09
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多