打印
[STM32F2]

STM32 精准采集ADC电压,误差分析

[复制链接]
楼主: yutingwei
手机看帖
扫描二维码
随时随地手机跟帖
21
yutingwei|  楼主 | 2024-6-30 23:55 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
积分线性误差为任何实际转换和端点相关线间的最大偏离。


使用特权

评论回复
22
yutingwei|  楼主 | 2024-6-30 23:55 | 只看该作者
总未调整误差
总未调整误差( TUE)为实际和理想传输曲线间的最大偏离。此参数指定可能发生的会导致
理想数字输出与实际数字输出之间最大偏离的总误差。

使用特权

评论回复
23
yutingwei|  楼主 | 2024-6-30 23:55 | 只看该作者
ADC环境导致的误差
其中有很多是硬件工程师需要关注的问题,软件工程师需要对误差的来源有认识。
在必要的情况下,要求硬件工程师一起参与问题的分析。

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

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

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

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

6.模拟信号源电阻的影响
在源和引脚之间的模拟信号源的阻抗或串联电阻( RAIN),可能会因为流入引脚的电流而导
致其上的电压降。通过电阻为RADC的开关控制内部采样电容( CADC)的充电。

使用特权

评论回复
24
yutingwei|  楼主 | 2024-6-30 23:55 | 只看该作者

使用特权

评论回复
25
yutingwei|  楼主 | 2024-6-30 23:55 | 只看该作者
PCB源电容和寄生电容的影响
在转换模拟信号时,必须考虑源电容和模拟输入引脚上的寄生电容
一般情况下低频信号不用考虑,当然需要结合RC时间常数来考虑

使用特权

评论回复
26
yutingwei|  楼主 | 2024-6-30 23:55 | 只看该作者
注入电流的影响
任何模拟引脚(或紧邻的数字输入引脚)上的负注入电流都可能在ADC输入中产生泄漏电流。

使用特权

评论回复
27
yutingwei|  楼主 | 2024-6-30 23:56 | 只看该作者
温度影响
温度对ADC精度有重要影响。它主要产生两种重要误差:偏移误差漂移和增益误差漂移。这些误差可以在微控制器固件中得到补偿
一般来说会制作一张温度和转换值的对应表格,用来修正温度对ADC的影像。

使用特权

评论回复
28
yutingwei|  楼主 | 2024-6-30 23:56 | 只看该作者
I/O引脚串扰
由于I/O之间的电容耦合,切换I/O可能会在ADC的模拟输入中产生一些噪声。彼此距离很
近或交叉的PCB走线可能会产生串扰。
内部切换数字信号和I/O会产生高频噪声。由于电流浪涌,切换高灌电流I/O可能导致电源
电压小幅下降。 PCB上与模拟输入走线交叉的数字走线可能影响模拟信号

使用特权

评论回复
29
yutingwei|  楼主 | 2024-6-30 23:56 | 只看该作者
.EMI产生的噪声

使用特权

评论回复
30
yutingwei|  楼主 | 2024-6-30 23:56 | 只看该作者
如何得到最佳ADC精度
ADC自校准功能或通过微控制器固件可以轻松补偿偏移误差和增益误差。

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

MCU端去耦,引脚间产生耦合


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

使用特权

评论回复
31
yutingwei|  楼主 | 2024-6-30 23:56 | 只看该作者
模拟输入信号噪声消除
1.多次求平均值
2.添加外部滤波器
3.添加白噪声或三角波扫描来改善分辨率。软件工程师只需要去求平均值。
4.将ADC动态范围与最大信号幅度进行匹配

使用特权

评论回复
32
yutingwei|  楼主 | 2024-6-30 23:56 | 只看该作者
使用前置放大器。相对来说使用Gain的器件会引入误差,需要考虑是否划算。

使用特权

评论回复
33
yutingwei|  楼主 | 2024-6-30 23:57 | 只看该作者
5.模拟源电阻 (硬件方法)
6.源频率条件 vs. 源和寄生电容 (硬件 方法)
7.温度影响补偿 前面说过用查表
8.注入电流最小化(硬件方法)
9.I/O引脚串扰最小化

使用特权

评论回复
34
yutingwei|  楼主 | 2024-6-30 23:57 | 只看该作者
10.减少EMI所致噪声(硬件方法)
11.将模拟和数字布局分开(硬件方法)
12.隔离模拟和数字电路电源(硬件方法)

使用特权

评论回复
35
yutingwei|  楼主 | 2024-6-30 23:57 | 只看该作者
提高精度的软件方法
1.平均采样 多次采样会消耗跟多时间
2.数字滤波
3.AC测量的快速傅里叶变换
4.ADC校准:偏移、增益、位权重校准
5.使CPU生成的内部噪声最小化
软件上比较高端的操作,在采样和转换周期数字静默

使用特权

评论回复
36
yutingwei|  楼主 | 2024-6-30 23:57 | 只看该作者
实践方法
1.多次求平均值

多次就平均值的 方法比较常见。采样N次,求N次采样的平均值。如果N为2的倍数,可以用位移的方法快速求得平均值

使用特权

评论回复
37
yutingwei|  楼主 | 2024-6-30 23:57 | 只看该作者

使用特权

评论回复
38
yutingwei|  楼主 | 2024-6-30 23:57 | 只看该作者
总转换时间 = (采样数 * ADC 转换时间) + 计算时间
额外的开销在与采样次数 和 计算时间。

使用特权

评论回复
39
yutingwei|  楼主 | 2024-6-30 23:57 | 只看该作者
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;
}

使用特权

评论回复
40
yutingwei|  楼主 | 2024-6-30 23:58 | 只看该作者
基于先取 N 个 ADC 采样,将它们从最大值到最小值 (或相反顺序)排序,然后删除两端的 X 个采样。
此平均方法比之前一个更有效,因为它删除了会影响平均的两端值,而且它在执行时间和转换精度之间给出了一个较好的折中。

同样额外的开销是计算时间。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则