这是一个创建于 2406 天前的主题,其中的信息可能已经有所发展或是发生改变。
一个小嵌入式项目,因为项目原来的芯片停产了,这边换了 MCU,做移植。
原来的芯片没有 ADC,现在新的 MCU 有 ADC 了,就把外挂的 ADC 芯片给删了,用新 MCU,把 ADC 部分重写一遍。
调试进入到 ADC 部分时,发现 ADC 的返回值不对,具体表现是电池电压通道读到的值在一个范围之内乱跳,因为数据格式化与比较的部分还没有弄,把 ADC 的返回值转成字符串之后写了个 debug 函数插入在 ADC 函数里,每次采样的结束的时候用串口监视 ADC 的值(不方便进行片上调试的 MCU 进行 DEBUG 真的蛮讨嫌的)。
发现 ADC 的值无法反映电压,并且在一个区间内乱跳
以下是怀疑造成这个 BUG 的原因,按调试顺序排序
1、ADC 相关寄存器配置错误
检查了相关寄存器配置代码,高、低八位读取部分代码无误。
2、配置 EEPROM 等其他外设时由于源代码没有作封装导致移植时在其他外设进行设置和操作时动到了 ADC 相关的配置寄存器
检查了所有外设寄存器的配置部分代码
3、怀疑该单片机的 ADC 口损坏
在一块空板子上焊上相关元件以及串口通道,重写了 ADC 和串口部分的配置函数,只进行 ADC 采样
ADC 返回值稳定且正常。
4、认为这可能是其他函数造成的未知影响
注释大法。将可能的 while 循环和中断中的其他函数分别注释掉,检测与之无关之后恢复,注释下一段代码。
ADC 返回值依然在乱跳。
5、认为可能是循环中多个函数共同造成影响使得 ADC 无法正常工作,或是此前的配置代码中有隐藏的错误没检查出来
将 ADC 获取函数从 while 循环中拿出来单独写一个 while 循环获取 ADC 的值(与之前在空板上调试时的条件相同,但是加载了其他外设的初始化代码)
ADC 返回值正常。
6、终于发现了问题,这款芯片 ADC 需要“连续”采样,数次采样之后才能取得稳定的返回值,一小段时间没有进行采样,返回值会出现偏差。
问题解决。
这个 BUG 的花了几天时间去调试,虽然中间穿插了几件其他的事情。
反思:
1、对返回值不敏感,在串口看到的 ADC 的返回值计算后对应的电压非常小,应该早点想到无效数据这个点,而不是在质疑自己此前写的寄存器配置中打转。
2、接上条,调试时对数据得过且过,没有用心思考数据对应的含义,以及数据格式化问题。
3、打电话问 MCU 厂商的技术支持时,厂商提到了“切换 ADC 通道时应舍弃第一次数据”,对这个信息的应对方式为判断通道是否变换了,如果变换了的话获取两次 ADC,取后面那次的 ADC 值。之后没有再怀疑过这个问题
4、遗留技术债。编写程序时没有封装意识,导致底层和逻辑层的代码混在一起,调试时不方便调试。
5、经验不足。
5 条回复 • 2018-04-05 10:06:53 +08:00
|
|
1
ghostxdy 2018-04-02 18:19:19 +08:00 via Android 1
我以为我进错论坛了
|
|
|
2
234235 2018-04-02 18:30:28 +08:00 1
恩...EEPROM STC ?
|
|
|
3
Narwhal 2018-04-02 18:37:56 +08:00
|
|
|
4
vsyf 2018-04-02 19:20:02 +08:00
我以前好像也用过这样的芯片,要自己取采样的平均值。
|