ATtiny85功耗有望翻番


9

我正在尝试让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 ms中断一次。因此,它应该将其大部分时间都花在空闲状态上,考虑到我仍然希望计时器计数,这是我能做的最好的事情。

保险丝为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() {}

1
你杀了比较器吗?
伊格纳西奥·巴斯克斯

1
您是否了解过jeelabs家伙的一些技巧?参见此处(从底部开始阅读):jeelabs.org/tag/lowpower
RJR

1
@RJR我看了一下,不幸的是,他们的许多技巧都不起作用,因为我只能使用SLEEP_MODE_IDLE,因为我需要保持计时器运行。该应用程序是一个时钟。
nsayer 2014年

1
如果这是一个时钟,我是否可以建议使用内部振荡器并在定时器2上使用看门钟来触发看门狗中断?然后,您可以使用深度睡眠。我认为在某处也有关于此内容的jeelabs博客文章。
RJR 2014年

1
我看到的所有Google搜索表明他们正在使用外部RTC模块。如果您有RTC,可以,可以使用看门狗和内部振荡器,因为CPU时钟并不重要。但是,在这种情况下,我需要晶体的精度。而且,这是一个ATTiny85-没有定时器2,只有0和1,定时器1比定时器0消耗的功率大一个数量级。除了作为系统时钟以外的任何其他外部组件。
nsayer 2014年

Answers:


6

您说根据数据手册中的图22-7,它应该仅汲取300µA,但该图显示了无需时钟分频的工作电流消耗。运行在16MHz的晶体振荡器必然比运行在2MHz的晶体振荡器消耗更多的电流,而3级分频器将增加更多的电流。问题是- 还有多少

数据表还建议可以通过将时钟分频来减少空闲电流,但同样也没有说明将减少多少。外推3.3V线表明,它通常在16.4MHz时会汲取约1.5mA电流,而850μA的电流将大大降低,但应该更低吗?

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

在此处输入图片说明


好。我会咬 我今天去商店,拿起2 MHz的晶体,重新熔合芯片,以确保不进行时钟分频并进行检查。
nsayer 2014年

另一个困难是需要2×x的晶体频率。我去商店发现了4.096 MHz的硬盘,但是很难找到1.024和2.048。但是如果不使用2 ^ x时钟,则很难选择预分频比和OCR0A值,该值会导致几分之一秒的中断。但是,如果8.192兆赫除以16,可以节省显著力量,我肯定很高兴与超过16.384的32分
nsayer

2
现在安装了4.096 MHz晶振,并且CPU时钟预分频值为8,现在功耗约为450 µA。
nsayer

迟了几年,但为什么不购买RTC并使用它的PPS,硬睡处理器,并让它仅在中断时唤醒。
HilarieAK

3

我对该芯片有类似的问题。功耗比预期高出30%。

问题是未使用的GPIO!

它们被配置为输入,并悬空。缺少明确定义的输入状态确实使GPIO驱动器消耗的电流比指定的还要多。

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

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


好吧,该死。如果pinMode(P_UNUSED, INPUT_PULLUP);还不够,那么WTF?
nsayer 2014年

是的,但是有时候这还不够。例如,无论您编程的方向如何,默认情况下您的引脚都可能是ADC输入或模拟输入。在那里,您首先必须禁用辅助功能。这就是我所说的“检查”。
Blup1980 2014年

这是一个ATTiny85。有6个引脚,但是其中3个是RESET和两个xtal引脚。其中两个是输出,一个是P_UNUSED。整个ADC已明确掉电。我将在其他3个引脚上尝试INPUT_PULLUP技巧,但我怀疑它不会改变任何内容。Tiny45有一个勘误表,其中提到了由于功耗而不将xtal引脚设置为OUTPUT。
nsayer 2014年

添加pinMode(3, INPUT_PULLUP);与同为4和5中什么也没做。
nsayer 2014年

1

我想补充一点,对于一个单独的项目,我问了这个问题,答案也极大地影响了这个问题。清除ADCSRA可使空闲功耗降至图22-6所示的水平-在500 kHz的分频系统时钟频率下约为100 µA-这是后分频的时钟频率,而不是晶振频率。

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.