如何用Python配置安捷伦数据记录仪读取拉线式位移传感器电阻值
问题描述
我已将拉线式位移传感器(string pots)连接到安捷伦数据记录仪,尝试读取拉线位置移动时的电阻变化。直接从安捷伦显示屏读取位移时,能看到欧姆值的线性变化;但通过以下Python脚本读取时,结果变为电压信号,呈现上升后归零的状态(看似显示相对位移)。请问如何通过脚本获取欧姆单位的输出?
用户提供的代码:
import numpy as np import pyvisa as visa import time from datetime import datetime, date import pandas as pd import matplotlib.pyplot as plt import time import threading import signal instrument_address = 'USB0::0x0957::0x0507::MY50000230::0::INSTR' #Data logger address
def instrument(instrument_address: str, instrument_access_protocol_name: str) -> object() : rm = visa.ResourceManager() instrument_access_protocol_name = rm.open_resource(instrument_address) instrument_access_protocol_name.write('*RST') instrument_access_protocol_name.write('*CLS') instrument_access_protocol_name.write(':DISPlay:STATe %d' % (0)) instrument_access_protocol_name.timeout = 10000 return instrument_access_protocol_name SP_ch = '3001:3002' #channels to read SP_alfa = '1' SP_resistance = '1' instrument_name = 'my_instrument' my_instrument = instrument(instrument_address, instrument_name) #channel list defined def Scan_list(my_instrument: str, Channel_list: list): Channel_list = str(Channel_list) Channel_list = Channel_list.replace('[','').replace(']','').replace('','') separator = '' Scan_Channel_list = separator.join(['@',Channel_list]) my_instrument.write(':ROUTe:SCAN (%s)' % (Scan_Channel_list)) print('\n\nSetting up automated scan') print(':ROUTe:SCAN (%s)' % (Scan_Channel_list)) my_instrument.query_ascii_values('READ?') class SP: def __init__(self, instrument: str, SP_alfa: str, SP_resistance: str, SP_ch: str): self.instrument = instrument self.SP_alfa = SP_alfa self.SP_ch ='' self.SP_ch = self.SP_ch.join(['@', SP_ch]) self.SP_resistance = SP_resistance self.configureSP() self.senseSP() def configureSP(self): self.instrument.write('CONF:RES %s,%s' % (self.SP_ch, self.SP_resistance)) print('\nString Pot configuration') print('CONF:RES %s,%s' % (self.SP_ch, self.SP_resistance)) def senseSP(self): self.instrument.write(':SENSe:RESistance:OCOMpensated %d,%s' % (1, self.SP_ch)) self.instrument.write(':SENSe:RESistance:RANGe %G,%s' % (10000.0, self.SP_ch)) self.instrument.write(':SENSe:RESistance:RESolution %s,%s' % ('DEFault', self.SP_ch)) self.instrument.write(':SENSe:RESistance:ZERO:AUTO %s,%s' % ('ON', self.SP_ch))
解决方案
问题核心原因有两个:
- 自动归零开启导致相对测量:代码中启用了
:SENSe:RESistance:ZERO:AUTO ON,会把初始电阻值设为零点,后续测量值都是相对变化量,而非绝对欧姆值。 - 配置参数错误+读取逻辑缺失:
CONF:RES命令的量程参数设置错误,且Scan_list函数没有返回读取到的测量值。
具体修改步骤:
- 关闭自动归零,启用绝对测量
修改SP类的senseSP方法,将自动归零设为OFF:
def senseSP(self): self.instrument.write(':SENSe:RESistance:OCOMpensated %d,%s' % (1, self.SP_ch)) self.instrument.write(':SENSe:RESistance:RANGe %G,%s' % (10000.0, self.SP_ch)) self.instrument.write(':SENSe:RESistance:RESolution %s,%s' % ('DEFault', self.SP_ch)) # 关闭自动归零,获取绝对电阻值 self.instrument.write(':SENSe:RESistance:ZERO:AUTO %s,%s' % ('OFF', self.SP_ch))
- 修正电阻量程配置参数
CONF:RES命令的第二个参数是电阻量程,需和后续RANGE设置保持一致:
SP_resistance = '10000' # 对应10kΩ量程,与senseSP中的RANGE参数匹配
- 完善读取逻辑,返回欧姆值
修改Scan_list函数,使其返回读取到的电阻测量值:
def Scan_list(my_instrument, Channel_list): # 处理通道列表格式 if isinstance(Channel_list, list): Channel_list_str = ','.join(Channel_list) else: Channel_list_str = Channel_list Scan_Channel_list = f'@{Channel_list_str}' my_instrument.write(f':ROUTe:SCAN ({Scan_Channel_list})') print('\n\nSetting up automated scan') print(f':ROUTe:SCAN ({Scan_Channel_list})') # 读取并返回欧姆单位的测量值 resistance_values = my_instrument.query_ascii_values('READ?') return resistance_values
- 添加测量读取逻辑
在实例化SP类后,调用Scan_list获取并打印电阻值:
# 实例化并配置拉线传感器 sp_sensor = SP(my_instrument, SP_alfa, SP_resistance, SP_ch) # 读取通道3001和3002的电阻值 resistance_data = Scan_list(my_instrument, ['3001', '3002']) print(f"读取到的电阻值(欧姆):{resistance_data}")
验证说明
修改后,脚本会读取传感器的绝对电阻值,与显示屏上的线性欧姆变化一致,不会再出现上升后归零的相对位移现象。
内容的提问来源于stack exchange,提问作者Antonela Čolić
相关产品推荐
相关产品推荐

