STM32采用内部参考电压Vrefint Channel校准ADC采样数据

摘要

项目前期,硬件攻城狮就不断强调,你要用STM32采用内部参考电压Vrefint Channel校准ADC采样数据。项目一直很忙,校准后肯定可以提升精度,但是ADC精度不只是通过这个方式可以提升精度。软件攻城狮就开始给硬件攻城狮上课,嘟嘟嘟。。。。。。。如下文所示,对着硬件攻城狮说,看看,提升ADC精度的关键还是得靠硬件。下面插播ADC精度提升方法:1提升MCU供电电源电压稳定性;2引脚电容设置;3ADC参考电压设置的影响;4软件方法。

言归正传,本文还是要详解STM32采用内部参考电压Vrefint Channel校准ADC采样数据。这里主要参考RM0038文档P286页对Temperature sensor and internal reference voltage使用说明。

ADC简介

ADC 转换包括采样、保持、量化、编码四个步骤。采样阶段需要在规定的采样时间内将外部信号的电压完整无误的采样到 ADC 的采样电容上, 即在采样开关 SW 关闭的过程中,外部输入信号通过外部的输入电阻 RAIN 和以及 ADC 采样电阻 RADC 对采样电容 CADC 充电。

 提升MCU供电电压稳定性

由于在量化编码的过程中, VREF+需要对转化电容网络充电,在量化过程中,也会有对基准源抽取电荷的动作, 因此, 如果没有其他的去耦措施, 一个稳健且干净的 VREF+基准会显著影响 ADC量化的精度,我们建议对于这两个电源采用纹波噪声系数更小的 LDO 来供电。 对于 VREF+基准源,我们建议靠近引脚并联一个 uF 级以及一个 nF 级的去耦电容,一方面可以滤除来自外部低频与高频的电源噪声,另一方面,也可使 ADC 在量化编码过程的基准源更加稳定。

引脚电容设置

系统的硬件解耦对于采样精度提高尤为重要,我们推荐如下图引脚电容设置图所示解耦电容的配置方式, 在 MCU 端,对于模拟电源引脚,建议就近放置一个 1uF 与一个 10nF 的陶瓷电容(ESR 较低)。对于其他的数字电源 VDD 引脚,就近放置一个 100nF 的陶瓷电容。对于MCU 接地引脚,建议将模拟地与数字地采用 0 欧姆电阻或者磁珠连接,以屏蔽数字地对于模拟地的干扰。

ADC参考电压设置影响

举个例子:当输入信号电压范围为 0-2.6 V 时,若设置 VREF+为 3.6 V,采样信号进入 MCU 12bit ADC,在忽略采样误差的前提下,可以得出采样结果数字量范围为 0-2958,采样结果能够分辨出 0.9 mV 的电压,然而对于 2759-4095 之间的采样码值均未出现;若改版硬件,使得 VREF+为 2.6 V,此时,采样结果数字量范围为 0-4095, ADC 能够分辨出的最小电压为 0.6 mV。显然后者均有更高的采样精度。因此在项目的硬件设计阶段,如果对于采样精度有要求的前提下,我们需要评估下 ADC 输入信号的电压范围,配置输入信号电压的最大值略小于 VREF+,以提高采样精度。

软件方法

第一:开启MCU 中具有 ADC 的片上硬件过采样功能, 硬件过采样单元执行数据预处理以减轻 CPU 负担。它能够处理多个转换,并将多个转换的结果取平均,借此以提高 ADC 采样结果的精度。

第二:软件算法上亦可采用常用的一些滤波算法来降低输入信号采样值的波动。例如最常见的平均算法, 滤波过程中需要占用CPU的算力与一定的RAM空间。 这种平均算法适用于输入信号变化慢,偶有脉冲型干扰的情形。如果信号变化频率已经大于这个平均滤波算法的执行频率,则会丢失信号变化的细节,平均后的采样结果不能重现信号的所有信息。

内部参考电压Vrefint Channel校准ADC采样数据工程实现

ADC多通道采集设置

工程采用STM32CubeIDE 1.8.0,对于通道数据采集设置如下图,从下图可以看书工程打开了Vrefint Channel

校准电压获取 

STM32的内部参照电压VREFINT和ADCx_IN17相连接,它的作用是相当于一个标准电压测量点,内部参照电压VREFINT只能出现在主ADC1中使用。内部参照电压VREFINT与参考电压不是一回事。ADC的参考电压都是通过Vref+提供的并作为ADC转换器的基准电压。当我们使用的Vref+是直接取自用VCC电压时,当VCC电压波动比较大时或稳压性能比较差时,可以借用STM32的内部参照电压VREFINT校正测量精度。

以测量1通道的电压值为例,先读出参照电压的ADC测量结果,记为ADre;再读出要测量通道1的ADC转换结果,记为ADch1;则要测量的电压为:

针对校准电压,翻看了很多资料,网上也有一些帖子,都是这些把校准电压设置了1.2v,这里有问题的。这个校准电压应该从MCU的出厂设置地址中读取

代码如下:

 /* Test user or factory temperature sensor calibration value */
  if ( testFactoryCalibData() == SUCCESS )
  {
	  getFactoryTSCalibData(&calibdata);
  }
  else if ( testUserCalibData() == SUCCESS )
  {
	  calibdata = *USER_CALIB_DATA;
  }
  else {
    /* User calibration or factory calibration TS data are not available */
//	calibdata.TS_CAL_1 = DEFAULT_COLD_VAL;
//    calibdata.TS_CAL_2 = DEFAULT_HOT_VAL;
//    writeCalibData(&calibdata);
//    calibdata = *USER_CALIB_DATA;
  }

校准过程

按照工程手册中公式转换如下:

      代码如下:

/* estimation of VDD=VDDA=Vref+ from ADC measurement of Vrefint reference voltage in mV */
    vdd_ref = calibdata.VREF * 3000 / refAVG;

	/* correction factor if VDD <> 3V */
	tempAVG = tempAVG * vdd_ref / 3000;

 串口打印设置

添加串口打印宏定义如下:

#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif

PUTCHAR_PROTOTYPE
{
//#if (DEBUG_PRINTF_ON == 1)
    //HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1 , 0xffff);
	while((USART1->SR&0x40)==0){};
		USART1->DR = ch;
//	while((USART3->SR&0x40)==0);
//		USART3->DR = ch;
//#endif
    return ch;
}

调试记录

STM32CubeIDE 1.8.0工程测试记录:实测数据对ADC测量精度提升还是有一定的效果。

本文设计工程下载地址

STM32采用内部参考电压VrefintChannel校准ADC采样数据含:STM32CubeIDE例程RM0038,详解文档资源-优快云文库

### STM32参考电压ADC 和 DAC 的关系 #### 参考电压的作用 在STM32中,VREF+作为ADC和DAC的参考电压起着至关重要的作用。它决定了模拟输入(ADC)或输出(DAC)信号的最大电压值,即满量程值[^1]。 #### ADC工作原理中的参考电压影响 当使用ADC进行模数转换时,其基本任务是从连续变化的模拟世界采集数据,并将其转化为可以被微控制器理解和处理的离散二进制数值。在这个过程中,所选的参考电压直接影响到最终得到的数据准确性以及分辨率的有效利用程度。例如,在一个典型的12位ADC配置下,假设外部施加给VREF+的是3.3伏特,则整个量化过程将会基于这个标准来进行计算:最大可能读取到的数字码将是\(2^{12}-1\)(4095),代表接近于但不超过3.3伏特的实际测量值;最小可分辨的变化则大约等于\(\frac{3.3}{4096}\approx 807μV\)【注】此处采用近似表达方式以便理解具体数值关系[^3]。 #### DAC工作原理中的参考电压影响 对于DAC而言,情况也类似。这里同样依赖于预先定义好的内部或外接至VREF+端口上的稳定直流电平来决定重建出来的模拟波形所能达到的高度极限。这意味着任何发送给该器件用于合成新电信号序列的信息都需参照这一基准点加以解释,从而确保输出结果既忠实又可靠地反映了原始指令意图。 ```c // 配置ADC通道并指定参考电压源代码片段 void setup_adc(void){ // 假设已经完成了必要的初始化操作... /* 设置ADC使用的参考电压 */ ADC_ChannelConfTypeDef sConfig = {0}; sConfig.Channel = ADC_CHANNEL_0; sConfig.Rank = 1; sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES; HAL_ADC_ConfigChannel(&hadc, &sConfig); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大牛攻城狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值