在信号发生器编程控制中,波形参数化是指通过代码动态定义信号的参数(如频率、幅度、相位、调制类型等),而非硬编码固定值。这种方法可以显著提升测试灵活性,支持自动化测试、批量生成不同配置的信号,以及快速适应需求变化。以下是实现波形参数化的关键方法和示例:
将波形参数存储在变量或外部文件(如JSON、YAML、CSV)中,通过代码读取并动态生成信号。
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")
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 // 占空比(%)}
将参数化操作封装为函数,便于复用和扩展。
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
在测试过程中实时修改参数(如扫频、调幅)。
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)# 等待信号稳定
支持AM/FM/PM等调制类型的参数化配置。
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']}")
通过模板定义复杂信号序列(如多步频率跳变)。
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']))
同时控制多个通道的独立参数。
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")
# 触发所有通道
通过数学表达式动态生成波形(如指数衰减正弦波)。
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")
参数验证:在发送命令前检查参数范围(如频率是否在设备支持的范围内)。
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),能够高效生成复杂信号,适应自动化测试、研发验证等多种场景。关键点包括:
根据实际需求选择合适的方法,平衡灵活性与性能。