在信號發生器編程控製中,波形(xíng)參(cān)數化是指通過(guò)代碼動態定義信號(hào)的參數(如頻率、幅度、相位、調製(zhì)類型等),而非硬編碼固定值。這種方法可以顯著提升測試靈活性,支持自動化(huà)測試、批量生成不同配置(zhì)的信號,以及快速適應需求變化。以下是實現波形參數化的關鍵方法和示例:
將波形參(cān)數存儲在變量或(huò)外部文件(如JSON、YAML、CSV)中,通過代碼讀取(qǔ)並動態生成(chéng)信號。
pythonimport pyvisa
# 參數化配(pèi)置(可從文件讀取) params = { "frequency": 1e6, # 1 MHz "amplitude": 1.0, # 1 Vpp "offset": 0.0, # 0 V "waveform": "SIN", # 正弦波 "phase": 90 # 90度相位 }
# 連接設(shè)備 rm = pyvisa.ResourceManager() sig_gen = rm.open_resource("TCPIP0::192.168.1.100::inst0::INSTR")
# 動態(tài)設置參數 sig_gen.write(f"SOUR1:FUNC {params['waveform']}") sig_gen.write(f"SOUR1:FREQ {params['frequency']}") sig_gen.write(f"SOUR1:VOLT {params['amplitude']}") sig_gen.write(f"SOUR1:VOLT:OFFS {params['offset']}") sig_gen.write(f"SOUR1:PHAS {params['phase']}")
# 啟用輸出 sig_gen.write("OUTP1 ON")
pythonimport json
# 從JSON文件加載參數 with open("waveform_params.json", "r") as f: params = json.load(f)
# 動態生成信號(hào)(同上)
waveform_params.json 內容示例:
json{"frequency": 1e6,"amplitude": 1.0,"waveform": "SQU", // 方波(bō)"duty_cycle": 50 // 占(zhàn)空比(%)}
將參數化(huà)操作封裝為函數,便於複(fù)用和擴展(zhǎn)。
pythondef set_arbitrary_waveform(sig_gen, points, sample_rate): """生(shēng)成用戶自定義波形""" sig_gen.write("DATA:DAC VOLATILE, CLEAR") # 清空緩存 sig_gen.write_binary_values("DATA:DAC VOLATILE,", points, datatype="h") # 寫入點數據 sig_gen.write(f"FUNC:USER VOLATILE, '{sample_rate}'") # 設置采樣率 sig_gen.write("SOUR1:FUNC USER") # 切換到任意波模(mó)式
# 示例:生成一(yī)個(gè)三角波 import numpy as np points = np.linspace(-1, 1, 1000) # 1000個點,範圍[-1V, 1V] set_arbitrary_waveform(sig_gen, points, 1e6) # 采樣率1MHz
在測試過程中實時修(xiū)改參數(如掃頻、調幅)。
pythonimport time
start_freq = 1e3 # 1 kHz stop_freq = 10e6 # 10 MHz step = 100e3 # 步進100 kHz
for freq in range(int(start_freq), int(stop_freq), int(step)): sig_gen.write(f"SOUR1:FREQ {freq}") time.sleep(0.1) # 等(děng)待信號穩定
支(zhī)持AM/FM/PM等(děng)調製類型的參數化配置。
pythonmod_params = { "type": "AM", "depth": 50, # 調製深度50% "mod_freq": 1e3, # 調製頻率1kHz "carrier_freq": 10e6 # 載波頻率(lǜ)10MHz }
sig_gen.write(f"SOUR1:FUNC {mod_params['type']}") sig_gen.write(f"SOUR1:FREQ {mod_params['carrier_freq']}") sig_gen.write(f"SOUR1:{mod_params['type']}:DEPT {mod_params['depth']}") sig_gen.write(f"SOUR1:{mod_params['type']}:INT:FREQ {mod_params['mod_freq']}")
通過模(mó)板定義(yì)複雜信(xìn)號序列(如多步頻率跳變)。
csv# sequence.csvstep,function,frequency,amplitude,duration1,SIN,1e6,1.0,1.02,SQU,500e3,0.5,0.53,RAMP,2e6,0.8,0.2
Python代(dài)碼:
pythonimport csv
with open("sequence.csv", "r") as f: reader = csv.DictReader(f) for step in reader: sig_gen.write(f"SOUR1:FUNC {step['function']}") sig_gen.write(f"SOUR1:FREQ {step['frequency']}") sig_gen.write(f"SOUR1:VOLT {step['amplitude']}") time.sleep(float(step['duration']))
同時控製多個通道的獨立參數。
pythonchannels = [ {"id": 1, "freq": 1e6, "amp": 1.0, "phase": 0}, {"id": 2, "freq": 1e6, "amp": 0.5, "phase": 90} ]
for ch in channels: sig_gen.write(f"SOUR{ch['id']}:FUNC SIN") sig_gen.write(f"SOUR{ch['id']}:FREQ {ch['freq']}") sig_gen.write(f"SOUR{ch['id']}:VOLT {ch['amp']}") sig_gen.write(f"SOUR{ch['id']}:PHAS {ch['phase']}")
# 同步觸發 sig_gen.write("INIT:CONT OFF") # 關閉連續(xù)模(mó)式 sig_gen.write("*TRG") # 觸發所有(yǒu)通道
通(tōng)過數學表達(dá)式動態生成波形(如指數衰減正弦波)。
pythonimport numpy as np
t = np.linspace(0, 1, 1000) # 1秒時長 points = np.exp(-t) * np.sin(2 * np.pi * 1e3 * t) # 衰減正弦波 points = (points * 32767).astype(int) # 轉換為16位(wèi)整數
sig_gen.write("DATA:DAC VOLATILE, CLEAR") sig_gen.write_binary_values("DATA:DAC VOLATILE,", points, datatype="h") sig_gen.write("SOUR1:FUNC USER")
參數驗(yàn)證:在發送命令前(qián)檢查參數範圍(如頻率是否在設備(bèi)支持的範圍內)。
pythondef set_frequency(sig_gen, freq):if not 1e3 <= freq <= 100e6:raise ValueError("Frequency out of range (1kHz-100MHz)")sig_gen.write(f"SOUR1:FREQ {freq}")
錯誤處理:捕獲設備通信異(yì)常。
pythontry:sig_gen.write("SOUR1:FREQ 1e6")except pyvisa.VisaIOError as e:print(f"Communication error: {e}")
性能優化:批量(liàng)發送命令減少通信延遲。
pythonsig_gen.write("SOUR1:FREQ 1e6; VOLT 1.0; PHAS 0") # 單條命令(lìng)設置多(duō)個參數
日(rì)誌(zhì)記錄:記錄參數(shù)和操作,便於(yú)調試(shì)。
pythonimport logginglogging.basicConfig(filename="sig_gen.log", level=logging.INFO)logging.info(f"Set frequency to {params['frequency']} Hz")
通過變(biàn)量/配置文件、函數封裝、動態調整和高級模板,可以靈活實現信號發生器的波形參數化(huà)。結合數學庫(如NumPy)和自動化工(gōng)具(如PyVISA),能夠高效生成複雜信號,適應自(zì)動(dòng)化(huà)測試、研發驗證等多種場景。關鍵點包括:
根據實際需求選擇合適的方法(fǎ),平衡靈(líng)活(huó)性(xìng)與性能。