STM32关于ADC测量出来的值不准的问题

本文探讨了在ADC测量中遇到的电压值偏差问题,分析了偏移误差和增益误差的概念,并介绍了两点校准法来校准ADC的增益误差。通过实际操作,作者发现通过乘以比值的方式可以临时解决偏差问题,同时提到了参考电压稳定性对ADC精度的影响以及选择参考电压的建议。
摘要由CSDN通过智能技术生成

今天使用ADC测量的时候 发现输出的值和万用表的电压值 一直有0.2的差别,不过跳动在0.005的跳动,也就忽略基准源的问题(用示波器测试过了 3.29v准的 没有什么跳动 使用的是1块钱一个的LDO基准源芯片),直接接地 测量出来的电压也是0.00几的跳动。 网上找了很多资料。很多说要开启校准,可能在他们那个场景有用,不过在我这个场景没有用,计算公式是按照官方公布的公式,没有出错,纳闷了好一会,不过最后给他们都乘以了一个比值。

电压表2.8/adc输出3.0 = 0.985 后续adc测量出来的电压都乘以这个比值,后续测量的都和万用表对的上,暂时打了个补丁。

另外还有一种方法: (芯片公司给出了的)

ADC 转换误差示意图
该示意图描述了 ADC 的理想值和实际值的区别,从图中可以看出 ADC 转换的误差。

在这里插入图片描述
图 1 ADC 理想误差示意图
在这里插入图片描述
图 2 ADC 实际误差示意图

ADC 误差介绍
器件理想输出与实际输出之差定义为偏移误差,所有数字代码都存在这种误差。在实际中,
偏移误差会使传递函数或模拟输入电压与对应数值输出代码间存在一个固定的偏移。通常计
算偏移误差方法是测量第一个数字代码转换或“零”转换的电压,并将它与理论零点电压相
比较。
增益误差是预估传递函数和实际斜率的差别,增益误差通常在模数转换器最末或最后一个传
输代码转换点计算。

ADC 校准方法
如图 1 所示,红线为理想 ADC 的传输特性曲线,蓝线为实际 ADC 的传输特性曲线,对于一
个理想的 ADC 来说,如果模拟输入和数字输出在 X 轴和 Y 轴增量相等,则它们之间的传输
特性便如图 1 中红色虚线所示(k=1)。然而,实际的 ADC 传输特性并非如此,蓝色虚线的
增量系数并不等于 1。红色和蓝色虚线的差值,便是 Gain error。因此需要校准来尽量减小或
消除增值误差。关于消除的方法,可以采用两点校准的办法进行。校准 ADC 增益误差需要一个准确的基准(通常为 Band gap Ref)。对于一个实际的 ADC 来 说,传输特性曲线并非是一条直线,即 ADC 输出和输入并不是线性关系。如图 2 所示。

最常用的一种校准方法——两点标定法:
这一方法假定 ADC 传输特性是一条直线。这种方法对于低输入是一个很好的选择,能有效 地降低校准成本。在两点标定中,一个点可以选在 AD 输入的最低点,另一个选在接近最高
点处。举例来说,一个单端输入的 ADC,输入范围为 0-2.2V,我们可以采用一个基准为 Vref1=0V
和一个为 Vref2=2.049 的来进行校准。

校准公式为:
增益系数=(Vref2 时实际输出- Vref1 时实际输出)/(Vref2 时理想输出- Vref1 时理想输出)

例如,一个输出对于一个 Vref 时的实际输出为 99,二增益系数通过计算为 0.008,则实际输
出为 99*1.008=99.792.
Offset 校准可以通过输入 0V 电压,用实际输出减去 0,得到 Offset 值。客户代码中可以把每 次采集到的值减去 Offset 值,即能得到 ADC 采样值。

注意事项
ADC 的转换精度与参考电压的稳定度相关。稳定的参考电压可明显提高 ADC 的转换精度。
该系列单片机的 ADC 可供选择的参考电压共有 4 种:电源电压、ExRef 引脚、内置 1.5v 参
考电压、内置 2.5v 参考电压。电源电压会受到芯片内部数字电路的影响,具有一定的数字噪
声。内置 1.5v 参考电压、内置 2.5v 参考电压均由电源电压通过 BGR 模块生成,也会具有一
定的数字噪声。外部 ExRef 引脚的参考电压可以通过适当的电路调理(并联去耦电容),向
ADC 提供一个稳定的参考电压,在该工作条件下 ADC 具有最高的转换精度。其次,如果选
择 AVCC / 内部 1.5V / 内部 2.5V 作为 ADC 的参考电压时,建议将 ExRef 引脚设为模拟功能
并外接去耦电容。

使用 ADC 模块时,选择参考电压的优先级如下所示:
优级序号 参考电压 ExRef 引脚配置
1 Exref 模拟引脚 + 去耦电容
2 VCC 模拟引脚 + 去耦电容
3 内部 1.5V / 2.5V 模拟引脚 + 去耦电容
4 内部 1.5V / 2.5V 数字引脚
5 VCC 数字引脚

测量12V电压,需要使用STM32ADC(模数转换器)输入,将电压分压器连接到ADC输入引脚。以下是一些步骤: 1. 选择一个可用的GPIO引脚将分压器的输出连接到STM32ADC输入引脚。 2. 设计一个电阻分压器电路,将12V电压分压到STM32ADC输入范围内(通常是0-3.3V或0-5V)。例如,使用两个电阻(一个1kΩ电阻和一个3kΩ电阻)来将12V电压分压到2.4V。 3. 将分压器的输出连接到GPIO引脚和STM32ADC输入引脚。 4. 在STM32的代码中,初始化ADC并配置输入通道为连接到GPIO引脚的ADC输入引脚。 5. 开始ADC转换并读取结果,使用公式将ADC转换为所测量的电压。 以下是一些示例代码: ```c // 初始化ADC ADC_HandleTypeDef hadc1; hadc1.Instance = ADC1; hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; hadc1.Init.Resolution = ADC_RESOLUTION_12B; hadc1.Init.ScanConvMode = DISABLE; hadc1.Init.ContinuousConvMode = DISABLE; hadc1.Init.DiscontinuousConvMode = DISABLE; hadc1.Init.NbrOfDiscConversion = 0; hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc1.Init.NbrOfConversion = 1; hadc1.Init.DMAContinuousRequests = DISABLE; hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV; if (HAL_ADC_Init(&hadc1) != HAL_OK) { // 初始化失败 } // 配置ADC输入通道 ADC_ChannelConfTypeDef sConfig; sConfig.Channel = ADC_CHANNEL_0; sConfig.Rank = 1; sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES; sConfig.Offset = 0; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { // 配置失败 } // 开始ADC转换 if (HAL_ADC_Start(&hadc1) != HAL_OK) { // 启动失败 } // 等待ADC转换完成 if (HAL_ADC_PollForConversion(&hadc1, 100) != HAL_OK) { // 转换失败 } // 读取ADC uint32_t adcValue = HAL_ADC_GetValue(&hadc1); // 计算电压 float voltage = (adcValue * 3.3f) / 4096.0f; // 假设ADC输入电压为0-3.3V // 打印电压 printf("Voltage: %fV\r\n", voltage); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值