2026年9月1日 星期二

Agilent 34401A 萬用電表 控制介面設計

📺 影片版(約 7 分鐘):想先看實際操作的話可以直接看這支影片,完整步驟、設定與程式碼在下方文字版。
YouTube:https://youtu.be/mpRLVVXrFiQ(winson-DIY 頻道)
最近把閒置的儀器, 全部拿出來檢查是否還可用並寫GUI來控制充分利用一下!
34401A 萬用電表

設計概念:
1. 連接的GPIB介面輸入
2. 電表功能選擇
3. Chart圖形顯示語文字顯示
4. 輸出log顯示與儲存

實際執行驗證結果:
由power supply輸出DC12V由電表量測!



補充一、34401A 規格重點
34401A 是 HP(後來的 Agilent、現在的 Keysight)出的 6½ 位數桌上型萬用電表,雖然是老機種,到現在還是很多實驗室的標準配備:
項目規格
解析度6½ 位數(可切 4½ / 5½ / 6½)
DC 電壓100 mV ~ 1000 V,5 個檔位;10 V 檔 1 年準確度 0.0035% 讀值 + 0.0005% 檔位
AC 電壓100 mV ~ 750 V(True RMS)
DC / AC 電流DC 10 mA ~ 3 A;AC 1 A、3 A
電阻100 Ω ~ 100 MΩ,支援 2 線 / 4 線
其他頻率、週期、導通、二極體
介面GPIB(IEEE-488)、RS-232
讀值速度最快約 1000 筆/秒(4½ 位、NPLC 0.02)

小提醒:除了 1000 V 檔,各檔位都有 20% 超量程,所以 12 V 左右的訊號在自動檔位下仍會落在 10 V 檔,可以解析到 1 µV。

補充二、連線架構與 GPIB 位址
PC(C# WinForms)
   │  VISA(Keysight IO Libraries 或 NI-VISA)
   ▼
GPIB 介面卡 / USB-GPIB 轉接器(板號 GPIB0、GPIB1…)
   │  GPIB 線
   ▼
34401A(GPIB 位址,出廠預設 22,這台設成 24)
VISA 資源字串格式是 GPIB板號::位址::INSTR,這次實際用的是 GPIB1::24::INSTR。
從驗證截圖下方的 log 可以看到,前 4 次都是 Open Instrument Fail!!,把 GPIB 下拉選單從 0 改成 1 之後才連上,儀器回傳的 *IDN? 是:
HEWLETT-PACKARD,34401A,0,11-5-2
重點:電腦上如果裝過不只一張 GPIB 卡或轉接器,板號不一定是 0。開不起來時先用 Keysight Connection Expert 或 NI MAX 掃一次,確認板號和位址,比在程式裡亂試快很多。儀器的位址可以在前面板 Shift → Menu 的 I/O 選單裡查。

補充三、常用 SCPI 指令
GUI 上的「量測功能選擇」,背後就是對應到不同的 SCPI 指令:
功能一次量測(MEASure)先設定(CONFigure)
DC 電壓MEAS:VOLT:DC?CONF:VOLT:DC
AC 電壓MEAS:VOLT:AC?CONF:VOLT:AC
DC 電流MEAS:CURR:DC?CONF:CURR:DC
AC 電流MEAS:CURR:AC?CONF:CURR:AC
2 線電阻MEAS:RES?CONF:RES
4 線電阻MEAS:FRES?CONF:FRES
頻率 / 週期MEAS:FREQ? / MEAS:PER?CONF:FREQ / CONF:PER
導通 / 二極體MEAS:CONT? / MEAS:DIOD?CONF:CONT / CONF:DIOD

其他常用的:
  • *IDN?:讀儀器型號,拿來確認連線
  • *RST;*CLS:重置並清除錯誤狀態
  • READ?:依目前設定觸發一次並讀回
  • VOLT:DC:NPLC 10:積分時間(0.02 / 0.2 / 1 / 10 / 100),越大越準越慢
  • SYST:ERR?:讀錯誤佇列,指令沒反應時先查這個
連續量測的小技巧:MEAS:...? 每次都會重新設定儀器,連續量測會比較慢。比較好的做法是開始時 CONF 一次,之後在迴圈裡只送 READ?。

補充四、C# 程式骨架(VISA.NET)
以下是「連線 → 設定 → 連續讀值」的最小範例,用的是 Keysight IO Libraries 和 NI-VISA 都有提供的 VISA.NET(Ivi.Visa):
using System.Globalization;
using Ivi.Visa;

// 連線
var dmm = (IMessageBasedSession)GlobalResourceManager.Open("GPIB1::24::INSTR");
dmm.TimeoutMilliseconds = 5000;
dmm.Clear();
var io = dmm.FormattedIO;

io.WriteLine("*RST;*CLS");
io.WriteLine("*IDN?");
string idn = io.ReadLine();            // HEWLETT-PACKARD,34401A,0,11-5-2

// 設定一次:DC 電壓、自動檔位
io.WriteLine("CONF:VOLT:DC DEF,DEF");
io.WriteLine("VOLT:DC:NPLC 10");

// 連續讀值(放在背景 Task,按 Stop 時取消)
var sw = System.Diagnostics.Stopwatch.StartNew();
while (!token.IsCancellationRequested)
{
    io.WriteLine("READ?");
    double v = double.Parse(io.ReadLine(), CultureInfo.InvariantCulture);  // "+1.19872270E+01"
    double t = sw.Elapsed.TotalSeconds;
    // UI 執行緒更新:Chart 加點 (t, v)、Logs 加一行
    // $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff}] | {v:F6} -- V"
}

// 結束
dmm.Dispose();
幾個實作重點:
  • 量測迴圈不要放在 UI 執行緒:用 Task + CancellationToken,Stop 按鈕只負責取消,畫面才不會卡住
  • 解析讀值要用 InvariantCulture:儀器回的是科學記號字串,系統地區設定不同時可能解析錯誤
  • Chart 用時間當 X 軸:驗證截圖的 X 軸是「時間(秒)」,只保留最近一段(例如 200 點)視窗才不會越畫越慢
  • Timeout 一定要設:儀器關機或線鬆了,ReadLine 才不會一直卡住
  • 斷線後回本地操作:程式結束後前面板若顯示 Rmt 鎖住,按 Shift(Local)就能回到手動操作

補充五、實測結果解讀
驗證時由 power supply 輸出 DC 12 V,log 裡連續 9 筆讀值:
  • 讀值介於 11.987227 ~ 11.987254 V,跳動只有約 27 µV(約 2 ppm),讀值相當穩定
  • 跟 12 V 設定值差約 13 mV(−0.1%),這是 power supply 本身的輸出誤差,不是電表的問題,剛好可以拿 34401A 來校正電源的實際輸出
  • 相鄰兩筆的時間差約 0.43 秒,也就是大約每秒 2.3 筆,以 NPLC 10 的設定來說是合理的;需要更快可以把 NPLC 調小,但雜訊會變大

補充六、延伸應用
  • Logs 存成 CSV(時間, 讀值, 單位),之後可以用 Excel 或 Python 做長時間的穩定度分析
  • 搭配 power supply 一起程式控制,就能做自動化的電壓掃描或負載測試
  • 如果要一次量很多點,可以搭配 34970A 切換開關,做法可以參考之前的文章:PCBA電壓檢測項目-Aglient 34970A


延伸閱讀

沒有留言:

張貼留言