■ 前言
在網文 An Electronic Mesurement of the Boltzmann’s Constant Using I-V Characterisctic of a Silicon 2N2309 Diode 中介紹了使用三極管2N3094來測量 Boltzmann Constant 的方法。
由於這個方法簡便易行,所使用的設備也是大多數電子實驗室都具備,所以稱爲很多電子類課程中,學生喜歡做的電子實驗。
▲ Ludwig Boltzmann(1844-1904) 以及Maxwell-Boltzmann 分佈
玻爾茲曼常數(Boltzmann constant),通常使用表示,是指有關於溫度及能量的一個物理常數。玻爾茲曼是一位奧地利物理學家,在統計力學的理論有重大貢獻,玻爾茲曼常數具有相當重要的地位。
01實驗及數據分析
1.基於2N3904的Boltzmann常數
在PN結兩邊,存在一個由電子-空穴擴散而形成的耗散區,以及伴隨着的接觸電位區,只有熱量動能超過的電子才能夠從n型區域穿越到p型區域。根據統計力學原理,處在熱平衡下電子的動能分佈遵循 玻爾茲曼分佈 。具有能量爲的概率爲:
其中是漂移電流,是比例常數,是溫度,是玻爾茲曼常數。
▲ PN結的結構示意圖
這股漂移電流在耗散區建立一個電場。到外部電壓施加在PN結,產生電場,產生電流:
這樣,外部總電流爲:
在推文開始提到的文章中,使用 2N3904 測試二極管的I-V特性。對於2N23904的電流放大和轉換,選擇了 LF356 運放進行I-V轉換。 LF356的偏置電壓爲10mA和偏置電流爲30pA。
下面是實驗所使用的電路圖。根據Measurement of Boltzmann’s constant 文獻中描述,測量A,B兩點的電壓,便可以建立起的發射結對應的電壓與電流之間的關係。
▲ 基於2N3904的PN結測量Boltzmann常數
後級的 LF351 組成電流-電壓轉換電路,根據電路中的參數,B點的電壓與流經集電極電流之間的關係爲:。
▲ JFET輸入的OPAMP-LF351運放
在實驗中,使用DP1308可編程直流電源的-25V輸出電壓串聯一個10kΩ電阻做爲A點給定電源。使用FLUKE45測量A點電位,使用DM3068 位數字萬用表測量B點的電壓並自動記錄。
2. 測量數據分析
設置數字直流電源DP1308輸出電壓從**-0.2到-10V**,同時測量A,B兩點的電壓變化,並換算成PN結的電壓-電流關係,繪製如下。
▲ 測量輸入電壓與電流曲線
vv=[0.19666,0.29133,0.38548,0.46684,0.50835,0.52833,0.54163,0.55082,0.55782,0.56394,0.56880,0.57302,0.57684,0.58020,0.58313,0.58579,0.58826,0.59053,0.59258,0.59455,0.59635,0.59811,0.59976,0.60135,0.60275,0.60409,0.60543,0.60665,0.60770,0.60898,0.61006,0.61118,0.61223,0.61328,0.61428,0.61518,0.61598,0.61692,0.61765,0.61840,0.61921,0.61997,0.62064,0.62134,0.62205,0.62278,0.62345,0.62408,0.62466,0.62535,0.62587,0.62648,0.62706,0.62764,0.62818,0.62867,0.62918,0.62968,0.63024,0.63069,0.63112,0.63165,0.63213,0.63249,0.63295,0.63346,0.63395,0.63427,0.63469,0.63506,0.63545,0.63586,0.63621,0.63659,0.63696,0.63735,0.63777,0.63817,0.63844,0.63878,0.63909,0.63933,0.63971,0.64012,0.64046,0.64071,0.64112,0.64151,0.64182,0.64218,0.64246,0.64269,0.64300,0.64331,0.64365,0.64398,0.64429,0.64452,0.64475,0.64512]
cc=[0.00028,0.00066,0.00111,0.00309,0.00934,0.01789,0.02737,0.03718,0.04723,0.05752,0.06778,0.07812,0.08864,0.09908,0.10968,0.12018,0.13074,0.14143,0.15200,0.16262,0.17335,0.18394,0.19461,0.20535,0.21598,0.22666,0.23746,0.24814,0.25882,0.26961,0.28032,0.29097,0.30182,0.31250,0.32317,0.33402,0.34473,0.35559,0.36628,0.37702,0.38788,0.39856,0.40931,0.42017,0.43090,0.44163,0.45252,0.46324,0.47399,0.48485,0.49542,0.50630,0.51708,0.52794,0.53868,0.54945,0.56033,0.57108,0.58183,0.59272,0.60346,0.61422,0.62511,0.63587,0.64665,0.65752,0.66831,0.67906,0.68997,0.70074,0.71148,0.72239,0.73315,0.74391,0.75482,0.76557,0.77648,0.78723,0.79801,0.80891,0.81966,0.83042,0.84134,0.85209,0.86286,0.87379,0.88452,0.89531,0.90623,0.91701,0.92777,0.93868,0.94950,0.96025,0.97118,0.98193,0.99271,1.00364,1.01442,1.02530]
利用模型(3)匹配上述測量數據,將模式簡化成下帶有參數[a,b,c]的指數函數關係,利用前面測量的PN結I-V數據,使用SCIPY.OPTIMIZE中的curve_fit函數進行函數擬合,獲得參數[a,b,c]的數值。
from scipy.optimize import curve_fit
vv, cc = tspload('iv2n3904', 'vv', 'cc')
def func(x, a, b, c):
return a * exp(x * b) + c
param = [0.001, 0.02, 0.0]
param, conv = curve_fit(func, vv, cc, p0=param)
printf(param)
測量參數爲:
a=2.33332986e-11
b=3.79731168e+01
c=8.85188988e-03
由模式(3)可以知道,參數b與Boltzmann常數之間的關係:
將常數e, T = 300(27攝氏度)代入上面公式,可以得到:
這個數值比現在測到得到精確的Botlzmann常數大了1.9%左右。在上述時間條件下,這個數值非常精確了。
3. 基於NPN 8050測試Boltzmann常數
將前面所使用的三極管2N3904更換成另外一款NPN性的硅三極管8050,使用相同的測試方案完成8050的b-e結的電壓-電流測試,所得到的數據曲線如下:
▲ 測試NPN8050的發射極PN結的I-V曲線
使用相同的方法進行建模,並計算參數:
這個數值比精確Boltzmann常數大了3.29%。
4. 將2N3904的C.E對換測量
測量三級管b-c之間的PN結的電壓與電流曲線。在上述實驗中將2N3904的c,e管教互換,測量得到的PN結電流-電壓曲線如下:
▲ 2N3904的BC的PN結的電壓與電流關係
這個結果比精確Boltzmann常數大了14.2%。
5. 只使用2N3904的BE進行測量
▲ 直接對2N3904 b-e PN結測量對應的電壓與電流之間的關係曲線
根據測量的電壓電流曲線,可以得到對應的模型參數和Boltzmann常數如下:
這個數值比起精確的Boltzmann常數的數值高了78.1%。
▲ 2N3904的B-E結的I-V曲線
02二極管的分段特性對結果的影響
在博文 二極管極低電流I-V特性測量 中,給出了二極管PN結的分段指數特性,即模型(3)中的電流在不同的前向電流的情況下取值是不同相同,這個變化也會導致測量的Boltzmann常數發生變化。
在實驗[02-1]中,選擇不同測量數據的來擬合估算Boltzmann常數會產生一定的變化。下面選擇2N3904測量數據中,從數據編號n=10(對應電流:0.06mA)開始,結束數據編號n從50變化到100,使用模型(3)計算相應的Boltzmann常數,對應的誤差曲線如下:
▲ 不同的二極管電流計算Boltzmann常數誤差變化
從數值計算結果來看,使用前面數據測量範圍(10~78),對應電流(0.06mA變化到0.7mA)時,測到得到的Boltzmann的誤差最小。
※ 結論
1.PN測量不同方案比較
使用相同的PN結的模型,對於四種不同的方案測量了Boltzmann常數,其中包括有兩種不同型號硅NPN雙極性三極管,三極管的b-e,b-c結的測量,以及直接測量b-e的PN結電壓電流的情況。
序號 | 方法描述 | Boltzmann常數 | 誤差(%) |
---|---|---|---|
1 | 2N3904的b-e的PN結 | 1.406e-23 | 1.87% |
2 | 8050的b-e的PN結 | 1.426e-23 | 3.29% |
3 | 2N3904的b-c的PN結 | 1.577e-23 | 14.24% |
4 | 2N3904的b-e的PN結 直接測量 | 2.459e-23 | 78.09% |
通過前面的實驗,可以看到使用2N3904基極接地的配置,測量的結果誤差最小。更換NPN晶體管爲8050,測量的結果偏大一些。
如果將2N3904的C,E極進行對換,雖然從晶體管的結構上是對稱的,但是結果誤差更大。
由於PN結電壓-電流模型中的參數隨着電流不同,導數PN結附近半導體內部的電子與空閒運動模式變化,從而使得模型參數也發生變化。所以使用不同電流範圍數據,測量數的Boltzmann的數據有所變化
2.參考文獻
- Measurement of Boltzmann’s constant . Phys. Educ. 20 1996. Printed in Great Britain.
▲ 測試電路方案
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# MEAS1.PY -- by Dr. ZhuoQing 2020-07-04
#
# Note:
#============================================================
from headm import *
from tsmodule.tsvisa import *
from tsmodule.tsstm32 import *
dp1308open()
dm3068open()
setv = linspace(0.2, 10, 100)
vdim = []
idim = []
dp1308n25v(0)
time.sleep(2)
for v in setv:
dp1308n25v(v)
time.sleep(2)
meter = meterval()
iv = dm3068vdc()
ic = iv / 10
vdim.append(meter[0])
idim.append(ic)
printff(v, ic, meter[0])
dp1308n25v(0)
tspsave('iv2N3904-1', vv=vdim, cc=idim)
plt.plot(vdim, idim)
plt.xlabel("Voltage(V)")
plt.ylabel("Current(mA)")
plt.grid(True)
plt.show()
#------------------------------------------------------------
# END OF FILE : MEAS1.PY
#============================================================
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# CAL1.PY -- by Dr. ZhuoQing 2020-07-04
#
# Note:
#============================================================
from headm import *
from scipy.optimize import curve_fit
vv, cc = tspload('iv2n3904-1', 'vv', 'cc')
#vv, cc = tspload('iv8050-2', 'vv', 'cc')
e = 1.602e-19
T = 273 + 27
#------------------------------------------------------------
def func(x, a, b, c):
return a * exp(x * b) + c
#------------------------------------------------------------
param = [0.001, 0.02, 0.0]
param, conv = curve_fit(func, vv, cc, p0=param)
printf(param)
b = param[1]
printf(e/(b*T))
ccal = func(vv, *param)
plt.plot(vv, cc, label='Measure')
plt.plot(vv, ccal, label='Modal')
plt.xlabel("Voltage(V)")
plt.ylabel("Current(mA)")
plt.grid(True)
plt.legend(loc="upper right")
plt.show()
#------------------------------------------------------------
# END OF FILE : CAL1.PY
#============================================================