ATmega 的新“PB”变体在掉电检测器中是否存在错误?

电器工程 大气压 欠压
2022-02-02 16:36:52

多年来,我们的许多产品都成功地使用了 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 进行了尝试,但发生了完全相同的问题。

2个回答

我认为这不是掉电检测器的错误,而是您如何使用该芯片。

正如您自己所说,如果只是短暂断开并连接电源,则不会达到上电复位阈值 1.1 V,因此不会出现 POR。

掉电检测器在这里也无济于事。您正在使用 20 MHz 的 AVR,这要求电源电压为 4.5 V 或更高,或者您违反了规范。并且 BOD 不保证它会在 4.5 V 时跳闸,它通常小于 4.3 V。所以即使在 BOD 触发之前,也不能保证 AVR 最终处于什么状态,但 BOD 应该触发,除非它可能由于您的 20 MHz 时钟而无法工作。当电压再次开始上升时,BOD 在电源电压再次处于安全的 4.5 V 水平之前停用。如果触发正确。然后应将启动延迟时间设置为足够高,以使电压在内部复位释放之前从 BOD 停用电平上升到 4.5 V。

但这一切都可能失败,因为它只需要至少 4.5 V 即可在 20 MHz 下运行。AVR 数据表确实提到,如果内部复位系统不合适,则使用外部复位芯片,在这种情况下,在电压降至 4.5 V 之前复位 AVR 似乎可以解决您的问题。

很抱歉迟到了 :) 但我最近遇到了类似的问题。有一个用 atmega328p 代替 atmega328p 的电路板布局,并使用带有集成 15pF 电容的村田 16MHz 陶瓷谐振器。在我的应用中,电压缓慢上升(500mV / s)。旧的 atmega328p 电路板处理得很好(2V7 的 BODLEVEL),但是 328pb 的新布局却不行!引脚功能随机交换,随机代码执行导致闪存损坏(可能命中引导加载程序部分,即使默认情况下它没有启动等)。简而言之,发生了很多时髦的事情。

我的“解决方案”——让我们称之为临时解决方法——经过 2 1/2 天的大脑融化后,设置 CKDIV8 保险丝位(将 16Mhz 分机时钟除以预分频器 8)。现在有了 2MHz,328pb 即使在电源电压异常缓慢上升(~250mV/s)的情况下也能完美启动。

现在的诀窍是通过内部 ADC 电压参考连续读取电源电压,当电压稳定在 3V 以上时,然后升压到完整的 16MHz 时钟(预分频器 1)。

CLKPR = (1 << CLKPCE);
CLKPR = 0; 

抱歉,我没有时间进行更多的定量测量,但目前,修复对几个板子和许多启动事件都很顺利。

我无法回答的是为什么会发生这种情况。使用 16MHz 时钟如此缓慢地提高电源电压显然不符合规范!电路板之间有很多微小的布局变化,所以它可能只是运气,它在早期版本中工作。我没有明确的迹象表明这是一个 328pb 的错误或某事。

但是,我会对您如何同时解决问题感兴趣。

最好的,马蒂亚斯