adc - 如何在stm32f103 bluepill中使用VREFINT?

标签 adc stm32f1

我无法理解 VREFINT 在 stm32f103 板中的使用。谁能解释一下如何使用 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);
      }
  }

最佳答案

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

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

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

关于adc - 如何在stm32f103 bluepill中使用VREFINT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57752689/

相关文章:

c - 为什么 USART2 发送垃圾值?

c - ADC dsPIC33 问题

gcc - STM32 ADC 连续转换模式不会自动启动转换

c - 如何从 STM32F103 USB 设备应用程序发送 ALT 代码?

c - STM32 PWM DMA 只有在我每次传输时都重新初始化时才能正常工作,否则会丢弃前几个脉冲

c - PIC24读取ADC错误

c - Atmel Studio ADC 输出十进制值

c - ADC_READ 未达到最大值

arduino - I2C 替代 GPIO 引脚 STM32F103C8T6