在 Python 中為 SMU 創建簡單的Sequence

更新 Mar 31, 2024

環境

驅動程式

  • NI-DCPower

程式語言

  • Python

本篇文章示範如何撰寫 Python 腳本來為 PXI 電源量測單元 (SMU) 設定簡單的Sequence 。


首要條件

在您的 Python 開發環境中,按照以下步驟來建立簡單的Sequence。此範例使用 PXIe-4137 SMU來產生一系列電壓輸出的Sequence做為示範。

1. 匯入以下所需Module:
import hightime
import nidcpower

2. 用下列輸入參數來定義main()功能:
  • resource_name :用於指定 PXI SMU 的名稱。
  • options:用於指定模擬和驅動程式選項。
  • voltage_max :用於指定最大的輸出電壓。
  • current_limit :用於指定限制多少電流。
  • number_of_outputs :用於指定要產生的電壓數目。
  • delay_in_seconds :用於定義timeouts。
def main(resource_name, options, voltage_max, current_limit, number_of_outputs, delay_in_seconds):

3. 在main()內部,定義delay_in_seconds + 1 秒的timeout。
timeout = hightime.timedelta(seconds=(delay_in_seconds + 1.0))

4. 建立一個NIDCPower session,使用resource_nameoptions來定義session參數。
with nidcpower.Session(resource_name=resource_name, options=options) as session:

5. 在 NIDCPower session中,設定Source Mode ( session.source_mode ) 和輸出功能 ( session.output_function )。
  • source_mode必須設置為SEQUENCE
  • 對於此範例, output_function設置為DC_VOLTAGE 。請參閱output_function檔案來查看其他可使用的輸入值。
session.source_mode = nidcpower.SourceMode.SEQUENCE
session.output_function=nidcpower.OutputFunction.DC_VOLTAGE

6. 定義Sequence要使用的voltage 以及 Source Delay 陣列。
  1. 定義一個名為voltages的空陣列。
  2. 定義一個名為source_delays的空陣列。
  3. 透過將voltage_max除以number_of_outputs來計算voltage_step
  4. 定義一個 for 迴圈, number_of_outputs作為要執行的次數。
  5. 在 for 迴圈內,將voltage_step*i添加到電壓陣列。這將建立一個陣列,其中包含從 0 到voltage_max的電壓,每次電壓增加幅度都相等。
  6. delay_in_seconds添加到source_delays陣列。這確保每個輸出電壓之間有相同的source_delay
  7. 此部份程式碼會類似於如下:
voltages = []
source_delays = []
voltage_step = voltage_max/number_of_outputs
for i in range(number_of_outputs):
	voltages.append(voltage_step*i)
	source_delays.append(delay_in_seconds)

7. 在 for 迴圈之外,定義Sequence並完成session設定。
  1. 電壓source_delays陣列傳遞給set_sequence方法。這能夠設定Sequence中的steps。
  2. session.voltage_level_range設置為voltage_max
  3. session.current_limit設置為current_limit
  4. session.current_limit_range設置為current_limit
  5. session.aperture_time設置為合適的值。此範例使用 0.0001 秒的Aperture Time。
  6. 此部份程式碼會類似於如下:
session.set_sequence(voltages, source_delays)
session.voltage_level_range = voltage_max
session.current_limit = current_limit
session.current_limit_range = current_limit
session.aperture_time = 0.0001

8. Initiate the session並獲取量測數值。
  1. 呼叫initiate方法。
  2. 使用wait_for_event 方法將session設置為等待SEQUENCE_ENGINE_DONE event
  3. 定義一個名為measurement_group的變數,用於儲存session.fetch_multiple的結果。
  4. [Optional]使用[External] input()強制 Python 腳本在繼續執行之前先等待使用者輸入。如果您是打算稍後從 InstrumentStudio 監控Sequence,這會很有幫助。
  5. 此部份程式碼會類似於如下:
session.initiate()
session.wait_for_event(nidcpower.Event.SEQUENCE_ENGINE_DONE)
measurement_group = session.fetch_multiple(len(voltages),timeout=timeout)
input('Wait before printing results')

9.格式化獲取的資料並印出結果。
  1. 定義一個名為line_format的變數,將字串格式以 3欄呈現,靠左對齊。請參閱[外部] 常用字串操作以了解字串格式。
  2. 列印三欄,標題為“Num”、“Voltage”和“Current”。
  3. 定義一個 for 迴圈,每一次每個量測值會儲存在measurement_group中。
  4. 在 for 迴圈內,將num設置為 0。
  5. 使用line_format格式化印出nummeasurements[0]measurements[1] 。這將分別在每個“Num”、“Voltage”和“Current”欄下印出值。
  6. 此部份程式碼會類似於如下:
line_format= '{:<10}{:<10}{:<10}'
print(line_format.format('Num', 'Voltage', 'Current'))
for i, measurements in enumerate(measurement_group):
	num = 0
	print(line_format.format(num, measurements[0], measurements[1]))

10. 定義傳遞給 main函式的選項。
  1. 退出main函式
  2. 輸入options={'simulate': <Simulated>, 'driver_setup': {'Model' : '<Model>', 'BoardType'': '<BoardType>', }, } 其中:
    • <Simulated>TrueFalse ,具體取決於您是否希望模擬 SMU。
    • <Model>是 SMU 的型號。對於此範例, <Model>4137
    • <BoardType>PXIPXIe
options = {'simulate': False, 'driver_setup': {'Model': '4137', 'BoardType': 'PXIe', }, }

11. 從下面的範例程式碼呼叫具有所需參數值的main函式
  • resource_name設置為PXI1Slot2 。確保這與 NI Measurement & Automation Explorer (MAX) 中列出的 SMU 名稱相匹配。
  • options設置為options
  • voltage_max設置為10
  • current_limit設置為0.5
  • number_of_outputs設置為10
  • delay_in_seconds設置為0.5
main('PXI1Slot2', options, 10,  0.5, 10, 0.5)

完整代碼應類似於以下內容:
import hightime
import nidcpower

def main(resource_name, options, voltage_max, current_limit, number_of_outputs, delay_in_seconds):
	timeout = hightime.timedelta(seconds=(delay_in_seconds + 1.0))
	with nidcpower.Session(resource_name=resource_name, options=options) as session:
		session.source_mode = nidcpower.SourceMode.SEQUENCE
		session.output_function=nidcpower.OutputFunction.DC_VOLTAGE
		voltages = []
		source_delays = []
		voltage_step = voltage_max/number_of_outputs
		for i in range(number_of_outputs):
			voltages.append(voltage_step*i)
			source_delays.append(delay_in_seconds)
		session.set_sequence(voltages, source_delays)
		session.voltage_level_range = voltage_max
		session.current_limit = current_limit
		session.current_limit_range = current_limit
		session.aperture_time = 0.0001
		session.initiate()
		session.wait_for_event(nidcpower.Event.SEQUENCE_ENGINE_DONE)
		measurement_group = session.fetch_multiple(len(voltages),timeout=timeout)
		input('Wait before printing results')
		line_format= '{:<10}{:<10}{:<10}'
		print(line_format.format('Num', 'Voltage', 'Current'))
		for i, measurements in enumerate(measurement_group):
			num = 0
			print(line_format.format(num, measurements[0], measurements[1]))

options = {'simulate': False, 'driver_setup': {'Model': '4137', 'BoardType': 'PXIe', }, }
main('PXI1Slot2', options, 11, 0.5, 10, 0.5)

印出的輸出結果顯示為:

蟒蛇輸出.PNG