在信号发生器自动化测试中,实现信号序列的生成需要结合硬件控制、序列规划、脚本编程以及同步触发技术。以下是分步骤的实现方法,涵盖从序列设计到硬件执行的完整流程,并提供Python代码示例。
python
import
pyvisa
import
time
# 初始化资源管理器
rm = pyvisa.ResourceManager()
# 连接信号发生器(替换为实际地址)
sig_gen = rm.open_resource("TCPIP0::192.168.1.100::inst0::INSTR")
# 定义信号序列参数
sequence = [
{"type":
"SIN",
"freq":
1e6,
"amp":
1.0,
"duration":
2.0},# 1MHz正弦波,2秒
{"type":
"SQU",
"freq":
500e3,
"amp":
0.5,
"duration":
1.5},
# 500kHz方波,1.5秒
{"type":
"PULS",
"freq":
100e3,
"amp":
2.0,
"width":
10e-6,
"duration":
3.0}
# 脉冲序列
]
# 配置信号发生器(通用设置)
sig_gen.write("OUTP1 ON")# 启用输出
sig_gen.write("SOUR1:BURS:STAT ON")# 启用突发模式(如需)
# 执行序列
for
step
in
sequence:
# 设置波形类型
if
step["type"] ==
"SIN":
sig_gen.write("SOUR1:FUNC SIN")
elif
step["type"] ==
"SQU":
sig_gen.write("SOUR1:FUNC SQU")
elif
step["type"] ==
"PULS":
sig_gen.write("SOUR1:FUNC PULS")
sig_gen.write(f"SOUR1:PULS:WIDT
{step['width']}")# 设置脉冲宽度
# 设置频率和幅度
sig_gen.write(f"SOUR1:FREQ
{step['freq']}")
sig_gen.write(f"SOUR1:VOLT
{step['amp']}")
# 启动信号并等待指定时间
print(f"生成
{step['type']}:
{step['freq']/1e3}kHz,
{step['amp']}Vpp,持续{step['duration']}秒")
time.sleep(step["duration"])
# 关闭输出
sig_gen.write("OUTP1 OFF")
sig_gen.close()
部分信号发生器支持列表模式(List Mode),可一次性上传所有序列参数,减少通信开销:
python
# 示例:Keysight 33600系列列表模式配置
sig_gen.write("SOUR1:LIST:SEL ON")# 启用列表模式
sig_gen.write("SOUR1:LIST:FREQ 1E6, 500E3, 100E3")# 频率列表(1MHz, 500kHz, 100kHz)
sig_gen.write("SOUR1:LIST:VOLT 1.0, 0.5, 2.0")# 幅度列表
sig_gen.write("SOUR1:LIST:DWEL 2.0, 1.5, 3.0")# 持续时间列表(秒)
sig_gen.write("SOUR1:LIST:TRIG:SOUR BUS")# 通过软件触发切换
sig_gen.write("OUTP1 ON")
# 触发序列执行(通过SCPI命令或外部信号)
sig_gen.write("SOUR1:LIST:INIT")# 初始化列表
sig_gen.write("SOUR1:LIST:TRIG")# 手动触发
pythondef generate_dynamic_sequence(initial_params, max_retries=3):retries = 0sequence = [initial_params]while retries
python# 示例:Keysight设备同步两通道sig_gen.write("SOUR1:PHAS 0") # 通道1相位0°sig_gen.write("SOUR2:PHAS 90") # 通道2相位90°(相对通道1)sig_gen.write("SOUR1:FREQ 1E6")sig_gen.write("SOUR2:FREQ 1E6") # 同步频率
pythondef validate_params(params, device_limits):if params["freq"] device_limits["max_freq"]:raise ValueError(f"频率超出范围 {device_limits['min_freq']}-{device_limits['max_freq']}Hz")if params["amp"] device_limits["max_volt"]:raise ValueError(f"幅度超出范围 {device_limits['min_volt']}-{device_limits['max_volt']}Vpp")
python# 示例:生成AM调制序列sig_gen.write("SOUR1:FUNC:AM ON")sig_gen.write("SOUR1:AM:INT:FREQ 10E3") # 调制频率10kHzsig_gen.write("SOUR1:AM:DEP 50") # 调制深度50%sig_gen.write("SOUR1:FREQ 1E6") # 载波频率1MHz
python
import
csv
def
log_sequence(sequence, filename="sequence_log.csv"
):
with
open(filename,
"w", newline="")
as
f:
writer = csv.writer(f)
writer.writerow(["Step",
"Type",
"Freq (Hz)",
"Amp (Vpp)",
"Duration (s)"])
for
i, step
in
enumerate(sequence):
writer.writerow([
i+1,
step["type"],
step["freq"],
step["amp"],
step["duration"]
])
python
import
pytest
@pytest.mark.parametrize("freq,amp", [(1E6, 1.0), (500E3, 0.5)])
def
test_signal_sequence(freq, amp):
sig_gen.write(f"SOUR1:FREQ
{freq}")
sig_gen.write(f"SOUR1:VOLT
{amp}")
# 执行测试并验证结果
LAN/GPIB-to-Trigger
转换器)。
validate_params()
检查范围。
通过上述方法,可实现信号发生器自动化测试中的灵活信号序列生成,适用于生产测试、研发验证或教育演示等场景。根据实际设备型号调整SCPI命令和接口配置即可适配不同硬件。