Learning Objectives
- 用 ResourceManager 找到儀器,用 *IDN? 確認連到的是哪一台
- 寫出「設定、打開輸出、量測、關閉輸出」的自動量測流程
- 用限流保護受測元件,量完一定關閉輸出
- 用 try/finally 確保程式出錯時也會關閉輸出,用 SYST:ERR? 檢查儀器有沒有回報錯誤
把一次量測寫成程式
前幾課認識了 SCPI 指令與 PyVISA。這一課把它們接起來,寫出第一個完整的自動量測程式: 用電源供應器把 5 V 加在一顆 LED(串一顆 150 Ω 限流電阻)上,用數位電錶量 LED 兩端的電壓,最後關掉輸出。
手動做這件事要按十幾個按鍵、抄兩個數字;寫成程式之後,按一次就做完,而且每一次的步驟都一樣。 自動量測最重要的不是快,而是每一次都照同樣的順序、同樣的設定,結果才能比較。
這一課要回答:
- 程式怎麼知道接上的是哪一台儀器?
- 一次量測要依什麼順序下指令?
- 程式中途出錯時,怎麼確保電源供應器不會一直開著?
本課的儀器是模擬的教學儀器(Uedu Sim),指令採常見的 SCPI 寫法;真實儀器的指令細節以該儀器的程式設計手冊為準。
逐步看:找到儀器、問「你是誰」
看畫面下方的通訊紀錄:每執行一次 query("*IDN?"),就有一筆「→」送出的指令和一筆「←」收到的回應。
list_resources() 回傳的字串叫資源字串,同時說明了介面(USB、GPIB)與位址。
一次量測的順序
自動量測程式幾乎都長這樣:
| 步驟 | 指令 | 為什麼 |
|---|---|---|
| 1. 回到已知狀態 | *RST |
上一個人可能改過設定;重設後輸出是關的 |
| 2. 設定 | VOLT 5、CURR 0.03 |
先設好電壓與限流,才打開輸出 |
| 3. 打開輸出 | OUTP ON |
這時候受測元件才通電 |
| 4. 量測 | MEAS:VOLT:DC?、MEAS:CURR? |
查詢指令(結尾有 ?)才會有回應 |
| 5. 關閉輸出 | OUTP OFF |
量完就斷電,保護元件也保護人 |
限流(current limit)是電源供應器的保護:電流到達設定值時,電源供應器自動降低電壓,讓電流不再增加(定電流模式,CC)。 LED 只要一點點電壓變化,電流就會大幅增加,所以給 LED 供電一定要設限流。
query() 回傳的是字串(例如 "+2.09374698E+00\n"),要用 float() 轉成數字才能計算。
逐步看:設定、量測、關閉
注意電路畫面:OUTP ON 之後 LED 才亮,電源供應器顯示「定電壓(CV)」;OUTP OFF 之後又暗了。
出錯時也要關閉輸出
上一個程式有個風險:如果第 11 行出錯(例如電錶沒接、逾時),程式就停了,第 14 行的 OUTP OFF 永遠不會執行,
電源供應器一直開著。在真實的實驗室裡,這可能讓元件過熱,甚至讓下一個人觸電。
Python 的 try/finally 解決這個問題:不管 try 裡面有沒有出錯,finally 裡的程式一定會執行。
另一種錯誤是儀器「聽得懂但做不到」:例如把電壓設成 50 V,但這台電源供應器最高 30 V。
儀器不會讓程式當掉,而是把錯誤放進自己的錯誤佇列,要用 SYST:ERR? 去問。-222,"Data out of range" 表示數值超出範圍,
0,"No error" 表示佇列已經空了。下一個範例兩種情況都示範。
逐步看:try/finally 與錯誤佇列
看 VOLT 50 那一步:儀器沒有回應錯誤訊息,程式也沒有出錯;要等到 SYST:ERR? 才知道設定失敗。最後一定會執行 finally 裡的 OUTP OFF。
小測驗:流程與指令
下面哪一個順序最安全?
psu.query("MEAS:CURR?") 回傳 "0.01937\n",要算成毫安培,下面哪一行正確?
儀器收到 VOLT 50(超過最大值 30 V)時會怎樣?
小測驗:try/finally
下面的程式會印出什麼?
def measure():
raise TimeoutError("逾時")
log = []
try:
try:
log.append("ON")
measure()
log.append("量完")
finally:
log.append("OFF")
except TimeoutError:
log.append("處理錯誤")
print(log)
*IDN? 為什麼常常是自動量測程式的第一個指令?
重點整理
rm.list_resources()列出儀器,rm.open_resource(資源字串)開啟連線,*IDN?確認是哪一台。- 量測流程:
*RST→ 設定電壓與限流 →OUTP ON→ 量測 →OUTP OFF。 write()只送指令;query()送出查詢並讀回答,回傳字串,計算前用float()轉換。- 用
try/finally把關閉輸出放在finally,程式出錯也會執行。 - 儀器的錯誤放在錯誤佇列,用
SYST:ERR?讀,讀到0,"No error"表示沒有錯誤了。
下一課專門介紹數位電錶:量測功能、量程與積分時間、觸發與一次讀多筆。