资讯中心

联系我们

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

如何用SCPI指令查询电源输出电压序列的抖动与频率的关系?

2026-01-08 09:46:42  点击:

若需通过SCPI指令分析双向直流电源输出电压序列的抖动与频率关系,需结合数据采集、时域分析频域转换功能。由于标准SCPI指令不直接提供抖动-频率关联分析功能,需通过以下步骤实现:

步骤1:配置数据采集参数

需设置足够的采样率和采样点数,以捕获电压序列的抖动特性。

scpiSENS:VOLT:DC:NPLC 0.01      ; 设置积分时间为0.01NPLC(提高采样率)TRIG:SOUR IMM               ; 立即触发采样
INIT:IMM                     ; 初始化并开始采样
*WAIT                        ; 等待采样完成(或通过查询状态寄存器判断)

关键参数说明

  • NPLC(Number of Power Line Cycles):积分时间,值越小采样率越高(但可能降低精度)。
  • 采样点数需通过TRAC:POIN指令设置(若设备支持),例如:
    scpiTRAC:POIN 10000           ; 采集10000个点

步骤2:读取电压序列数据

通过缓冲区读取原始电压数据,返回格式通常为逗号分隔的字符串。

scpiTRAC:DATA?                  ; 查询缓冲区中的电压序列

示例返回数据

"48.123,48.115,48.132,48.108,...,48.125"  ; 10000个电压值

步骤3:本地计算抖动与频率关系

将返回的字符串解析为数值列表,通过以下方法分析:

方法1:时域分析(计算抖动)

  • 抖动定义:电压序列的瞬时值与平均值的偏差。
  • 计算步骤
    1. 计算电压序列的平均值:
      pythonimport numpy as npvoltage_list = [float(x) for x in data_str.split(',')]average_voltage = np.mean(voltage_list)
    2. 计算每个点的抖动(绝对值或百分比):
      pythonjitter_list = [abs(v - average_voltage) for v in voltage_list]  # 绝对抖动# 或jitter_percent_list = [(v - average_voltage) / average_voltage * 100 for v in voltage_list]  # 百分比抖动

方法2:频域分析(提取频率成分)

  • 目的:通过傅里叶变换分析电压序列中的频率成分,关联抖动与特定频率。
  • 计算步骤
    1. 对电压序列进行快速傅里叶变换(FFT):
      pythonimport numpy as npfft_result = np.fft.fft(voltage_list)frequencies = np.fft.fftfreq(len(voltage_list), d=1/sampling_rate)  # sampling_rate需根据NPLC计算
    2. 提取显著频率成分及其幅值:
      pythonsignificant_freq_indices = np.argsort(np.abs(fft_result))[-5:]  # 取幅值最大的5个频率significant_freqs = frequencies[significant_freq_indices]significant_amps = np.abs(fft_result[significant_freq_indices])

方法3:关联抖动与频率

  • 分析思路
    • 若抖动集中在特定频率(如开关频率的谐波),则抖动与该频率强相关。
    • 通过绘制抖动时域图和频域图,直观观察关联性。
  • 示例代码
    pythonimport matplotlib.pyplot as plt# 绘制抖动时域图plt.figure(figsize=(12, 6))plt.subplot(2, 1, 1)plt.plot(jitter_list)plt.title("Voltage Jitter (Time Domain)")plt.xlabel("Sample Index")plt.ylabel("Jitter (V)")# 绘制频域图plt.subplot(2, 1, 2)plt.stem(frequencies[:len(frequencies)//2], np.abs(fft_result[:len(frequencies)//2]))  # 只画正频率部分plt.title("Frequency Spectrum")plt.xlabel("Frequency (Hz)")plt.ylabel("Amplitude")plt.tight_layout()plt.show()

步骤4:优化与验证

  1. 调整采样参数
    • 若频域分辨率不足,增加采样点数(TRAC:POIN)或降低NPLC值。
    • 确保采样率满足奈奎斯特定理(至少为最高关注频率的2倍)。
  2. 验证结果
    • 通过串口调试工具(如Putty)手动发送指令,确认返回数据格式正确。
    • 使用标准信号源(如函数发生器)生成已知频率的电压序列,验证分析逻辑。

完整Python示例

pythonimport numpy as npimport matplotlib.pyplot as pltimport pyvisa as visa# 连接设备rm = visa.ResourceManager()device = rm.open_resource("TCPIP0::192.168.1.100::inst0::INSTR")  # 替换为实际地址# 配置采样参数device.write("SENS:VOLT:DC:NPLC 0.01")device.write("TRAC:POIN 10000")device.write("TRIG:SOUR IMM")device.write("INIT:IMM")device.query("*OPC?")  # 等待操作完成# 读取数据data_str = device.query("TRAC:DATA?")voltage_list = [float(x) for x in data_str.strip('"').split(',')]# 计算平均值和抖动average_voltage = np.mean(voltage_list)jitter_list = [abs(v - average_voltage) for v in voltage_list]# 频域分析(假设采样率为10kHz,需根据实际NPLC计算)sampling_rate = 10000  # 示例值,需根据设备手册修正fft_result = np.fft.fft(voltage_list)frequencies = np.fft.fftfreq(len(voltage_list), d=1/sampling_rate)# 绘制结果plt.figure(figsize=(12, 8))plt.subplot(3, 1, 1)plt.plot(voltage_list[:100])  # 绘制前100个点plt.title("Raw Voltage Sequence")plt.xlabel("Sample Index")plt.ylabel("Voltage (V)")plt.subplot(3, 1, 2)plt.plot(jitter_list[:100])  # 绘制前100个点的抖动plt.title("Voltage Jitter")plt.xlabel("Sample Index")plt.ylabel("Jitter (V)")plt.subplot(3, 1, 3)plt.stem(frequencies[:len(frequencies)//2], np.abs(fft_result[:len(frequencies)//2]))plt.title("Frequency Spectrum")plt.xlabel("Frequency (Hz)")plt.ylabel("Amplitude")plt.tight_layout()plt.show()# 关闭连接device.close()

注意事项

  1. 设备兼容性
    • 确认电源支持TRAC:DATA?TRAC:POIN等指令(参考设备手册)。
    • 部分电源可能需通过MEAS:VOLT:DC?逐点读取,此时需通过循环实现采样。
  2. 采样率计算
    • NPLC与采样率的关系:采样率 = 50 / NPLC(对于50Hz工频电网,NPLC=0.01对应采样率为5kHz)。
  3. 误差处理
    • 添加超时机制(如device.timeout = 5000)避免程序卡死。
    • 检查返回数据是否完整(如通过len(voltage_list)验证采样点数)。