在博文 AD7705 16-bit Delta-Sigma AD 转换器 给给出了基于ADI公司的 AD7705 16-bit ADC 的数据转换器的设计方案。基于这个模块,测试一下它是否可以测量电阻的热噪声?
■ 什么是电阻热噪声
电阻上的热噪声在大多数工程应用情形下都是希望去除的内部噪声。在一些应用中,比如高增益放大电路、电荷放大器、微弱信号处理电路等,电阻的热噪声需要仔细的考虑。
电阻上的热噪声是由电阻内的电阻热运动所引起的,也被称为Johnson噪声。电阻上的噪声,通常情况下在带宽 B = 1 M H z B = 1MHz B=1MHz情况下,在微伏的量级,它取决于以下参数:阻值、温度和带宽。热噪声的幅度为:
其中 E是噪声的均方根(有效值,单位:V), R是电阻的阻值(单位:欧姆), k是Boltzmann常数( 1.38065 × 1 0 − 23 J / K 1.38065 \times 10^{ - 23} \,\,J/K 1.38065×10−23J/K), T是绝对温度(单位:开尔文)。B是elder带宽(单位:Hz)。
将Boltzmann常数代入公式,可以得到如下简化公式:
其中E是噪声,单位:nV;R:单位kΩ; B:单位kHz。
如果取电阻R=100kΩ, B取1MHz,T取300(普通室温),那么电阻上的噪声为E= 20.5uV。
01测量电阻热噪声
1.测量数据分析
如果AD7705在参考电压为2.5V下,16bitADC转换对应最小单位的数值为: Δ V b i t = 2.5 2 16 = 38.15 μ V \Delta V_{bit} = {{2.5} \over {2^{16} }} = 38.15\mu V ΔVbit=2162.5=38.15μV
这与前面计算对应的电阻上的热噪声在一个数量级,所以电阻上的热噪声可以反映在测量结果中。
如果下面的实验中,对应的数据无法反映出热噪声的变化,则可以通过增加AD7705内部的增益放大去(最高可以达到128)来提高热噪声测量的成分。
2.测量方法
使用电阻箱连接在AD7705的CHANNEL0的AIN1+,AIN1-的端口,分别设置输入电阻,测量相应的;均值和方差。
▲ 使用电阻箱测量相应的热噪声
测量电路图如下图所示:
将AD7705设置为有极性转换的模式。同时使用电位器将输入AD7705的AIN1+,AIN1-调整到1V左右。然后连续读取100次转换结果,分别求出结果的均值以及方差值。
▲ 0欧姆下采集到的波形
▲ 10k欧姆下采集到的波形
▲ 90k欧姆下采集到的波形
3.结果分析
下面列写除了电阻箱的电阻以及对应的测量平均值和方差值:
序号 | 电阻 | 平均值 | 方差 |
---|---|---|---|
1 | 0 | 32759 | 2.32395 |
2 | 10k | 32773 | 11.11182 |
3 | 20k | 32770.75 | 51.0364 |
4 | 30k | 32773.2 | 61.1587 |
5 | 40k | 32774.7 | 22.1566 |
6 | 50k | 32786.8 | 341.404 |
7 | 60k | 32786.2 | 185.6789 |
8 | 70k | 32778.499 | 629.60389 |
9 | 80k | 32789.99 | 696.44 |
10 | 90k | 32783.9 | 737.39 |
对应的测量结果,明显比起前面分析数值要大得多。这说明在测量过程中,AD7705对应噪声来源要比电阻上的热噪声大得多。
这个初步实验也说明仅仅使用电阻箱,它所引入的噪声包括有外部的各种干扰噪声。这个方案证明直接使用AD7705来测量电阻上的热噪声的分布是不可行的。
为了避免外部干扰噪声对于测量结果的影响,需要能够借助于高性能的低噪声放大器,将来自于电阻的噪声能够进行放大,使得测量结果中的噪声信号远远高于来自于环境的噪声。
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# TEST1.PY -- by Dr. ZhuoQing 2020-08-02
#
# Note:
#============================================================
from headm import *
from tsmodule.tsstm32 import *
stm32cmd('CLEAR')
stm32cmd('ad7705c1 1000')
while True:
if stm32val()[12] > 0: break
data = stm32memo(1)
printff(mean(data), var(data))
plt.plot(data)
plt.xlabel("Sample")
plt.ylabel("Voltage")
plt.grid(True)
plt.tight_layout()
plt.show()
#------------------------------------------------------------
# END OF FILE : TEST1.PY
#============================================================