在信号发生器编程控制中,波形参数化是指通过代码动态定义信号的参数(如频率、幅度、相位、调制类型等),而非硬编码固定值。这种方法可以显著提升测试灵活性,支持自动化测试、批量生成不同配置的信号,以及快速适应需求变化。以下是实现波形参数化的关键方法和示例:
将波形参数存储在变量或外部文件(如JSON、YAML、CSV)中,通过代码读取并动态生成信号。
pythonimport pyvisa
# 参数化配置(可从文件读取) params = { "frequency": 1e6, # 1 MHz "amplitude": 1.0, # 1 Vpp "offset": 0.0, # 0 V "waveform": "SIN", # 正弦波 "phase": 90 # 90度相位 }
# 连接设备 rm = pyvisa.ResourceManager() sig_gen = rm.open_resource("TCPIP0::192.168.1.100::inst0::INSTR")
# 动态设置参数 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)
# 动态生成信号(同上)
waveform_params.json 内容示例:
json{"frequency": 1e6,"amplitude": 1.0,"waveform": "SQU", // 方波"duty_cycle": 50 // 占空比(%)}
将参数化操作封装为函数,便于复用和扩展。
pythondef set_arbitrary_waveform(sig_gen, points, sample_rate): """生成用户自定义波形""" 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") # 切换到任意波模式
# 示例:生成一个三角波 import numpy as np points = np.linspace(-1, 1, 1000) # 1000个点,范围[-1V, 1V] set_arbitrary_waveform(sig_gen, points, 1e6) # 采样率1MHz
在测试过程中实时修改参数(如扫频、调幅)。
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) # 等待信号稳定
支持AM/FM/PM等调制类型的参数化配置。
pythonmod_params = { "type": "AM", "depth": 50, # 调制深度50% "mod_freq": 1e3, # 调制频率1kHz "carrier_freq": 10e6 # 载波频率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']}")
通过模板定义复杂信号序列(如多步频率跳变)。
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代码:
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") # 关闭连续模式 sig_gen.write("*TRG") # 触发所有通道
通过数学表达式动态生成波形(如指数衰减正弦波)。
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位整数
sig_gen.write("DATA:DAC VOLATILE, CLEAR") sig_gen.write_binary_values("DATA:DAC VOLATILE,", points, datatype="h") sig_gen.write("SOUR1:FUNC USER")
参数验证:在发送命令前检查参数范围(如频率是否在设备支持的范围内)。
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}")
错误处理:捕获设备通信异常。
pythontry:sig_gen.write("SOUR1:FREQ 1e6")except pyvisa.VisaIOError as e:print(f"Communication error: {e}")
性能优化:批量发送命令减少通信延迟。
pythonsig_gen.write("SOUR1:FREQ 1e6; VOLT 1.0; PHAS 0") # 单条命令设置多个参数
日志记录:记录参数和操作,便于调试。
pythonimport logginglogging.basicConfig(filename="sig_gen.log", level=logging.INFO)logging.info(f"Set frequency to {params['frequency']} Hz")
通过变量/配置文件、函数封装、动态调整和高级模板,可以灵活实现信号发生器的波形参数化。结合数学库(如NumPy)和自动化工具(如PyVISA),能够高效生成复杂信号,适应自动化测试、研发验证等多种场景。关键点包括:
根据实际需求选择合适的方法,平衡灵活性与性能。