ATtiny85 전력 소비 두 배 예상


9

배터리를 사용하기 위해 ATTiny85를 얻으려고합니다. 16으로 나누기 퓨즈 세트가있는 16.384 MHz 크리스탈에서 클럭킹했습니다. Vcc는 3.3V입니다. 데이터 시트의 그림 22-7에 따르면 유휴 상태 ( set_sleep_mode(SLEEP_MODE_IDLE); sleep_mode();)에서 약 300µA를 끌어 야합니다. 실제로, 나는 그것이 850µA와 같은 그림을 본다. 전력 소비가 두 배로 예상되는 이유를 알 수 없습니다. 25ms마다 중단하도록 구성된 timer0을 제외하고 PRR에서 모든 기능을 해제했습니다. 따라서 대부분의 시간을 유휴 상태로 보내야합니다.이 타이머는 여전히 타이머 계산을 원할 때 가장 좋습니다.

퓨즈는 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
비교기를 죽였습니까?
Ignacio Vazquez-Abrams

1
jeelabs 녀석이 한 트릭을 살펴 보셨습니까? 여기를 참조하십시오 (아래에서 읽기 시작) : jeelabs.org/tag/lowpower
RJR

1
@ RJR 살펴 보았지만 불행히도 타이머를 계속 실행해야하기 때문에 SLEEP_MODE_IDLE 만 사용할 수 있기 때문에 많은 트릭이 작동하지 않습니다. 이 응용 프로그램은 시계입니다.
nsayer

1
이것이 시계 인 경우 내부 발진기를 끄고 타이머 2의 워치 크리스탈을 사용하여 워치 독 인터럽트를 발생시키는 것이 좋습니다. 그런 다음 깊은 수면을 사용할 수 있습니다. 나는 어딘가에 그것에 대한 jeelabs 블로그 게시물이 있다고 생각합니다.
RJR

1
내가 본 모든 인터넷 검색은 외부 RTC 모듈을 사용하고 있다고 제안합니다. RTC가 있다면 CPU 클록이 중요하지 않기 때문에 워치 독과 내부 발진기를 사용할 수 있습니다. 그러나이 경우 결정의 정확성을 원합니다. 또한, 이것은 ATTiny85입니다. 타이머 2가없고 0과 1 만 있으며 타이머 1은 타이머 0보다 훨씬 더 많은 전력을 소비합니다. 시스템 시계 이외의 추가 외부 구성 요소
nsayer

답변:


6

데이터 시트의 그림 22-7에 따르면 300µA 만 끌어 와야하지만이 그래프는 클럭 분할 없이 동작하기위한 전류 소모를 보여줍니다 . 16MHz에서 실행되는 수정 발진기는 2MHz에서 실행되는 것보다 더 많은 전류를 끌어 들이기 위해 묶여 있으며 3 단계 분배기는 조금 더 추가 할 것입니다. 문제는- 얼마나 더?

데이터 시트는 또한 클럭을 나누어서 유휴 전류를 줄일 수 있다고 말하지만 다시 얼마나 줄어드는 지는 말하지 않습니다 . 3.3V 라인을 외삽하면 일반적으로 16.4MHz에서 약 1.5mA를 소비 할 것이며, 850µA는 크게 감소 할 것입니다.

보드에서 더 낮은 주파수의 크리스탈을 사용할 수 없다면 할 수있는 일이 없을 수 있습니다. 그러나 브레드 보드에 회로가있는 동안 적어도 2MHz 크리스털을 시도하여 이것이 실제로 문제인지 확인할 수 있습니다.

여기에 이미지 설명을 입력하십시오


확인. 물어 볼게요 오늘 매장에 가서 2MHz 크리스털을 집어 들고 클럭 분할없이 칩을 다시 퓨즈로 연결하여 확인하겠습니다.
nsayer

또 다른 어려움은 2 ^ x 수정 주파수가 필요하다는 것입니다. 나는 가게에 가서 4.096 MHz를 찾았지만 1.024와 2.048은 찾기가 어렵다. 그러나 2 ^ x 클록을 사용하지 않으면 프리 스케일 및 OCR0A 값을 선택하기가 어려워 두 번째 인터럽트조차도 발생하지 않습니다. 그러나 8.192 MHz를 16으로 나눈 값이 상당한 전력을 절약한다면 16.384를 32로 나눈 값에
만족할 것입니다

2
4.096MHz 크리스털이 제자리에 있고 8의 CPU 클록 프리 스케일 값으로 약 450µA를 끌어옵니다.
nsayer

몇 년 늦었지만 RTC를 구입하고 PPS를 사용하고 프로세서를 강제 절전 모드로 설정하고 인터럽트 만하면됩니다.
HilarieAK

3

그 칩과 비슷한 문제가있었습니다. 전력 소비는 예상보다 30 % 더 많았습니다.

이 문제는 사용되지 않은 GPIO입니다!

그것들은 입력으로 구성되었고 떠 다니고 있습니다. 명확한 정의 된 입력 상태가 없기 때문에 GPIO 드라이버는 지정된 것보다 훨씬 더 많이 소비합니다.

풀업을 활성화하거나 사용하지 않는 핀을 출력으로 구성하는 것이 답이었습니다.

핀이 올바르게 설정되어 있습니까? 코드에서 그렇게 보이지만 확인 했습니까?


음, 젠장 경우 pinMode(P_UNUSED, INPUT_PULLUP);다음 충분히 WTF하지?
nsayer

네,하지만 때로는 이것으로 충분하지 않습니다. 예를 들어, 프로그래밍 방향에 관계없이 기본적으로 ADC 입력 또는 아날로그 입력 인 핀이있을 수 있습니다. 먼저 보조 기능을 비활성화해야합니다. 그것이 "체크"의 의미입니다.
Blup1980

ATTiny85입니다. 6 개의 핀이 있지만 그 중 3 개는 RESET과 2 개의 xtal 핀입니다. 그중 두 개는 출력이고 하나는 P_UNUSED입니다. 전체 ADC의 전원이 명시 적으로 꺼졌습니다. 다른 3 핀에서 INPUT_PULLUP 트릭을 시도하지만 아무것도 변경되지 않을 것으로 생각됩니다. Tiny45에는 전력 소비 때문에 xtal 핀을 OUTPUT으로 설정하지 않는 것에 대한 정오표가 있습니다.
nsayer

pinMode(3, INPUT_PULLUP);4와 5에 대한 추가 와 동일은 아무것도하지 않았습니다.
nsayer

1

별도의 프로젝트에 대해이 질문 을 추가하고 싶었고 대답은이 질문에도 크게 영향을 미쳤습니다. 클리어링 ADCSRA은 유휴 소비를 그림 22-6에서 500kHz의 분할 된 시스템 클럭 속도에서 약 100µA로 가정해야했던 수준으로 떨어 뜨렸다. 이는 크리스탈 주파수가 아니라 포스트-분할 된 클럭 주파수이다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.