使用Scanner读取Adc芯片数据与实际不符问题分析
更新时间: 2026/06/02
在Gitcode上查看源码问题背景
- 单板类型:NA;
- 软件版本:NA;
- 涉及功能:Scanner扫描读取硬件值,chip的read方式读取寄存器;
- 触发条件:环境上安装Adc芯片并在sr文件中进行配置,通过不同的方法读取硬件信息。
- 业务表现:预期Scanner读取到的电压值与硬件测量的电压值相符;实际Scanner读取到的电压值与硬件测量的电压值不同。
问题复现步骤
- 使用Chip下的read方法读取寄存器;
- 使用scanner读取硬件相同寄存器的值;
关键日志信息
- 代码配置 Adc代码配置如上图; Adc Chip代码配置如上图;
- 读值比对 在使用Chip下的read方法读取寄存器的数据与硬件测量的电压值相同为1040mv左右,如上图 使用scanner读取到的寄存器的电压值仅为795mv左右,两个读值方式读出来的硬件值不匹配;
定位过程
- Scanner配置是位读,用chip的位读(BitIO)方法尝试读取数值,结果与Scanner按位读取的电压值一致;
- 确认hwproxy的版本是否1.90.19以上,是的话用trace跟踪;
text
具体跟踪操作方法:
1、mdbctl,进入终端
2、attach hwproxy,连接hwproxy
3、lscmd看下有没有tracedebounce命令
4、tracedebounce </Scanner obj> start,开始跟踪,看下防抖窗口内的值和每次读的值使用tracedebounce可以看到原始读值是正确的,但是经过抖动处理后读值就变为798了;
查看Scanner的debounce配置为"Debounce":"#/MidAvg_Inlet";
json"MidAvg_Inlet": { "WindowSize": 4, "DefaultValue": 20, "IsSigned": true },
问题原因
防抖配置里,配置了防抖值是有符号的,有符号的防抖只支持-256~255,计算一个字节以上的会导致非预期结果。具体参考CSR对象防抖动和精度配置介绍。
解决方案
将防抖里的IsSigned改为false。修改完成后出包升级,按照问题复现过程再次执行,查看ADC电压值是否一致即可。