“超频”AVR

电器工程 Arduino 微控制器 avr 时钟速度
2022-01-07 04:30:51

在电气特性部分下的 AVR 数据表中,您通常会找到这样的图表(此图表来自 ATMega328):

在此处输入图像描述

我见过似乎“有效”但在阴影信封之外运行的设计。具体来说,我见过 3.3V (Arduino) 设计使用外部 16MHz 晶振运行时钟。显然,这超出了规范。超出这个范围会产生什么实际的负面后果?

4个回答

如何让生活更有趣101:

  • 如果你不在乎

你的结果有时可能是错误的,
你的系统有时可能会崩溃,
你的生活可能更有趣,
你的 Segway 克隆只是偶尔会无缘无故地做面部植物,
那个......

然后一定要在制造商的规格之外运行零件。

你得到你不支付的东西。
如果你有一个 10 美元的头,买一个 10 美元的头盔。

  • 它可能经常起作用。
  • 它有时可能不起作用。
  • 有时它不起作用可能并不明显。
  • 分水岭通常可以奏效
  • 跳跃通常可能会到达。
  • 可以正确查找表。
  • ADC 值可能是正确的。

或不

在此处输入图像描述

在这种速度下,大多数处理器的工作方式是计算某个时钟周期所需的所有信号,在它们稳定时等待下一个时钟沿,锁存所有这些信号并计算下一个时钟周期所需的信号,在这些信号稳定时等待该边沿等。如果时钟边沿在必要信号稳定之前到达,则效果将是任何未稳定的信号都可能无法完全锁存。如果这发生在微控制器中,其影响可能是不可预测的——至少有两个原因:

  1. 在许多情况下,执行速度受限于处理器从中读取代码的闪存阵列的响应时间。如果处理器运行速度过快导致偶尔在此处或那里误读某个位,则很容易导致处理器执行与预期完全不同的代码。在许多程序中,即使是一次性的单位误读也会从根本上改变行为。试图对在这种情况下可能发生的事情做出任何预测是不切实际的。在某些情况下,最好的办法是“保护”程序的某些部分,以使错误执行的可能性不大。例如,一个人可能会一直保护 EEPROM,直到有人想写它,然后使用类似以下的代码:
    uint32_t eep_checksum、eep_addr、eep_data;
    
    #define EEPROM_WRITE(地址、数据、谓词)\
      eep_checksum = 0xC0DEFACE,eep_addr =(地址),eep_data =(数据),\
      eep_checksum += eep_addr + eep_data, ((谓词) || HARD_CRASH()), \
      eep_checksum += (0xCAFEBABE - C0DEFACE), eep_do_write()
    
    无效 eep_do_write(无效)
    {
      ENABLE_EEPROM_WRITE_HARDWARE();
      如果(eep_checksum != eep_addr + eep_data + 0xCAFEBABE)
      {
        DISABLE_EEPROM_WRITE_HARDWARE();
        硬碰撞();
      }
      DO_EEPROM_WRITE();
      DISABLE_EEPROM_WRITE_HARDWARE();
    }  
    
    除非在加载地址和数据之前执行“eep_checksum = 0xC0DEFACE”,否则 eeprom_write 例程不太可能尝试写入数据。执行之后,将检查谓词的有效性,然后将校验和调整为适当的值并调用 eeprom_store 例程。
  2. 除了执行错误代码带来的明显风险外,潜在随机行为的另一个来源是亚稳态。通常,在任何周期,每个触发器都会锁存高电平或低电平。但是,如果触发器的输入在时钟到达时发生变化,它可能会在任意持续时间内输出奇怪的东西,这些东西可能会以任何模式在高低之间任意翻转,直到下一个时钟周期;触发器下游的某些设备完全有可能将其视为“高”,而其他设备将其视为“低”。通常,处理器依赖于许多设备就他们将要做什么达成一致。如果在执行“递减和分支如果不相等”指令期间,一些电路认为应该采用分支,但其他电路不认为,

制造商指定处理器的操作参数,以便在这些参数内,处理器将正常工作。把东西推到那个信封之外​​可能会使处理器降低到只有 99.9999999 的可靠性。这听起来可能不算太邪恶,但试图诊断一个处理器每分钟左右出现一次任意错误(图 16MHz)并不好玩。

您的问题的简化答案:

在“安全速度区域”之外工作可能会导致您的系统工作不稳定。那是什么意思?计算结果错误、微控制器复位等。

如果你想这样做只是为了好玩,你应该看看这些页面/文章:

用液氮冷却超频 Arduino。20⇒65.3Mhz @-196°C/-320°F

ATmega328 超频 (30MHz)

尚未提及的一个考虑因素与在无效电压范围(3.3V 时为 16MHz)下以有效频率运行无关,而与在有效电压范围(5V 时为 24MHz)下以无效频率运行有关的考虑更多是散热问题。

每次芯片中的门打开或关闭时,它都会散热。栅极由 MOSFET 组成,在 ON 和 OFF 或 OFF 和 ON 期间就像一个可变电阻器。该电阻器当然会散热。它切换得越频繁,切换之间的时间就越短,热量从芯片中散发出来,并且您冒着热量积聚的风险。

因此,你跑得越快,就会产生越多的热量。这就是为什么 PC CPU 上有大风扇的原因——它们切换得如此之快,以至于无法足够快地将热量从芯片中排出,因此它们需要帮助。

选择芯片的最高额定速度以允许芯片在有效的工作条件下(即环境温度,例如通常最高 85°C 或 105°C)可靠地散发其热量积聚。超过该频率会导致芯片过热。

是的,如果您提供一些帮助(例如,散热器和风扇,并确保其周围有良好的气流),则可以比预期更快地运行芯片。但是,当然,在夏天温暖的一天,您可能会发现整个冬天都可以正常工作的设备突然开始做一些奇怪的事情。

要考虑的另一件事是转换率。时钟信号(以及其他信号)需要时间来上升或下降到所需的水平。如果芯片内部意味着时钟信号需要 15ns 才能从 LOW 上升到 HIGH,那么您尝试将其时钟设置为 HIGH 周期为 42ns (24MHz) 的频率,这样就只剩下 27ns 的有效时钟剩余时间。这只是 64% 的时钟实际上是时钟信号——其余的都是垃圾。IO 引脚也是如此。诸如 SPI 时钟输出之类的东西将受到 IO 引脚的转换速率的限制,因此,如果您超频您的芯片以获得更快的 SPI,您会发现事情并不总是按计划进行,因为您期望从时钟输出中获得漂亮的方波不再是方形了。