Learning Objectives
- 用 MEAS? 指令量直流電壓、直流電流與電阻,知道量電阻前一定要斷電
- 說明積分時間(NPLC)如何在雜訊與速度之間取捨
- 用 CONF、SAMP:COUN 與 READ? 一次量多筆讀值,用 query_ascii_values 轉成數字串列
- 分開使用 INIT 與 FETC?:先觸發量測,再取回讀值
同一顆電阻,量出來的數字為什麼每次不一樣
上一課用數位電錶量了 LED 兩端的電壓,指令只有一行 MEAS:VOLT:DC?。這一課把電錶本身看清楚一點。
把電源供應器設在 5 V,接一顆 1 kΩ 電阻,連續量十次電壓,你會發現最後幾位數字一直在跳: 4.99998、5.00001、4.99996……這不是電錶壞了,是所有量測都有的雜訊。電錶給你兩個選擇:
- 量慢一點,每一筆都比較穩;
- 量快一點,一秒內拿到很多筆,再用程式算平均。
選哪一個,要看你的實驗要什麼。這一課要回答:
- 電錶有哪些量測功能,用程式切換時要注意什麼?
- 「積分時間」是什麼,為什麼設長一點讀值比較穩?
- 怎麼一次量很多筆,而且讓電錶量的時候程式不用乾等?
本課的電錶是模擬的教學儀器(Uedu Sim),指令採常見的 SCPI 寫法;各廠牌的指令與預設值以該儀器的程式設計手冊為準。
量測功能:電壓、電流、電阻
數位電錶(DMM)的每一種量測叫一個功能(function)。最常用的三個:
| 功能 | 查詢指令 | 接法 | 注意 |
|---|---|---|---|
| 直流電壓 | MEAS:VOLT:DC? |
並聯在元件兩端 | 電錶內阻很高,幾乎不影響電路 |
| 直流電流 | MEAS:CURR:DC? |
串聯在迴路裡 | 真實電錶要把探棒換到電流插孔;並聯上去等於短路,會燒保險絲 |
| 電阻 | MEAS:RES? |
元件兩端,電路要斷電 | 電錶自己送出小電流來量;電路有電時讀值沒有意義,甚至會損壞電錶 |
本課的模擬工作台接線是固定的:電壓檔量受測元件兩端,電流檔串在迴路上,所以程式換功能就好;真實的電錶要依功能換插孔。
量到超出範圍時,SCPI 儀器常用 +9.9E+37 這個特別的數字表示「溢位、無限大」。
程式拿到這種值要當成「量不到」,不能拿去計算平均。
逐步看:三種量測功能
注意通訊紀錄:每一個 MEAS:…? 都是一筆送出、一筆收到。看第 13 行:輸出還開著就量電阻,電錶回傳 +9.9E+37;
第 15 行關閉輸出之後再量,才得到大約 1000 Ω。
量程與積分時間(NPLC)
量程(range)是電錶這次準備量多大的值,例如 10 V 檔、100 V 檔。量程越小,同樣位數能分辨的電壓越細;
超過量程就溢位。大多數電錶預設自動量程,程式不設定也能量;要固定量程時,常見寫法是在 CONF 或 MEAS? 後面帶參數
(例如 CONF:VOLT:DC 10),細節以手冊為準。本課的模擬電錶預設自動量程,也接受 CONF:VOLT:DC 10 或 VOLT:RANG 10 固定量程;讀值超過量程時回傳 +9.9E+37(溢位)。
積分時間決定電錶每量一筆要「看」多久,單位常用 NPLC(Number of Power Line Cycles,幾個電源週期)。 電源線上的 60 Hz(台灣)或 50 Hz 干擾是量測雜訊的主要來源之一;如果量測時間剛好是整數個電源週期,這個干擾的正半週與負半週會互相抵消。
| NPLC | 每筆時間(60 Hz) | 每筆時間(50 Hz) | 特性 |
|---|---|---|---|
| 0.02 | 約 0.33 ms | 0.4 ms | 很快,雜訊大 |
| 1 | 約 16.7 ms | 20 ms | 常見的折衷 |
| 10 | 約 167 ms | 200 ms | 很慢,最穩 |
臺灣的電網是 60 Hz(1 PLC 約 16.7 ms);為了好算,本課的模擬電錶以 50 Hz 的 1 PLC=20 ms 計算。設定指令是 VOLT:NPLC 10(完整寫法 [SENSe:]VOLTage[:DC]:NPLCycles)。
一個要小心的地方:在很多電錶上,MEAS:VOLT:DC? 等於 CONF:VOLT:DC 加上 READ?,而 CONF 會把沒有寫在指令裡的設定改回預設值。
所以要自己設定積分時間和筆數時,改用三步:
dmm.write("CONF:VOLT:DC") # 1. 選功能(其他設定回到預設)
dmm.write("VOLT:NPLC 10") # 2. 改你要的設定
vals = dmm.query("READ?") # 3. 觸發並讀回
SAMP:COUN 5 讓電錶每次觸發量 5 筆,回傳用逗號隔開的五個數字;query_ascii_values() 會幫你切開並轉成 float 串列。
逐步看:積分時間越長,讀值越穩、越慢
同一個電壓,分別用 0.02、1、10 PLC 各量 5 筆。比較每一輪的兩個數字:花了多少時間、5 筆之間最大差多少。
time.perf_counter() 是計時用的時鐘,本頁的模擬時間和真實儀器的速度相當。
觸發:INIT 與 FETC?
READ? 把「開始量」和「讀回結果」綁在一起:送出之後,程式要等電錶量完才拿得到回答。
量 10 筆、每筆 200 ms,就要等 2 秒,這段時間程式什麼也不能做。
把它拆成兩個指令就自由了:
| 指令 | 做什麼 | 程式要等嗎 |
|---|---|---|
INIT |
讓電錶開始量(觸發),讀值存在電錶的記憶體 | 不用,送出就返回 |
FETC? |
把記憶體裡的讀值送回來 | 還沒量完就等到量完 |
READ? |
等於 INIT 加 FETC? |
要 |
MEAS:…? |
等於 CONF 加 READ? |
要 |
送出 INIT 之後,程式可以去設定別台儀器、處理上一批資料,最後再用 FETC? 取回。
FETC? 與 READ? 的等待受 PyVISA 的 timeout 限制(預設 2000 毫秒):量測比 timeout 久,就會丟出 VI_ERROR_TMO。
要量很久時,先放寬 timeout,例如 dmm.timeout = 5000(毫秒);第 10 課會教怎麼估算要等多久。
注意 FETC? 前面一定要有一次 INIT,否則電錶沒有新的讀值可以給(本課的模擬電錶會在錯誤佇列放 -230,"Data corrupt or stale")。
拿到一串讀值後,用 Python 的 statistics 模組算平均(mean)與標準差(stdev):平均是你要報告的值,標準差說明讀值有多分散。
逐步看:INIT 之後程式可以先做別的事
看第 15 行與第 17 行印出的時間:INIT 送出後約 1 ms 就返回,FETC? 才等到 10 筆量完(10 筆 × 1 PLC,約 200 ms)。
小測驗:功能與積分時間
電路還通電時送出 MEAS:RES?,模擬電錶回傳 +9.9E+37。下面哪一個做法正確?
電錶設定 VOLT:NPLC 10、SAMP:COUN 5,1 PLC 以 20 ms 計,一次 READ? 大約要多久?
為什麼積分時間設成整數個電源週期(例如 1 PLC)時,讀值特別穩?
小測驗:多筆讀值與觸發
下面的程式會印出什麼?
reply = "+4.99998558E+00,+4.99995779E+00\n"
vals = [float(x) for x in reply.split(",")]
print(len(vals), round(sum(vals) / len(vals), 4))
你想讓電錶量 10 筆的同時,程式先去設定函數產生器。下面哪一個寫法對?
程式先 VOLT:NPLC 10,接著用 MEAS:VOLT:DC? 量測。在很多電錶上,這次量測的積分時間可能是多少?
重點整理
- 量測功能:
MEAS:VOLT:DC?(並聯)、MEAS:CURR:DC?(串聯)、MEAS:RES?(電路斷電)。+9.9E+37表示溢位,不能拿去計算。 - 量程:預設自動量程;固定量程的寫法以手冊為準。
- 積分時間 NPLC:越長越穩、越慢;整數個電源週期可以抵消電源線的交流干擾。
- 自訂設定的量測:
CONF→VOLT:NPLC、SAMP:COUN→READ?;MEAS?會把設定改回預設。 INIT觸發後馬上返回,FETC?取回讀值(還沒量完就等);query_ascii_values()把多筆讀值轉成 float 串列。
下一課處理「出錯」:錯誤佇列的完整讀法、逾時、找不到儀器,以及怎麼寫出出錯也一定會關閉輸出的程式。