如何在stm32f103 bluepill中使用VREFINT?

How to Use the VREFINT in stm32f103 bluepill?

我无法理解 stm32f103 板中 VREFINT 的使用。谁能解释一下如何使用 VREFINT 在 stm32f103 中获取 adc 值?

  if(HAL_ADC_PollForConversion(&hadc1, 100) == HAL_OK)
  {
      adcVrefInt = HAL_ADC_GetValue(&hadc1);
      vdd = 4095.0 * 1.20 / (float)adcVrefInt;
      vdd += 0.61; // .61 is the difference i'm getting in VDD
      sprintf(buffer, "VREFINT: %ld\tVDD: %.2f\t", adcVrefInt, vdd);
      HAL_UART_Transmit(&huart1, (uint8_t *)buffer, strlen(buffer), 100);

      if(HAL_ADC_PollForConversion(&hadc2, 100) == HAL_OK)
      {
          adcValue = HAL_ADC_GetValue(&hadc2);
          adcVoltage = (vdd/4095.0) * adcValue;
          sprintf(buffer, "ADC_PA0: %ld\tVoltage-PA0: %.2f\n", adcValue, adcVoltage);
          HAL_UART_Transmit(&huart1, (uint8_t *)buffer, strlen(buffer), 100);
      }
  }

ADC1->CR2 中设置 TSVREFE 位后,您可以像读取 ADC1 上的任何其他通道一样读取 VREFINT 通道 (17)。这是一个内部模拟信号,没有与之关联的引脚。 VREFINT 的固定电压为 1.20 ± 0.04 V。

如果 ADC 输入引脚连接到 VDDA,则读数为 4095。如果它连接到 VSSA,你得到 0。如果在这些限制之间有任何其他电压 V1,你会得到 4095 * V1 / VDDA 。这也适用于 VREFINT 通道。

当您测量 VREFINT 时,ADC1->DR = 4095 * VREFINT / VDDA。因为你知道 VREFINT = 1.20V,所以你可以计算出 VDDA=4095 * 1.20 / ADC1->DR 伏特。