资讯中心

联系我们

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

如何用SCPI指令实现双向直流电源的序列输出与外部信号同步,并记录同步误差?

2025-12-03 09:19:43  点击:

要实现双向直流电源的序列输出与外部信号同步,并记录同步误差,需结合硬件触发配置、时间戳记录、误差计算等环节。以下是详细的SCPI指令实现方案及步骤:


一、硬件与连接准备

  1. 外部信号输入
    • 确保电源的Trigger In接口(通常为BNC接口)与外部信号源(如函数发生器、另一台设备的同步信号)连接。
    • 确认信号规格:TTL电平(0V/5V)、上升沿/下降沿触发、频率范围(如1Hz~10kHz)。
  2. 同步信号设计
    • 外部信号需与序列输出的关键事件对齐(如序列起点、某一段的切换点)。
    • 示例:用方波信号的上升沿触发序列启动,下降沿触发下一阶段。

二、SCPI指令配置序列与触发

1. 配置序列参数

scpiSYST:REM                    ; 进入远程控制模式*RST                        ; 复位设备(可选)
SOUR:LIST:COUN 3            ; 设置3个序列点
SOUR:LIST:VOLT 0, 24, 0     ; 电压序列:0V → 24V → 0V
SOUR:LIST:DWEL 5, 5, 5      ; 每段持续时间5秒

2. 设置外部触发

scpiTRIG:SOUR EXT               ; 触发源设为外部TRIG:SLOP POS               ; 上升沿触发
OUTP:STAT ON                ; 开启输出(等待触发)

3. 启用时间戳记录

部分电源支持时间戳功能(如Keysight N6700系列):

scpiSYST:TIME:RES               ; 复位内部时钟(可选)SYST:TIME:SYNC:EXT ON       ; 启用外部时间同步(如GPS或IEEE 1588)

三、同步误差记录方法

方法1:通过状态查询记录时间

  1. 启动序列前记录时间
    在触发信号发送前,通过软件记录当前时间(
    T0):

    python# Python示例(使用PyVISA)import timeT0 = time.time()  # 记录系统时间
  2. 触发序列并记录实际启动时间
    发送触发信号后,立即查询电源的序列启动状态:

    scpiTRIG:IMM                  ; 手动触发(或等待外部信号)SOUR:LIST:INDEx?          ; 查询当前序列点索引

    通过多次查询SOUR:LIST:INDEx?,检测序列从0跳变到1的时刻(T1)。

  3. 计算误差

    pythonT1 = time.time()  # 记录检测到启动的时刻sync_error = T1 - T0  # 同步误差(秒)

方法2:使用电源内置时间戳(推荐)

若电源支持事件时间戳(如SYST:EVENT命令):

scpiSYST:EVENT:LEV 1            ; 启用事件记录SYST:EVENT:STAT?           ; 查询事件日志
                          ; 返回格式示例:"2023-10-01 12:00:00.123,Sequence Started"

通过解析时间戳与外部信号的参考时间(如示波器记录的信号边沿时间)对比误差。


四、完整流程示例

1. 配置与触发

scpi; 配置序列SOUR:LIST:COUN 2
SOUR:LIST:VOLT 0, 12
SOUR:LIST:DWEL 1, 1

; 设置外部触发
TRIG:SOUR EXT
TRIG:SLOP POS
OUTP:STAT ON

; 复位时间戳(如果支持)
SYST:TIME:RES

2. 外部信号触发

  • 外部设备发送TTL脉冲到Trigger In接口。
  • 电源在上升沿启动序列。

3. 记录与计算误差

pythonimport timeimport pyvisarm = pyvisa.ResourceManager()power = rm.open_resource("TCPIP0::192.168.1.100::inst0::INSTR")# 记录触发信号发送时刻(外部参考)ext_trigger_time = time.time()# 查询电源序列启动时间(通过状态变化)while True:    index = int(power.query("SOUR:LIST:INDEx?"))    if index == 1:  # 序列已启动        actual_start_time = time.time()        breaksync_error = actual_start_time - ext_trigger_timeprint(f"同步误差: {sync_error * 1e3:.3f} ms")

五、关键注意事项

  1. 触发延迟
    • 外部信号到电源执行动作存在硬件延迟(通常<1ms)。可通过校准补偿。
  2. 时间戳精度
    • 若电源不支持高精度时间戳,建议用示波器同时捕捉触发信号和电源输出变化,手动测量误差。
  3. 多设备同步
    • 多台电源同步时,使用同一触发信号并配置主从模式:
      scpiMASTER: SYST:COMM:SYNC:ROLE MASTER; SYST:COMM:SYNC:OUTP ONSLAVE:  SYST:COMM:SYNC:ROLE SLAVE; SYST:COMM:SYNC:INP ON
  4. 日志记录
    • 将误差数据保存到文件:
      pythonwith open("sync_log.csv", "a") as f:    f.write(f"{ext_trigger_time},{actual_start_time},{sync_error}n")

六、扩展功能

  • 循环序列同步:通过SOUR:LIST:CYCL ON启用循环,并在每次循环开始时记录时间戳。
  • 误差阈值报警:若误差超过设定值(如5ms),触发SYST:ERR?或发送报警信号。

通过以上方法,可实现双向直流电源序列与外部信号的亚毫秒级同步,并量化同步精度。