National Central University
Uedu Main Site
Explore Uedu
Student Console
Register as Member/Login
Research Informed Consent Center
Survey Center
Educational Big Data Challenge
Claim or create a course
Try an AI Scenario Task
Support & Messages
Uptime Data

UeduGPTs

--

Jupyters

3

Local AI

--

Uedu Code

--

中央大學 AQI 78 24°C PM2.5 18
AI Reply Desktop Notifications

Show a desktop notification when the AI TA finishes replying

Chat Message Notifications

Notify me when classmates post messages in the forum

Sound notification

Play an alert sound whenever there is a new notification

Unit 07

第一個自動化程式

辨識儀器、設定電源輸出、量測並關閉輸出
Interaction 25 minute(s)

Learning Objectives

  • 用 ResourceManager 找到儀器,用 *IDN? 確認連到的是哪一台
  • 寫出「設定、打開輸出、量測、關閉輸出」的自動量測流程
  • 用限流保護受測元件,量完一定關閉輸出
  • 用 try/finally 確保程式出錯時也會關閉輸出,用 SYST:ERR? 檢查儀器有沒有回報錯誤

把一次量測寫成程式

前幾課認識了 SCPI 指令與 PyVISA。這一課把它們接起來,寫出第一個完整的自動量測程式: 用電源供應器把 5 V 加在一顆 LED(串一顆 150 Ω 限流電阻)上,用數位電錶量 LED 兩端的電壓,最後關掉輸出。

手動做這件事要按十幾個按鍵、抄兩個數字;寫成程式之後,按一次就做完,而且每一次的步驟都一樣。 自動量測最重要的不是快,而是每一次都照同樣的順序、同樣的設定,結果才能比較。

這一課要回答:

  1. 程式怎麼知道接上的是哪一台儀器?
  2. 一次量測要依什麼順序下指令?
  3. 程式中途出錯時,怎麼確保電源供應器不會一直開著?

本課的儀器是模擬的教學儀器(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。

互動練習:改寫成安全的量測程式

起始程式能量到 LED 的電流,但有兩個問題:沒有設限流、量完也沒關輸出。依序完成任務:

  1. 直接執行起始程式,看通訊紀錄。
  2. 在打開輸出之前把限流設成 10 mA(CURR 0.01),看電源供應器變成定電流(CC)。
  3. 用數位電錶(GPIB0::22::INSTR)量 LED 兩端的電壓並印出來。
  4. 量完關閉輸出,最好用 try/finally。
  5. 回答一個問題。

小測驗:流程與指令

1.

下面哪一個順序最安全?

2.

psu.query("MEAS:CURR?") 回傳 "0.01937\n",要算成毫安培,下面哪一行正確?

3.

儀器收到 VOLT 50(超過最大值 30 V)時會怎樣?

第 1 次作答

小測驗:try/finally

1.

下面的程式會印出什麼?

def measure():
    raise TimeoutError("逾時")

log = []
try:
    try:
        log.append("ON")
        measure()
        log.append("量完")
    finally:
        log.append("OFF")
except TimeoutError:
    log.append("處理錯誤")
print(log)
2.

*IDN? 為什麼常常是自動量測程式的第一個指令?

第 1 次作答

重點整理

  • rm.list_resources() 列出儀器,rm.open_resource(資源字串) 開啟連線,*IDN? 確認是哪一台。
  • 量測流程:*RST → 設定電壓與限流 → OUTP ON → 量測 → OUTP OFF。
  • write() 只送指令;query() 送出查詢並讀回答,回傳字串,計算前用 float() 轉換。
  • 用 try/finally 把關閉輸出放在 finally,程式出錯也會執行。
  • 儀器的錯誤放在錯誤佇列,用 SYST:ERR? 讀,讀到 0,"No error" 表示沒有錯誤了。

下一課專門介紹數位電錶:量測功能、量程與積分時間、觸發與一次讀多筆。

這一課完成了!
Next lesson:數位電錶量測
你目前沒有登入,學習進度只存在這個瀏覽器。 Login 後,進度會跟著帳號,換電腦也看得到。