如何在ATMega328P上配置未使用的I / O引脚以实现最低功耗?


15

我试图在我创建的Arduino板上尽可能降低功耗。未使用的输入引脚应如何配置?已经有一些答案(在这里在这里),但是我正在寻求ATMega328P的特定功能。

  1. 将引脚设置为输入,将引脚驱动为高电平以进行内部上拉
  2. 将引脚设置为输入,将引脚驱动为低电平
  3. 将引脚设置为输入,外部上拉
  4. 将引脚设置为输入,外部下拉
  5. 将引脚设置为低输出
  6. 将引脚设置为高输出
  7. 将引脚设置为输出低电平,外部下拉

Answers:


12

浏览数据表后,我发现了这一点:

14.2.6未连接的引脚

如果未使用某些引脚,建议确保这些引脚具有定义的电平。即使如上所述,大多数数字输入在深度睡眠模式下都被禁用,但应避免使用浮动输入,以减少启用了数字输入的所有其他模式(复位,活动模式和空闲模式)下的电流消耗。

确保定义的未使用引脚电平的最简单方法是启用内部上拉。在这种情况下,复位期间上拉将被禁用。如果重设期间的低功耗很重要,建议使用外部上拉或下拉电路。不建议将未使用的引脚直接连接到VCC或GND,因为如果该引脚意外配置为输出,可能会导致电流过大。

关于评论/问题的更新:

根据表14-1,仅当满足以下条件时,上拉电阻才会激活:

  1. 该引脚设置为输入(DDxn位为逻辑低电平)
  2. PORTxn设置为逻辑高电平
  3. PUD为逻辑低

要使大量电流流过上拉电阻,唯一的方法就是引脚上拉使能时引脚处于低电平。这意味着Atmel严重混乱(不太可能),或者将引脚配置为输入并启用了上拉功能,并且该引脚以某种方式接地。

本节14.2.5讨论数字输入使能和睡眠模式。总而言之,除非引脚配置为外部中断,否则数字输入在施密特触发器的输入处接地,以防止在休眠模式下产生浮动电平。我无法确定在睡眠模式下是否禁用了数字输出。根据数字14-2,它看起来好像没有被禁用,但是如果被禁用,我也不会感到惊讶。最好的选择是使用内部或外部上拉电阻。


谢谢,您认为就功耗而言,这比设置输出更好吗?内部上拉流过电流吗?该设备将在大多数时间内处于掉电睡眠模式。
geometrikal

更新的答案。我认为您将它作为输出不会有太多问题,但是最好的选择是听取Atmel的建议。
helloworld922

10
  1. 将引脚设置为输入,将引脚驱动为高电平以接合内部上拉电阻:我认为应显示为:“ 通过接合内部上拉电阻使输入为高电平 ”。(只有在通过Vcc或接地的FET积极地使用时,我才使用“驱动”一词。)很明显,您需要一个定义的电平,上拉电路负责这一点。确保启用上拉是重置后首先要做的事情之一。通常,这用于I / O初始化。唯一的电流将是推挽对的NFET的泄漏电流以及输入FET的栅极泄漏。小于1 µA:好。
  2. 将引脚设置为输入,将引脚驱动为低电平:不是一个好主意。如果软件采用香蕉设计,并将引脚切换为高电平输出,则说明您正在短接该引脚,从而损坏了互补对的PFET。
  3. 将引脚设置为输入,外部上拉:与1)相同,只是价格更高。但是它的优点是上拉总是在那儿;您可能会忘记启用内部上拉(默认情况下处于禁用状态)。如果I / O意外切换为低输出,则将消耗少量电流。
  4. 将引脚设置为输入,外部下拉:同样,电阻的成本(是的,我知道它们很便宜,但是便宜+不必要的=昂贵的。)如果该引脚变为高电平有效,则电流与3中相同。
  5. 将引脚设置为低输出:泄漏电流高于配置为输入时的泄漏电流,但仍低于1 µA,因此无需担心。我仍将启用内部上拉功能。I / O作为输出将不会处于活动状态,但是如果意外将其切换为输入,则该引脚将不会保持悬空状态。
  6. 将引脚设置为高输出:与5相同
  7. 将引脚设置为输出低电平,外部下拉:下拉电阻是不必要的成本:它将使输出低电平,该输出已经很低。但是与5)相比,它具有的优势在于,如果意外切换到输入,则可以确保引脚不会浮动。

我会去1):内部上拉输入;无需外部零件。在FMEA中5)可能会更好,但这取决于您估计忘记启用内部上拉电阻的风险有多高。软件设计同行评审应该为您提供保险。


1

引脚本身通常不会产生很大的变化。您还将看到每个引脚也具有特定功能-禁用该引脚的功能

volatile uint8_t timer2sum; // see interrupt handler

void Initialize()
{
    // configure pin for output
    DDR_LED |= LED;

    // set Power Reduction Register
    PRR = (1<<PRTWI)     // turn off TWI
        | (1<<PRTIM0)    // turn off Timer/Counter0
        | (1<<PRTIM1)    // turn off Timer/Counter1 (leave Timer/Counter2 on)
        | (1<<PRSPI)     // turn off SPI
        | (1<<PRUSART0)  // turn off USART (will turn on again when reset)
        | (1<<PRADC);    // turn off ADC

    // select POWER SAVE mode for sleeping, which allows Timer/Counter2 to wake us up
    set_sleep_mode(SLEEP_MODE_PWR_SAVE);

    // configure Timer/Counter2 to wake us up as infrequently as possible
    TCCR2B |= (1<<CS22) | (1<<CS21) | (1<<CS20); // clock at 14400 Hz
    TIMSK2 |= (1<<TOIE2);                        // interrupt on overflow, 56.25 Hz
    timer2sum = 0;                               // see interrupt handler
    sei();                                       // enable interrupts
}

取自http://www.nerdkits.com/library/lowpowerexample/,他们也使用相同的芯片。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.