我是靠谱客的博主 欢喜石头,最近开发中收集的这篇文章主要介绍STM32 精准采集ADC电压,误差分析,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

ADC模块采集电压流程

数字世界和模拟世界的桥梁,对于嵌入式软件而言,大家止于采集功能的实现。

本文目的在于深入理解ADC,积累技术做出更加稳定优秀的产品。

在这里插入图片描述
STM32 大部分系列都是使用SAR 逐次逼近型电压采集
VIN是采集的模拟输入口,VREF表示参考电压。Sa PIN和内部ADC的开关。Sb 接地开关。

电压采集阶段
在这里插入图片描述
电压采集阶段就是内部电容充电的过程。Sb闭合后ADC内部(这里称之为采样保存电路,并不是转换器核心)的电容会进行充电,这个过程需要消耗一定的时间。一但采集完成,相当于复制了一份模拟输入引脚的 电压值。采集阶段完成后这个时候VIN已经不需要了,也就是说这个Pin 上的电压已经采集完毕。
在这里插入图片描述
等效电路就是VIN对电容2C进行充电。
前面说道这里是采用保持电路,所以有保持阶段
在这里插入图片描述
这个阶段就是各个电容充电完毕,在ADC核心转换器工作前的这断时间。这个时候VIN PIN模拟输入引脚已经和ADC断开了。Sb开路。
也就是说实际上ADC 转换核心转换的是采样保持电路的电压。所以务必要根据手册,明确采样阶段最小用时,确保充电阶段完成。
在这里插入图片描述
其等效电路入上图所示电容器一断的电压为-VIN

转换阶段
这个阶段的重点在于每次二分。
在这里插入图片描述

在这里插入图片描述
这里设计到一些电路的知识,如果是软件开发会比较难懂
在这里插入图片描述
在这里插入图片描述

具体的过程讲起来比较复杂,软件工程师只需要对其逐次逼近转换的二分思路有理解即可。

这个可能会因为各个芯片的转换核心而异

在这里插入图片描述
本节重点:
1.ADC的采样保持电路 ,采集VIN电压,形成副本供ADC转换核心使用
2.电压转换逐次逼近转换的二分思路 0.5+0.25+0.125+…=1
在这里插入图片描述
关于采样时间,采样时间是电容充电的过程,如上图所示,实线代表充电过程虚线代表放电。
t =RC, C 为采样电容,R为充电回路的电阻。
一般来说需要5 RC采样时间,这样内部电容可以精准的采集到输入电压。
在这里插入图片描述
5RC 时间大概采集到两端电压的99.3%
在这里插入图片描述
6RC 时间大概采集到两端电压的99.8%
这个电压值永远都无法充电到100%V,一般来说5RC的时间,认为充满。

5RC 充满到99.3%,还有千分之七的电压未采集。 7/1000
一般的ADC 12位 1/4049的采样精度。这个时候需要去看产品的设计要求。一般情况下不需要做补偿。

ADC module 转换误差

对于STM32 ADC,电压的最小可检测增量变化用LSB表示为:

1 LSB 表示ADC模块可分辨的最小电压
12 位ADC 其一个单位表示V* 1/4096
10 位ADC 其一个单位表示V* 1/1024

为了后面书写方便 1LSB的系数表示为 12 位ADC P = 1/4096 ,10 位ADC P= 1/1024

满量程转换电压V
V 满量程转换电压,这部分不同的ADC和电路有不同的设计
V =(VREF+)-(VREF-) 一般采用这种

V =(VREF+)-(VSSD)
其中VSSD可以为GND。这取决于电路设计。

resault = Vin/V *P 其中Vin为需要采集的电压
Vin在不同的ADC模块中有不同的配置
Vin = Vi -VGND,对地电压
Vin = Vp -Vn 差分输入电压。
Vin = Vp- Vref-
一般而言是最后一种,取决于电路的连接情况和ADC模块。

把ADC作为一个系统而言,Vin是系统的输入,resault 是系统的输出

V是系统内部的电压,其如果变化,那么输出结果变化。转换结果的稳定性就会受到影响。
在这里插入图片描述
ADC器件内部的误差

1.偏移误差 offset

offset一般指的是偏移误差,较正确值产生的一段位移。

理想情况下,当模拟输入介于0.5 LSB和1.5 LSB之间时,数字输出应为1。

V >0.5 LSB 输出1,V<0.5LSB 输出0,实际上 V>0.5LSB +W 时输出才为1,V<0.5LSB +W 为0
就会有下面的曲线,W>0 也就是Eo >0
在这里插入图片描述

w < 0 时
在这里插入图片描述
可通过应用固件轻松校准偏移误差。也就是在ADC初始化的时候 calibration

ADC Calibration 是一个很复杂的学问。我们只需要记得,一定要开启。

增益误差是指ADC实际传输特性曲线和理想传输特性曲线的偏差程度。增益误差的单位是%FSR(满量程值)。如果没有校准,那么增益误差会限制信号输出的准确性
在这里插入图片描述
红线为理想ADC的传输特性曲线,蓝线为实际ADC的传输特性曲线。
当然蓝色曲线在红色上方误差为 + ,再下方是为 -

微分线性误差
手册用 Linearity error 来表示。他表示了ADC器件在所有的数值点上对应的模拟值,和真实值之间误差最大的那一点的误差值。
输出数值偏离线性最大的距离
在这里插入图片描述
积分线性误差为任何实际转换和端点相关线间的最大偏离。
在这里插入图片描述
总未调整误差
总未调整误差( TUE)为实际和理想传输曲线间的最大偏离。此参数指定可能发生的会导致
理想数字输出与实际数字输出之间最大偏离的总误差。
在这里插入图片描述

ADC环境导致的误差

其中有很多是硬件工程师需要关注的问题,软件工程师需要对误差的来源有认识。
在必要的情况下,要求硬件工程师一起参与问题的分析。

1.参考电压噪声:电源的噪声导致参考电压波动,从而对ADC转换值产生影像
2.参考电压/电源调节:负载及其输出阻抗导致电源输出下降,影响到参考电压

3.外部参考电压参数
当使用外部参考电压源( VREF+引脚上)时,该外部参考源有一些重要参数。必须考虑三个
参考电压规格:温度漂移、电压噪声和长期稳定性

4.模拟输入信号噪声
在采样时间内,小而高频率的信号变化可导致较大转换误差。

5.最大输入信号幅度的ADC动态范围匹配不佳
被采集的信号电压波动范围,占ADC总量程的比例。

6.模拟信号源电阻的影响
在源和引脚之间的模拟信号源的阻抗或串联电阻( RAIN),可能会因为流入引脚的电流而导
致其上的电压降。通过电阻为RADC的开关控制内部采样电容( CADC)的充电。
在这里插入图片描述
7.PCB源电容和寄生电容的影响
在转换模拟信号时,必须考虑源电容和模拟输入引脚上的寄生电容
一般情况下低频信号不用考虑,当然需要结合RC时间常数来考虑
在这里插入图片描述
8.注入电流的影响
任何模拟引脚(或紧邻的数字输入引脚)上的负注入电流都可能在ADC输入中产生泄漏电流。
在这里插入图片描述

9.温度影响
温度对ADC精度有重要影响。它主要产生两种重要误差:偏移误差漂移和增益误差漂移。这些误差可以在微控制器固件中得到补偿
一般来说会制作一张温度和转换值的对应表格,用来修正温度对ADC的影像。

10.I/O引脚串扰
由于I/O之间的电容耦合,切换I/O可能会在ADC的模拟输入中产生一些噪声。彼此距离很
近或交叉的PCB走线可能会产生串扰。
内部切换数字信号和I/O会产生高频噪声。由于电流浪涌,切换高灌电流I/O可能导致电源
电压小幅下降。 PCB上与模拟输入走线交叉的数字走线可能影响模拟信号

在这里插入图片描述
11.EMI产生的噪声
在这里插入图片描述

如何得到最佳ADC精度

ADC自校准功能或通过微控制器固件可以轻松补偿偏移误差和增益误差。

参考电压/电源噪声最小化(硬件设计),一般来说使用噪声小的电源,增加滤波电路。

MCU端去耦,引脚间产生耦合
在这里插入图片描述

参考电压/电源调节
电源的负载会产生变化,需要保证电压供给VREF 不会应为负载变化而变动

模拟输入信号噪声消除

1.多次求平均值
2.添加外部滤波器
3.添加白噪声或三角波扫描来改善分辨率。软件工程师只需要去求平均值。
4.将ADC动态范围与最大信号幅度进行匹配
在这里插入图片描述
使用前置放大器。相对来说使用Gain的器件会引入误差,需要考虑是否划算。
在这里插入图片描述
5.模拟源电阻 (硬件方法)
6.源频率条件 vs. 源和寄生电容 (硬件 方法)
7.温度影响补偿 前面说过用查表
8.注入电流最小化(硬件方法)
9.I/O引脚串扰最小化
在这里插入图片描述
10.减少EMI所致噪声(硬件方法)
11.将模拟和数字布局分开(硬件方法)
12.隔离模拟和数字电路电源(硬件方法)

提高精度的软件方法

1.平均采样 多次采样会消耗跟多时间
2.数字滤波
3.AC测量的快速傅里叶变换
4.ADC校准:偏移、增益、位权重校准
5.使CPU生成的内部噪声最小化
软件上比较高端的操作,在采样和转换周期数字静默

实践方法

1.多次求平均值

在这里插入图片描述
多次就平均值的 方法比较常见。采样N次,求N次采样的平均值。如果N为2的倍数,可以用位移的方法快速求得平均值。
在这里插入图片描述
总转换时间 = (采样数 * ADC 转换时间) + 计算时间
额外的开销在与采样次数 和 计算时间。

uint16_t ADC_GetSampleAvgN(uint8_t N)
{
uint32_t avg_sample =0x00;
uint16_t adc_sample[8]={0,0,0,0,0,0,0,0};
uint8_t index=0x00;
/* 得到 N 个 ADC 采样 */
for (index=0x00; index<N; index++)
{
/* ADC 开始转换 */
ADC_SoftwareStartConv(ADC1);
/* 等待转换结束 */
while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC) == RESET);
/* 储存 ADC 采样 */
adc_sample[index] = ADC_GetConversionValue(ADC1);
}
/* 累加 N 个 ADC 采样 */
for (index=0; index<N; index++)
{
avg_sample += adc_sample[index];
}
/* 计算 N 个 ADC 采样的均值 */
avg_sample /= N;
/* 返回均值 */
return avg_sample;
}

基于先取 N 个 ADC 采样,将它们从最大值到最小值 (或相反顺序)排序,然后删除两端的 X 个采样。
此平均方法比之前一个更有效,因为它删除了会影响平均的两端值,而且它在执行时间和转换精度之间给出了一个较好的折中。
在这里插入图片描述
同样额外的开销是计算时间。

ADC 的软件滤波方法

1.限制幅度滤波
两次采样值的差值如果过大,则认为最近一次的值采集误差较大,舍去。

该方法需要对采样值的变化幅度有所认知。也就是信号在采样间隔下的波动范围。采样值的波动超过原始信号的波动幅度认为采集到的数据
收到干扰,故舍弃采样值。

2.中间值
采样多次,按照数值大小排列,去中间值为采样值

对于信号的波动速度比较慢的信号效果比较好

3.求平均值
采样多次直接求平均

采样多次意味着时间跨度较长,平均值的意义是一段时间的中间值。所以灵敏度比较低
适合随机扰动的系统

4.递推平均

按照时间顺序,设定窗口大小,移动窗口进行采样

5.中值平均

采样N个值,去掉最大最小
计算平均值

6.限幅平均
根据1方法,求平均值

7.一阶低通
y=K本次结果+(1-K)上次结果

8.加权平均
采样多次,每次采样的结果分配权重,取得平均值

9。消抖
在一段时间内采样值波动幅度在可接收范围内,认为抖动消除

10.限制幅度消除抖动
1,9方法结合

最后

以上就是欢喜石头为你收集整理的STM32 精准采集ADC电压,误差分析的全部内容,希望文章能够帮你解决STM32 精准采集ADC电压,误差分析所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部