昨天,我在一个“优秀”研发工程师的苦——可能又是堆栈惹的祸里面说,设计的仪表碰到了莫名的MCU复位问题,昨天测试了整整大半天,结果还是没有确诊,内心很是苦恼,没办法,只能暂且放过它(实际上是放过我自己)。
我之所以写这方面的心得,一方面是记录一下心得,日后备用;另一方面也是想让非研发人员能够进一步了解研发的过程,满足一下各位的好奇心。其实,很多时候我们研发中寻找/分析/解决问题的整个过程,对于一般日常生活的处理也是有不少借鉴意义的。
接下来我就描述一下昨天没有解决的这个问题,今天是如何解决的。
今天的关键点是这幅图:
环境描述:
昨天是元旦过后第一天上班,公司整整空了4天,暖气怎么打室温都上不来,只有10℃,内心冰冷加上外部低温,魔都的冬季魔法攻击让我像一条快要冻僵的蛇,生无可恋。
我早早地下班回家取暖,心中郁闷。
今天早上开始忙别的项目调试,一直到下午才忙完。因为昨天室温太低,我京东买了个取暖器,早上就到了,所以一整天室温在20℃以上,人还是挺舒服。
过程表现:
终于忙完了,我瘫坐在椅子上,无意中瞟到了昨天莫名复位的meter。我随手拿起来,按了开机键,奇迹发生了——昨天几百次的测试都没出现的状况,竟然出现了!!!
精神一振,我坐直了身体,连续开关了几次,几乎次次都复位!!!
这简直就是上天赐予我的礼物,我立即连上仿真器,打开PC调试软件,想看看到底是什么原因导致的复位。
可是,就在我信心满满debug要把虫子捉出来的时候,却再也没有出现过复位现象。
“TNND”,我心里暗骂一声,想,莫不是因为我没有给克劳德·艾尔伍德·香农烧纸拜会过,上天才会这样对我?
我拔下仿真器,重新开机测试,结果meter又复位了!!
找到规律:
这似乎有了规律,我反复插拔仿真器进行测试,结果发现:
也就是说,只要硬件上连接仿真器,即使PC不运行调试程序,meter也不会复位。
只要有规律,事情就好办。仿真器能治病啊!昨天已经排除了堆栈问题,因此,目前看来像是硬件问题而非软件问题。
确诊问题:
仿真器和MCU有4个连接引脚:
为了确诊是硬件问题,需要把这4个引脚中唯一一个有可能和软件有关的引脚BKGD排除在外,我将BKGD这根脚掰弯,只让仿真器连接VCC,GND,RST3根引脚,发现表现是一样的。
这就确诊了,100%是硬件问题。
仿真器的VCC同时也给mcu供电了,或者说,仿真器vcc引脚内部的电容同时也起到了滤波(蓄水池)的作用,因此接仿真器的时候,vcc不怎么下跌。
硬件问题相对比较好办,因为它就在那里,一般用示波器就能解决问题。
我拔掉仿真器,在开机复位时刻测量RST引脚波形,如下:
再量一下VCC波形,其形状和RST引脚类似,同样有2根下跌尖峰。而且VCC下跌的时候,最低电压跌到了1.8V以下。
这个就非常明确了,是因为开机的时候,VCC电源下跌,跌到了1.8V以下,导致了MCU复位。
寻找病因:
接下来,就是要找找电压下跌的原因了。
meter使用4节电池供电,几乎所有的元件工作电压是3.3V,因此使用一颗CMOS VOLTAGE REGULATOR U6来获得3.3V电压,具体线路如下:
前置滤波电容100uF,后置滤波电容20uF,这样的应用问题不大。
难道是U6供电能力不足而导致输出电压下跌?查一下U6的datasheet,参数如下:
输出能力大于50mA,而meter实际功耗如下:
- 蓝牙模块耗电:21mA左右;
- 背光耗电:10mA;
- 测量模块:<5mA, 可以看出,耗电远小于50mA,所以供电能力是没有问题的。
而且,背光的电源是直接连接的Vbat,不是U6输出的3.3V,和这个下跌关系不大。
蓝牙供电线路开关如下:
可以看出,为了避免三极管Q10导通的瞬间对C14进行瞬间大电流充电,还使用了电感L2进行滤波,防止导通瞬间电流过大而影响U6输出电流下跌。
这在当初设计的时候都是充分考虑过的。
实际上,一般使用三极管/MOS管控制较大功率模块的时候,应该使用软启动来驱动三极管/MOS,像下图这样的驱动方式:
也就是让被控电压缓慢上升,以避免瞬间大电流。
只是蓝牙模块也包含一个MCU,上电时间过长的话,容易引发复位不完全的问题,因此在这里并没有使用软件启动的方式。
这样看来,单纯的从硬件分析似乎走入了死胡同。
我又重新回到软件部分来考虑潜在风险,仔细看了几遍以后,发现有一个地方可以改进:
我的设计是按键开机以后,有一个void module_init(void)函数,所有的模块初始化都在这里进行,部分代码如下:
也就是说,2个耗电较大的模块背光和蓝牙模块,几乎同时开始供电,消耗电流大约在30mA以上。
虽说背光是直接由Vbat供电,但是瞬间打开也会引起电池电压下跌,蓝牙模块的瞬间上电,也会引起U6 LDO的瞬间输出下跌,2个因素叠加,就有可能引发足以让MCU复位的电压。
为了确认问题,我修改了程序,蓝牙模块始终不上电,再开关机进行测试,发现再也没有出现过复位的情况。
这应该是100%确诊问题了。
解决方法:
最终我把蓝牙模块的上电初始化放在背光打开2秒以后,这样错开了瞬间大电流同时发生的情况,就再也没有出现过meter复位的情况了。
又解决了一个问题,作为产品的亲爹我还是很开心的。乐啊!!!!
这是不是说明作为一个工程师,勉强还称得上“优秀”二字啊……
至于为什么昨天测试了几百遍,都没有出现问题,而今天几乎次次都能出问题,各位有兴趣的话也可以考虑一下,是有鬼出没吗?是有什么不可抗力吗?是灵异现象吗?
下次有机会说说。
这就是一个研发工程师的日常工作状态,希望大家看了以后,能够有所启发,最重要的,是对身边的工程师好一点,再好一点,哈哈~~
参考文献:Seiko Instruments Inc. S801XX datasheet
希望喜欢我文字的人,去看看这个吧,说说对我的看法,请我吃星星
,谢谢啦~
我的 @ReviewMe 凭证留言板!
Posted using Partiko iOS
This page is synchronized from the post: 一个“优秀”研发工程师的乐——原来是电源惹的祸