编写信号发生器的控制脚本需要结合设备特性、通信协议和测试需求,通过编程实现参数设置、状态监控和自动化测试。以下是分步骤的详细指南,包含代码示例(Python)和关键注意事项:
100Hz~6GHz
,幅度范围
-130dBm~+20dBm
。
pyvisa
:控制VISA兼容设备。
numpy
:生成波形数据(如AWG模式)。
matplotlib
:可视化输出信号(调试用)。
bashpip install pyvisa numpy matplotlib
TCPIP0::192.168.1.100::inst0::INSTR
)。
python
import
pyvisa
# 创建资源管理器
rm = pyvisa.ResourceManager()
# 打开设备连接(替换为实际资源字符串)
device = rm.open_resource("TCPIP0::192.168.1.100::inst0::INSTR")
# 设置超时(秒)和读写终止符
device.timeout =
5000
# 5秒超时
device.read_termination =
'n'
device.write_termination =
'n'
# 查询设备标识(验证连接)
print(device.query("*IDN?"))# 示例输出: "Keysight Technologies,E4438C,..."
设置频率与幅度:
python
def
set_signal(freq_hz, amp_dbm):
# 设置频率(单位:Hz)
device.write(f"FREQ
{freq_hz}Hz")
# 设置幅度(单位:dBm)
device.write(f"POW
{amp_dbm}dBm")
# 启用输出
device.write("OUTP ON")
# 示例:设置1GHz信号,幅度0dBm
set_signal(1e9,
0)
设置调制类型(如AM、FM、脉冲):
python
def
set_modulation(mod_type, depth=50
):
# 关闭调制(先重置)
device.write("MOD OFF")
# 设置调制类型(AM为例)
if
mod_type.upper() ==
"AM":
device.write("MOD:AM:STAT ON")
device.write(f"MOD:AM:DEP
{depth}%")# 调制深度50%
elif
mod_type.upper() ==
"FM":
device.write("MOD:FM:STAT ON")
device.write(f"MOD:FM:DEV
{10e3}Hz")# 频偏10kHz
# 其他调制类型类似...
# 示例:启用AM调制,深度50%
set_modulation("AM",
50)
python
import
numpy
as
np
def
upload_arbitrary_waveform(waveform_data, sample_rate):
# 生成正弦波(示例)
t = np.linspace(0,
1,
len(waveform_data))
waveform = np.sin(2
* np.pi *
5e6
* t)# 5MHz正弦波
# 归一化到[-1, 1]并转换为16位整数
waveform_scaled = np.int16((waveform / np.max(np.abs(waveform))) *
32767)
# 上传波形到设备(假设设备支持ARB:DATA命令)
device.write("SOUR:FUNC:ARB:STAT ON")# 启用ARB模式
device.write_binary_values(
"SOUR:DATA:ARB:DATA", waveform_scaled,
datatype='h', is_big_endian=False
)
# 设置采样率
device.write(f"SOUR:FREQ:RAST
{sample_rate}Hz")
# 示例:上传1000点的正弦波,采样率100MSa/s
upload_arbitrary_waveform(np.zeros(1000),
100e6)
查询当前状态:
python
def
query_status():
freq = device.query("FREQ?")# 示例输出: "1.000000E+09n"
amp = device.query("POW?")
status = device.query("OUTP:STAT?")# "1"表示开启,"0"表示关闭
print(f"Frequency:
{freq.strip()}
Hz, Power:
{amp.strip()}
dBm, Output:
{status.strip()}")
# 示例:查询并打印状态
query_status()
等待操作完成:
python
def
wait_for_operation():
# 查询操作完成标志(*OPC?返回"1"表示完成)
while
True:
if
device.query("*OPC?").strip() ==
"1":
break
time.sleep(0.1)# 避免CPU占用过高
# 示例:设置频率后等待完成
device.write("FREQ 2GHz")
wait_for_operation()
python
import
logging
logging.basicConfig(filename='signal_generator.log', level=logging.ERROR)
try:
set_signal(10e9,
10)# 尝试设置10GHz(可能超出范围)
except
pyvisa.Error
as
e:
logging.error(f"VISA Error:
{str(e)}")
print("设置失败,请检查参数范围!")
python
import
pyvisa
import
time
import
logging
# 初始化日志
logging.basicConfig(filename='signal_generator.log', level=logging.INFO)
def
main():
try:
# 连接设备
rm = pyvisa.ResourceManager()
device = rm.open_resource("TCPIP0::192.168.1.100::inst0::INSTR")
device.timeout =
5000
device.read_termination =
'n'
device.write_termination =
'n'
logging.info(f"Connected to:
{device.query('*IDN?').strip()}")
# 设置信号
set_signal(device,
1e9,
0)# 1GHz, 0dBm
set_modulation(device,
"AM",
30)# AM调制,深度30%
# 查询状态
query_status(device)
# 关闭输出
device.write("OUTP OFF")
logging.info("Test completed successfully.")
except
pyvisa.Error
as
e:
logging.error(f"VISA Error:
{str(e)}")
except
Exception
as
e:
logging.error(f"Unexpected Error:
{str(e)}")
finally:
if
'device'
in
locals():
device.close()
def
set_signal(dev, freq_hz, amp_dbm):
dev.write(f"FREQ
{freq_hz}Hz")
dev.write(f"POW
{amp_dbm}dBm")
dev.write("OUTP ON")
logging.info(f"Set frequency:
{freq_hz}Hz, power:
{amp_dbm}dBm")
def
set_modulation(dev, mod_type, depth):
dev.write("MOD OFF")
if
mod_type.upper() ==
"AM":
dev.write("MOD:AM:STAT ON")
dev.write(f"MOD:AM:DEP
{depth}%")
logging.info(f"Enabled AM modulation, depth:
{depth}%")
# 其他调制类型类似...
def
query_status(dev):
freq = dev.query("FREQ?").strip()
amp = dev.query("POW?").strip()
status = dev.query("OUTP:STAT?").strip()
print(f"Current Status - Freq:
{freq}
Hz, Power:
{amp}
dBm, Output:
{'ON'
if
status ==
'1'
else
'OFF'}")
if
__name__ ==
"__main__":
main()
FREQ:MAX?
、
POW:MIN?
),避免越界错误。
try-finally
确保设备连接关闭,防止资源泄漏。
通过以上步骤,您可以编写出稳定、高效的信号发生器控制脚本,满足从基础信号生成到复杂调制测试的需求。