在信号发生器自动化测试中,实现信号序列的生成需要结合硬件控制、序列规划、脚本编程以及同步触发技术。以下是分步骤的实现方法,涵盖从序列设计到硬件执行的完整流程,并提供Python代码示例。
一、信号序列生成的核心步骤
1. 序列规划
- 定义信号参数:包括频率、幅度、相位、波形类型(正弦波、方波、脉冲等)、调制方式(AM/FM/PM)等。
- 时间序列设计:指定每个信号的持续时间、切换时间(如上升/下降沿)和重复次数。
- 触发控制:设置内部触发或外部触发信号,确保序列与其他设备同步。
2. 硬件接口选择
- SCPI命令:通过标准SCPI(可编程仪器标准命令)控制信号发生器(如Keysight、Rigol、Tektronix设备)。
- 专用API:使用厂商提供的SDK(如NI-DAQmx、ADI库)实现更复杂的序列控制。
- 网络通信:通过TCP/IP、USB或GPIB接口发送命令。
3. 序列生成方式
- 静态序列:预先定义所有信号参数,按顺序执行。
- 动态序列:根据实时反馈(如传感器数据)动态调整序列参数。
- 循环与嵌套:支持重复执行子序列或条件分支。
4. 同步与触发
- 内部触发:信号发生器自动按时间切换信号。
- 外部触发:通过TTL信号或软件触发控制序列切换。
- 事件标记:在序列中插入标记信号,便于数据采集设备对齐。
二、代码实现示例
1. 使用PyVISA控制信号发生器生成序列
| 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}, |
| {"type": "SQU", "freq": 500e3, "amp": 0.5, "duration": 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() |
2. 高级序列控制(使用列表模式)
部分信号发生器支持列表模式(List Mode),可一次性上传所有序列参数,减少通信开销:
| # 示例:Keysight 33600系列列表模式配置 |
| sig_gen.write("SOUR1:LIST:SEL ON") |
| sig_gen.write("SOUR1:LIST:FREQ 1E6, 500E3, 100E3") |
| 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") |
三、关键优化技术
1. 动态序列生成
- 条件分支:根据测试结果动态调整序列(如失败时重复当前步骤)。
pythondef generate_dynamic_sequence(initial_params, max_retries=3):retries = 0sequence = [initial_params]while retries < max_retries:# 模拟测试结果(实际应替换为真实反馈)test_result = simulate_test(sequence[-1])if test_result["pass"]:breakelse:retries += 1# 调整参数(如降低频率)adjusted_params = {"freq": sequence[-1]["freq"] * 0.8,"amp": sequence[-1]["amp"],"type": sequence[-1]["type"]}sequence.append(adjusted_params)return sequence
2. 多通道同步
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") # 同步频率
3. 序列验证
pythondef validate_params(params, device_limits):if params["freq"] < device_limits["min_freq"] or params["freq"] > device_limits["max_freq"]:raise ValueError(f"频率超出范围 {device_limits['min_freq']}-{device_limits['max_freq']}Hz")if params["amp"] < device_limits["min_volt"] or params["amp"] > device_limits["max_volt"]:raise ValueError(f"幅度超出范围 {device_limits['min_volt']}-{device_limits['max_volt']}Vpp")
四、扩展功能
1. 调制信号序列
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
2. 序列日志记录
| 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"] |
| ]) |
3. 与自动化测试框架集成
- 结合Pytest:将序列生成作为测试用例的一部分。
| 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}") |
| # 执行测试并验证结果 |
五、常见问题解决
- 序列执行延迟:
- 减少SCPI命令发送频率,使用批量上传(如列表模式)。
- 检查设备缓冲区是否溢出。
- 同步错误:
- 确保触发信号极性(上升沿/下降沿)与设备设置一致。
- 使用硬件同步线(如Keysight的
LAN/GPIB-to-Trigger转换器)。
- 参数越界:
- 在生成序列前调用
validate_params()检查范围。
六、工具与库推荐
- 硬件控制:
- PyVISA(通用SCPI设备)
- Keysight IO Libraries Suite(官方驱动)
- NI-DAQmx(National Instruments设备)
- 序列设计:
- MATLAB Signal Processing Toolbox(复杂序列生成)
- LabVIEW(图形化序列编辑)
- 同步与触发:
- TTL信号发生器(如Arduino生成触发脉冲)
- 专用触发分配器(如Keysight 81160A)
通过上述方法,可实现信号发生器自动化测试中的灵活信号序列生成,适用于生产测试、研发验证或教育演示等场景。根据实际设备型号调整SCPI命令和接口配置即可适配不同硬件。