多年来,我们已经在许多产品中成功使用了ATmega48 / 88/168/328微控制器。现在,我们已经考虑从A和PA变体切换到新的PB变体(因为在新产品中我们将需要额外的引脚,计时器和UART,因为它变得更便宜,并且因为似乎旧的变体将不再使用),所以我们换了一个ATmega328PB的ATmega328A。断电后,它似乎经常出现混乱。这些问题从未在旧版本中出现过。
定期停电对于我们产品的用例而言是正常的。我们使用一个开关电源(像这样),将其设置为5V,并在ATmega的VCC上使用220µF的电容器,以使SRAM在几分钟内保持断电状态,以存储非任务状态的内部状态。至关重要,但可以通过在重新启动后立即使用来显着提高用户体验(这些状态经常变化足以使EEPROM不适用)。这一直有效。
但是,使用新的ATmega328PB,在电源中断后,芯片复位,而在MCUSR中没有找到复位条件,时钟似乎变得一团糟。
- 每个保险丝都设置了欠压检测器。我们尝试了所有可用的bodlevel,所有这些错误都发生了。
- 我们使用外部20 MHz,每个保险丝也正确设置。
- 我们尝试了3种不同的芯片,所以这不是一次焊接或其他硬件故障。
发生错误后,时钟通常设置为慢2.5倍,表明MCU由8 MHz内部振荡器提供时钟。但是,有时放慢速度约为6倍。这意味着更改时钟分频器不会是软件错误,因为我无法通过软件设置保险丝,并且时钟分频器无法将时钟除以2.5或6。
因此,我的第一个怀疑是新的“时钟故障检测”保险丝。但是,无论打开还是关闭,其行为都保持不变。
为了排除软件的特殊性,我从头开始编写了一个简单的测试程序,该程序除了从计时器中断中以100 Hz的频率切换输出外,不执行其他任何操作,并在每次重启后以LED指示激活了哪些复位条件(如从MCUSR读取)。其余的硬件也被删除,只有单片机和调节器在那里(指示器指示灯带有串联电阻)。
结果
大约有2/3的时间,没有发生任何有趣的事情。停电后,单片机将恢复工作,掉电复位和加电复位指示灯均亮起。
(在图像上,红色是切换的引脚,蓝色是VCC。在此图像上,清晰可见2.7 V的欠压。我对其他欠压设置进行了相同的测试,结果完全相同,所以我将省略那些图片)
大约1/3的时间,上述错误发生,而当电力又回来了,没有掉电复位,上电复位指标都亮了起来!输出是不同的,好像MCU在用奇怪的时钟滴答作响。它并不混乱,但是,它以相同的频率不断滴答作响。
有趣的是,在这种情况下,掉电检测器似乎是完全不活动的,因为在下一次电源中断后(有时恢复了正确的时钟,有时没有恢复正确的时钟),在掉电检测器之后,输出仍保持良好的切换。超出级别。在这种情况下,时钟有时会变快,而其他时候会变慢:
在这些测试中,我使用了16K CK / 14CK + 4.1 ms作为启动延迟(但是65 ms的延迟不能避免这些问题)。
这是放大的图片,您可以清楚地看到VCC在2 ms内在5 V下达到稳定状态:
在上图中,mcu正确启动。
有趣的是,如果没有,电源电压甚至更快地上升到稳定的5 V(似乎MCU的许多部分都没有上电,因此在启动期间消耗的电流更少)
以下是失败的开始的图像:
请注意,在电源电压稳定后超过85毫秒后,软件将开始运行,而不是需要10.5毫秒。用于启动延迟的保险丝仍然相同,为16K CK / 14CK + 4.1 ms。
还需要注意的是,在电源关闭后,VCC稳定在1.1至1.2伏左右(旧的ATmega328A变型下降至0.6-0.7伏左右)。它保持了几分钟。如果我等待足够长的时间(大约半小时或更长时间),则MCU总是可以正确启动!因此,看来问题在于周围有1.1伏特,根据数据表,这不能保证足以进行上电复位。但这足以进行掉电复位!
除这些情况外,掉电检测器工作正常。它在第一张图像上可见(达到bodlevel时输出信号停止,并且由于mcu的部分关闭,电压降变慢)。当我将VCC降低到略低于bodlevel并使其再次爬回时,我进行了测试,在这种情况下,mcu总是正确地重新启动,只有掉电的复位指示灯亮起。
我是否错过了明显的东西,或者ATmega328PB的掉电检测器是否存在严重的错误?
编辑:
有趣的是,以上问题仅在我在调节器之前中断电源时出现。如果我在调节器(或使用实验室电源)之后中断它,则永远不会发生问题。好像上升的电压形状引起了问题。但是,正如您从上一张图像中看到的那样,电压上升相当不错,并且很快就稳定下来。
编辑2
我用16 MHz而不是20 MHz进行了测试,但是确实发生了同样的问题。