【adc配置】两个板子adc配置相同,命令获取读数不正常

我手上有两个板子,板子1和板子2

我在板子1上进行adc测试:

万用表测电压为 0.905v 软件获取的为895

~ # busctl --address=unix:abstract=/tmp/dbus-WaRKgV2RBe introspect bmc.kepler.hwproxy /bmc/kepler/Scanner/Scanner_Adc_0_01

NAME TYPE SIGNATURE RESULT/VALUE FLAGS

bmc.kepler.Object.Properties interface - - -

.Value property t 895 emits-change

将其接地后 读数为5

~ # busctl --address=unix:abstract=/tmp/dbus-WaRKgV2RBe introspect bmc.kepler.hwproxy /bmc/kepler/Scanner/Scanner_Adc_2_01

NAME TYPE SIGNATURE RESULT/VALUE FLAGS

.Value property t 5 emits-change

以上情况基本正常。

但是我同样配置去板子2上进行测试。

接地的通道读数为141

busctl --address=unix:abstract=/tmp/dbus-WaRKgV2RBe introspect bmc.kepler.hwproxy /bmc/kepler/Scanner/Scanner_Adc_9_01

NAME TYPE SIGNATURE RESULT/VALUE FLAGS

.Value property t 141 emits-change

root.sr配置

    "Objects": {
        "Adc_1": {
            "ScanRate": 32768,
            "VoltRefSrc": 1,
            "VoltRefVal": 1200
        },
        "Chip_Adc_1": {
            "Address": 0,
            "AddrWidth": 4,
            "OffsetWidth": 4
        },
        "Scanner_Adc_9": {              
            "Chip": "#/Chip_Adc_1",     
            "Offset": 9,                
            "Size": 1,                  
            "Period": 1000              
        },
        "Scanner_Adc_0": {
            "Chip": "#/Chip_Adc_1",
            "Offset": 0,
            "Size": 1,
            "Period": 1000
        },

读取adc0获取的读数为1011 万用表直接测量是1.007v

但是读取adc1的时候读数为1031 万用表直接测量的是0.84v

问题1,我在板子2上的adc2读数不正确是否软件上的问题? 因为同样的配置在板子1均正常,板子2不正常。

问题2,板子2中adc9的值也偏高,但是原理图直接接地,此处是否也有问题?

问题3,在root.sr中"AddrWidth": 4,和"Scanner_Adc_0"的"Size": 4,字段需要对应上吗?

  "Chip_Adc_0": {
            "Address": 0,
            "AddrWidth": 4,
            "OffsetWidth": 4
        },
        "Scanner_Adc_0": {
            "Chip": "#/Chip_Adc_0",
            "Offset": 0,
            "Size": 4,
            "Period": 1000
        },

问题4,为什么我的busctl命令,需要添加 --address=unix:abstract=/tmp/dbus-WaRKgV2RBe

如果不添加,命令无法运行,是否是因为这个导致我的读数与实际有所偏差?

opt/bmc/sr # 
/opt/bmc/sr # systemctl status dbus
● dbus.service - D-Bus System Message Bus
     Loaded: loaded (/lib/systemd/system/dbus.service; enabled; vendor preset: enabled)
     Active: active (running) since Thu 1970-01-01 00:00:21 CGP; 4h 59min ago
TriggeredBy: ● dbus.socket
       Docs: man:dbus-daemon(1)
    Process: 2198 ExecStartPost=/opt/bmc/rundbus.sh (code=exited, status=0/SUCCESS)
   Main PID: 2176 (dbus-daemon)
      Tasks: 2 (limit: 10414)
     Memory: 3.4M
     CGroup: /system.slice/dbus.service
             ├─ 2176 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
             └─ 2216 /usr/bin/dbus-daemon --syslog --fork --print-pid 4 --print-address 6 --config-file /opt/bmc/dbus.config

Jan 01 00:00:20 localhost systemd[1]: Starting D-Bus System Message Bus...
Jan 01 00:00:20 localhost dbus-daemon[2176]: dbus[2176]: Unknown username "systemd-timesync" in message bus configuration file
Jan 01 00:00:20 localhost dbus-daemon[2176]: dbus[2176]: Unknown username "systemd-network" in message bus configuration file
Jan 01 00:00:20 localhost dbus-daemon[2176]: dbus[2176]: Unknown username "systemd-resolve" in message bus configuration file
Jan 01 00:00:21 localhost systemd[1]: Started D-Bus System Message Bus.
Hint: Some lines were ellipsized, use -l to show in full.
/opt/bmc/sr # 
/opt/bmc/sr # echo $XDG_RUNTIME_DIR/bus
/bus

答案内容由AI生成,仅供参考:

ADC配置问题分析与解答

针对您提出的关于两块板子ADC配置与读数异常的问题,我将结合上下文中的知识图谱和文档信息进行逐一分析。

问题1:板子2上的ADC读数是否为软件问题?

结论:不完全是软件问题,更可能是硬件或配置不一致导致的系统级问题。

虽然您在两块板子上应用了相同的root.sr配置,但以下因素可能导致板子2的读数异常:

  1. VoltRefVal参考电压值可能不匹配硬件
    您当前配置为:

    "Adc_1": {
        "VoltRefSrc": 1,          // 使用内部参考电压
        "VoltRefVal": 1200        // 声称内部参考为1.2V
    }
    

    如果板子2的实际ADC芯片内部参考电压并非精确的1.2V(例如为1.1V或1.3V),会导致所有通道的换算结果整体偏移。这种硬件差异在批量板卡中是常见的。

  2. ADC增益或偏移误差(Offset/Gain Error)
    不同ADC芯片存在个体差异,即使配置相同,也可能存在固有的零点偏移(Offset)增益误差(Gain Error),这会导致读数整体偏高或偏低。接地读数为141(非0)即可佐证存在显著偏移。

  3. 硬件通道设计差异
    即使原理图相同,实际PCB布线、滤波电路、电源噪声等硬件因素会直接影响ADC输入信号质量,从而导致读数偏差。


问题2:板子2中ADC9接地值为141是否正常?

结论:不正常,明确存在ADC系统偏移或硬件问题。

  • 理论上,当ADC输入通道直接接地(0V) 时,读回的原始ADC值应为 0 或非常接近0(如1-3个LSB)
  • 您测得的值为 141,这表明系统存在显著的零点偏移(Offset Error)
  • 可能原因:
    • ADC芯片本身的偏移误差过大。
    • 参考电压(VoltRefVal)配置与实际不符,导致整个量程换算基准错误。
    • 软件未进行校准补偿。
    • 接地不良或存在微弱干扰。

:white_check_mark: 建议: 应检查该通道的实际接地是否可靠,并使用busctl get命令读取原始ADC码值,确认是否真为141。若属实,则必须进行软件校准或检查硬件设计。


问题3:“AddrWidth” 和 Scanner 的 “Size” 是否需要对应?

结论:否,AddrWidthSize 两个字段含义不同,不需要对应。

字段 所属对象 含义 是否需一致
AddrWidth Chip_Adc_xxx 芯片级寄存器地址的宽度(bit数),决定访问寄存器时地址字段的长度。例如 4 表示用4位寻址寄存器。 :cross_mark: 无需与Size对应
OffsetWidth Chip_Adc_xxx 通道索引(Offset) 的宽度(bit数),决定了ADC有几路通道(如4位 = 16路)。 :cross_mark: 无需与Size对应
Size Scanner_Adc_xxx 每次读取的数据字节数(1、2、4等),用于解析从ADC读回的原始数据长度。 :white_check_mark: 需与ADC硬件输出格式匹配

:pushpin: 总结:

  • AddrWidthOffsetWidth 描述的是 “如何访问芯片”
  • Size 描述的是 “读回来的数据有多长”
  • 两者功能不同,无直接对应关系,但都必须根据实际ADC芯片手册正确配置。

问题4:为何busctl需指定--address=...?是否影响读数?

结论:不影响读数准确性,但涉及D-Bus通信机制。

为什么需要指定--address参数?

从您的systemctl status dbus输出可以看到:

Main PID: 2176 (dbus-daemon)
└─ 2216 /usr/bin/dbus-daemon ... --config-file /opt/bmc/dbus.config

这表明系统使用了自定义的D-Bus配置文件/opt/bmc/dbus.config),并未使用标准的系统总线(通常是unix:path=/var/run/dbus/system_bus_socket)。

  • --address=unix:abstract=/tmp/dbus-WaRKgV2RBe 是手动指定连接到一个抽象命名空间(abstract namespace)中的Unix域套接字
  • 使用 echo $XDG_RUNTIME_DIR/bus 得到 /bus,说明标准环境变量未指向正确地址。

:light_bulb: 原因: 这种配置常见于嵌入式BMC系统,为了隔离或定制化通信,会启动一个私有的D-Bus实例,而不是使用系统的默认总线。

是否影响读数?

  • 不影响。 busctl只是读取已存在的属性值.Value),这个值是由hwproxy服务通过底层驱动从ADC硬件读取并处理后写入D-Bus的。
  • 无论通过哪个D-Bus地址访问,只要连接成功,读取的是同一份数据。
  • 因此,使用--address指定正确路径是访问的前提,但不改变数据本身。

总结与建议

问题 结论 建议
1. 读数不一致 硬件或参考电压不一致导致,非纯软件问题 校准参考电压,检查硬件一致性
2. 接地值偏高(141) 存在显著零点偏移 检查接地,进行软件Offset补偿
3. AddrWidth vs Size 含义不同,无需对应 按芯片手册分别正确配置
4. busctl --address 访问私有D-Bus总线所需,不影响读数 正常现象,确保连接正确

推荐解决步骤:

  1. 统一并验证 VoltRefVal
    确认板子2的ADC实际参考电压,若非1.2V,应修改VoltRefVal为实测值。

  2. 执行Offset校准
    测量所有通道接地时的ADC值,取平均作为Offset,在后续读数中减去该值。

  3. 使用 busctl get 验证原始值

    busctl --address=unix:abstract=/tmp/dbus-WaRKgV2RBe get-property bmc.kepler.hwproxy /bmc/kepler/Scanner/Scanner_Adc_9_01 Value
    

    确认原始ADC码值。

  4. 检查硬件一致性
    对比两块板子的ADC芯片型号、外围电路、电源噪声等。

  5. 考虑使用BMC Studio辅助配置
    如知识库中张雨博建议,使用BMC Studio可减少手动配置错误。

相关链接:

  1. 配置Adc bus时候的问题
  2. ADC配置问题
  3. Adc配置
  4. 使用Scanner读取Adc芯片数据与实际不符

问题1,我在板子2上的adc2读数不正确是否软件上的问题? 因为同样的配置在板子1均正常,板子2不正常。
可以通过tracechip命令追踪下器件读写的数据看看。

问题2,板子2中adc9的值也偏高,但是原理图直接接地,此处是否也有问题?
硬件配置我不太清楚。

问题3,在root.sr中"AddrWidth": 4,和"Scanner_Adc_0"的"Size": 4,字段需要对应上吗?
Scanner的size是指读取的字节数,和地址位宽没有关系。

问题4,为什么我的busctl命令,需要添加 --address=unix:abstract=/tmp/dbus-WaRKgV2RBe
busctl需要指定用户总线还是系统总线,一般是用–user指定,加了后就可以不添加–address=unix:abstract=/tmp/dbus-WaRKgV2RBe。

如还有问题请尽快反馈,若问题解决请标记解决方案。