多年来,我们的许多产品都成功地使用了 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 读取)。其余的硬件也被移除了,只有 MCU 和调节器在那里(以及带有串联电阻的 LED 指示灯)。
结果
大约 2/3 的时间,没有任何有趣的事情发生。断电后,MCU恢复工作,掉电复位和上电复位指示灯都亮。
(在图像上,红色是切换引脚,蓝色是 VCC。在这张图像上,2.7 V 掉电清晰可见。我对其他掉电设置进行了相同的测试,结果完全相同,所以我会省略那些图片)
大约有 1/3 的时间会出现上述错误,当再次供电时,掉电复位和上电复位指示灯都不亮!输出不同,就好像单片机在用一个奇怪的时钟滴答作响。它并不混乱,但是,它一直以相同的频率滴答作响。
有趣的是,在这种情况下,掉电检测器似乎完全处于非活动状态,因为在下一次电源中断后(有时会恢复正确的时钟,有时不会恢复),可以清楚地看到在掉电后输出保持良好的切换。 out 级别已通过。在这种情况下,时钟有时会变快,有时会变慢:
在这些测试中,我使用 16K CK/14CK + 4.1 ms 作为启动延迟(但 65 ms 延迟并不能避免问题)。
这是放大的图片,您可以清楚地看到 VCC 在 2 ms 内达到 5 V 的稳定状态:
在上图中,MCU 正常启动。
有趣的是,当它没有时,电源电压甚至更快地达到稳定的 5 V(似乎 mcu 的许多部分没有通电,所以它在启动过程中消耗的电流更少)
下面是一个不成功的开始的图像:
请注意,软件在电源电压稳定后超过 85 ms 后开始运行,而不是其他情况下所需的 10.5 ms。启动延迟的熔断器仍然相同,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 进行了尝试,但发生了完全相同的问题。