ATtiny85 功耗翻倍预期

电器工程 低电量 爱特梅尔 服装
2022-01-10 08:35:48

我正在尝试让 ATtiny85 耗尽电池电量。我用一个 16.384 MHz 的晶体为它提供时钟,并设置了 8 分频保险丝。Vcc 为 3.3 伏。数据表中的图 22-7 表明,在空闲 ( set_sleep_mode(SLEEP_MODE_IDLE); sleep_mode();) 时,它应该消耗 300 µA 左右的电流。实际上,我看到它的电流更像是 850 µA。我无法弄清楚为什么功耗是预期的两倍。我已经关闭了 PRR 中的所有内容,除了 timer0,我将其配置为每 25 毫秒中断一次。所以它应该将大部分时间都花在空闲状态,这是我能做的最好的事情,因为我仍然希望计时器计数。

保险丝是 0x7f、0xdf、0xff。

这是它为此测试运行的代码:

#include <Arduino.h>
#include <EEPROM.h>
#include <avr/sleep.h>
#include <avr/power.h>

#define P0 0
#define P1 1
#define P_UNUSED 2

ISR(TIMER0_COMPA_vect) {
  // do nothing - just wake up
}

void setup() {
  power_adc_disable();
  power_usi_disable();
  power_timer1_disable();
  //PRR = _BV(PRADC) | _BV(PRTIM1) | _BV(PRUSI); // everything off but timer 0.
  TCCR0A = _BV(WGM01); // mode 2 - CTC
  TCCR0B = _BV(CS02) | _BV(CS00); // prescale = 1024
  // xtal freq = 16.384 MHz.
  // CPU freq = 16.384 MHz / 8 = 2.048 MHz
  // count freq = 2.048 MHz / 1024 = 2000 Hz
  OCR0A = 50; // 25 msec per irq
  TIMSK = _BV(OCIE0A); // OCR0A interrupt only.

  set_sleep_mode(SLEEP_MODE_IDLE);

  pinMode(P_UNUSED, INPUT_PULLUP);
  pinMode(P0, OUTPUT);
  pinMode(P1, OUTPUT);
  digitalWrite(P0, LOW);
  digitalWrite(P1, LOW);

  while(1) { sleep_mode(); }
}
void loop() {}
3个回答

您说根据数据表中的图 22-7,它应该只消耗 300µA,但该图显示了在没有时钟分频的情况下运行的电流消耗。运行在 16MHz 的晶体振荡器必然会比运行在 2MHz 的晶体振荡器消耗更多的电流,并且 3 级分频器会增加一点。问题是——还有多少

数据表还表明,可以通过将时钟分频来减少空闲电流,但同样没有说明会减少多少。推断 3.3V 线表明它通常会在 16.4MHz 时消耗大约 1.5mA,而 850µA 是一个显着的减少 - 但它应该更少吗?

如果您不能在即将到来的板上使用较低频率的晶体,那么您可能无能为力。但是,当您将电路放在面包板上时,您至少可以尝试使用 2MHz 晶体,看看这是否真的是问题所在。

在此处输入图像描述

我对那个芯片也有类似的问题。耗电量比预期高出 30%。

问题是未使用的 GPIO!

它们被配置为输入并保持浮动。缺乏明确定义的输入状态确实使 GPIO 驱动程序消耗的内容比指定的要多得多。

答案是启用上拉或将未使用的引脚配置为输出。

您确定引脚设置正确吗?在您的代码中似乎是这样,但是您检查了吗?

我想为一个单独的项目添加它,我问了这个问题,答案也极大地影响了这个问题。清除ADCSRA将空闲消耗降低到图 22-6 所说的应该采用的值——在 500 kHz 的分频系统时钟速率下约为 100 µA——这是分频后的时钟频率,而不是晶体频率。