gpt4 book ai didi

stm32 - 校准 STM32 ADC (VREFINT)

转载 作者:行者123 更新时间:2023-12-03 17:13:09 38 4
gpt4 key购买 nike

我正在尝试在 STM32F042 微 Controller 上读取 VDDA。我在 VDD 为 3.29V 时得到了意想不到的结果。我一定缺少一些基本的东西。

输出:

VREFINT=1917; VREFINT_CAL=1524; VDDA=2623 mV
VREFINT=1885; VREFINT_CAL=1524; VDDA=2668 mV
VREFINT=1913; VREFINT_CAL=1524; VDDA=2628 mV
VREFINT=1917; VREFINT_CAL=1524; VDDA=2623 mV
VREFINT=1917; VREFINT_CAL=1524; VDDA=2623 mV

adc_test.c:

#include <stdio.h>
#include "stm32f0xx.h"

#define VREFINT_CAL_ADDR 0x1FFFF7BA /* datasheet p. 19 */
#define VREFINT_CAL ((uint16_t*) VREFINT_CAL_ADDR)

extern void initialise_monitor_handles(void);

int main(void)
{
RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; /* enable ADC peripheral clock */
RCC->CR2 |= RCC_CR2_HSI14ON; /* start ADC HSI */
while (!(RCC->CR2 & RCC_CR2_HSI14RDY)); /* wait for completion */
/* calibration */
ADC1->CR |= ADC_CR_ADCAL; /* start ADc CALibration */
while (ADC1->CR & ADC_CR_ADCAL); /* wait for completion */
ADC1->CR |= ADC_CR_ADEN; /* ADc ENable */
while (!(ADC1->ISR & ADC_ISR_ADRDY)); /* wait for completion */
ADC1->SMPR |= ADC_SMPR1_SMPR_0 | /* sampling mode: longest */
ADC_SMPR1_SMPR_1 |
ADC_SMPR1_SMPR_2;
/* VDD reference */
ADC->CCR |= ADC_CCR_VREFEN; /* VREF Enable */
ADC1->CHSELR = ADC_CHSELR_CHSEL17; /* CH17 = VREFINT */

initialise_monitor_handles(); /* enable semihosting */

while (1) {
ADC1->CR |= ADC_CR_ADSTART; /* start ADC conversion */
while (!(ADC1->ISR & ADC_ISR_EOC)); /* wait for completion */
uint32_t vdda = 3300UL * *VREFINT_CAL / ADC1->DR; /* ref. manual p. 252; constant and result in millivolts */
printf("VREFINT=%lu; VREFINT_CAL=%lu; VDDA=%lu mV\n",
(unsigned long)ADC1->DR,
(unsigned long)*VREFINT_CAL,
(unsigned long)vdda);
}
}

数据表截图:

enter image description here

引用手册截图

请注意,这是指 .3V,但我认为这是一个错字,因为上面的数据表和下面更长的公式是指 3.3V,而 .3V 低于该部件的最低工作电压

enter image description here

最佳答案

我目前正在为 STM32L4 开发 ADC 驱动程序。在实现过程中,我遇到了几乎相同的问题。在我看来第一个公式
enter image description here
不是计算 VDDA,而是计算 VREF+。它是 ADC 评估 ADC-IN channel 所依据的电压。
此外,VREFINT_DATA 不是测量的 VREF+ 电压,而是依赖于 Controller 的内部引用电压。就我而言,它在 Controller 数据表中定义:
enter image description here
这是我如何使用发布的公式的图片:
enter image description here
一些评论:
ln 102:计算 VREF+ 而非 VDDA
ln 105-110:计算所有等级/配置的序列
ln 108:计算ADCpin_x测得的电压
ln 109:乘以增益得到实际值
在我看来,通过计算每个转换序列的 VREF+,我会得到更好的结果,因为 VREF+ 上的一些波纹得到了补偿。

关于stm32 - 校准 STM32 ADC (VREFINT),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58328342/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com