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

答案内容由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芯片数据与实际不符