You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派2W搭配ADS1015:复制读数后原对象值异常变化问询

问题排查与解决方案

核心原因分析

  • AnalogIn属性的动态特性:多数ADS1015的Python驱动(比如Adafruit_CircuitPython_ADS1x15)中,AnalogIn的value和voltage是动态计算属性——每次访问都会向ADS1015发起一次新采样。你看到的“复制后原对象值变化”,本质是两次不同采样的结果,和复制操作本身无关。
  • 打印操作的间接影响:添加打印后变幅减小,是因为打印引入了延迟,拉长了两次采样的时间间隔;而模拟信号本身存在小幅波动,间隔变长后波动差异自然缩小。如果之前代码中两次采样间隔极短,还可能触发ADC采样不稳定(比如转换速率设置不合理)。
  • 对象引用混淆:如果你的Reading类PS1属性直接引用了PS1_V对象而非复制其值,后续访问PS1时也会触发重新采样,看起来像是值变化,但这是引用导致的动态更新,不是复制后原对象改变。

具体解决方案

1. 存储静态采样值而非对象引用

不要直接赋值AnalogIn对象,而是提取瞬时值存入Reading类:

# 错误方式:直接引用对象
self.PS1 = PS1_V

# 正确方式:存储瞬时采样值
class Reading:
    def __init__(self):
        self.ps1_value = 0
        self.ps1_voltage = 0

# 采样时固定瞬时值
reading = Reading()
# 一次性获取值,避免多次采样
current_val = PS1_V.value
current_volt = PS1_V.voltage
reading.ps1_value = current_val
reading.ps1_voltage = current_volt

# 此时再访问PS1_V.value会得到新采样值,属于ADC正常行为

2. 固定采样时机与参数

如果需要稳定采样结果,手动控制ADC采样逻辑:

  • 调整ADS1015转换速率(比如设为250SPS,降低采样噪声)
  • 统一批量获取所有通道值,避免零散触发采样

示例代码(基于Adafruit驱动):

import board
import busio
from adafruit_ads1x15.ads1015 import ADS1015
from adafruit_ads1x15.analog_in import AnalogIn

# 初始化硬件
i2c = busio.I2C(board.SCL, board.SDA)
ads = ADS1015(i2c)
# 设置转换速率(可选,根据需求调整)
ads.data_rate = 250

PS1_V = AnalogIn(ads, ADS1015.P0)

class Reading:
    def __init__(self, value, voltage):
        self.value = value
        self.voltage = voltage

# 单次采样并返回静态Reading对象
def take_static_reading(analog_in):
    val = analog_in.value
    volt = analog_in.voltage
    return Reading(val, volt)

# 使用示例
ps1_reading = take_static_reading(PS1_V)
# ps1_reading的value和voltage为固定瞬时值,不会自动变化

3. 排查硬件稳定性

若采样波动超出预期,检查硬件问题:

  • 确保ADS1015的3.3V电源稳定,建议使用稳压模块
  • 在模拟输入引脚与地之间添加100nF陶瓷电容滤波
  • 检查I2C总线、模拟输入线的接线是否松动

关于PS1后续值的说明

只要你在Reading类中存储的是静态数值(而非AnalogIn对象引用),PS1的值就不会自动变化,除非你主动更新它。如果是存储对象引用,每次访问都会触发新采样,这是驱动设计特性而非异常。

内容的提问来源于stack exchange,提问作者Erv

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 09:33:40