使用Scanner读取Adc芯片数据与实际不符问题分析
更新时间: 2026/06/02
在Gitcode上查看源码

问题背景

  • 单板类型:NA;
  • 软件版本:NA;
  • 涉及功能:Scanner扫描读取硬件值,chip的read方式读取寄存器;
  • 触发条件:环境上安装Adc芯片并在sr文件中进行配置,通过不同的方法读取硬件信息。
  • 业务表现:预期Scanner读取到的电压值与硬件测量的电压值相符;实际Scanner读取到的电压值与硬件测量的电压值不同。

问题复现步骤

  1. 使用Chip下的read方法读取寄存器;
  2. 使用scanner读取硬件相同寄存器的值;

关键日志信息

  1. 代码配置 Adc代码配置如上图; Adc Chip代码配置如上图;
  2. 读值比对 在使用Chip下的read方法读取寄存器的数据与硬件测量的电压值相同为1040mv左右,如上图 使用scanner读取到的寄存器的电压值仅为795mv左右,两个读值方式读出来的硬件值不匹配;

定位过程

  1. Scanner配置是位读,用chip的位读(BitIO)方法尝试读取数值,结果与Scanner按位读取的电压值一致;
  2. 确认hwproxy的版本是否1.90.19以上,是的话用trace跟踪;
text
  具体跟踪操作方法:
  1、mdbctl,进入终端
  2、attach hwproxy,连接hwproxy
  3、lscmd看下有没有tracedebounce命令
  4、tracedebounce </Scanner obj> start,开始跟踪,看下防抖窗口内的值和每次读的值
  1. 使用tracedebounce可以看到原始读值是正确的,但是经过抖动处理后读值就变为798了;

  2. 查看Scanner的debounce配置为"Debounce":"#/MidAvg_Inlet";

    json
    "MidAvg_Inlet": {
      "WindowSize": 4,
      "DefaultValue": 20,
      "IsSigned": true
    },

问题原因

防抖配置里,配置了防抖值是有符号的,有符号的防抖只支持-256~255,计算一个字节以上的会导致非预期结果。具体参考CSR对象防抖动和精度配置介绍

解决方案

将防抖里的IsSigned改为false。修改完成后出包升级,按照问题复现过程再次执行,查看ADC电压值是否一致即可。