资讯中心

联系我们

深圳市维立信电子科技有限公司
地址:深圳市福田区红荔路第一世界广场A座8D-E
咨询电话:0755-83766766
E-mail:info@welissom.com

信号发生器编程控制中如何实现波形参数化

2025-10-14 09:57:33  点击:

在信号发生器编程控制中,波形参数化是指通过代码动态定义信号的参数(如频率、幅度、相位、调制类型等),而非硬编码固定值。这种方法可以显著提升测试灵活性,支持自动化测试、批量生成不同配置的信号,以及快速适应需求变化。以下是实现波形参数化的关键方法和示例:


一、参数化的核心方法

1. 使用变量和配置文件

将波形参数存储在变量或外部文件(如JSON、YAML、CSV)中,通过代码读取并动态生成信号。

示例1:Python + SCPI命令(Keysight 33600系列)

python
import 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")

示例2:从JSON文件读取参数

python
import 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    // 占空比(%)}

2. 使用函数封装参数化逻辑

将参数化操作封装为函数,便于复用和扩展。

示例:生成任意波形

python
def 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

3. 支持动态参数调整

在测试过程中实时修改参数(如扫频、调幅)。

示例:频率扫描

python
import 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)  # 等待信号稳定

4. 调制参数化

支持AM/FM/PM等调制类型的参数化配置。

示例:AM调制

python
mod_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']}")

二、高级参数化技术

1. 模板化信号序列

通过模板定义复杂信号序列(如多步频率跳变)。

示例:CSV定义序列

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代码

python
import 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']))

2. 多通道参数化

同时控制多个通道的独立参数。

示例:双通道同步信号

python
channels = [
{"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")           # 触发所有通道

3. 数学公式生成波形

通过数学表达式动态生成波形(如指数衰减正弦波)。

示例:衰减正弦波

python
import 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")

三、最佳实践

  1. 参数验证:在发送命令前检查参数范围(如频率是否在设备支持的范围内)。

    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}")
  2. 错误处理:捕获设备通信异常。

    pythontry:sig_gen.write("SOUR1:FREQ 1e6")except pyvisa.VisaIOError as e:print(f"Communication error: {e}")
  3. 性能优化:批量发送命令减少通信延迟。

    pythonsig_gen.write("SOUR1:FREQ 1e6; VOLT 1.0; PHAS 0")  # 单条命令设置多个参数
  4. 日志记录:记录参数和操作,便于调试。

    pythonimport logginglogging.basicConfig(filename="sig_gen.log", level=logging.INFO)logging.info(f"Set frequency to {params['frequency']} Hz")

四、总结

通过变量/配置文件函数封装动态调整高级模板,可以灵活实现信号发生器的波形参数化。结合数学库(如NumPy)和自动化工具(如PyVISA),能够高效生成复杂信号,适应自动化测试、研发验证等多种场景。关键点包括:

  • 解耦参数与代码:通过外部文件或数据库管理参数。
  • 模块化设计:封装常用操作为函数或类。
  • 实时控制:支持测试过程中的动态参数修改。

根据实际需求选择合适的方法,平衡灵活性与性能。