ATtiny85の消費電力は2倍になると予想


9

ATTiny85をバッテリーで動かそうとしています。16.384 MHzクリスタルからクロックを供給し、8分周ヒューズセットを備えています。Vccは3.3ボルトです。データシートの図22-7は、アイドル時(set_sleep_mode(SLEEP_MODE_IDLE); sleep_mode();)に約300 µAを消費することを示しています。実際には、それは850 µAのように見えます。消費電力が2倍になることが予想される理由がわかりません。25 msごとに中断するように設定した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 2014

1
jeelabsの男が行ったトリックのいくつかを見ましたか?こちらをご覧ください(一番下から読み始めます):jeelabs.org/tag/lowpower
RJR

1
@RJR調べたところ、タイマーを実行し続ける必要があるためSLEEP_MODE_IDLEしか使用できないため、残念ながら多くのトリックは機能しません。このアプリは時計です。
nsayer 2014

1
これがクロックの場合、内部発振器を実行して、タイマー2の時計クリスタルを使用してウォッチドッグ割り込みを起動することを提案できますか?その後、ディープスリープを使用できます。それについてのjeelabsブログの投稿もどこかにあると思います。
RJR 2014

1
私が見るすべてのグーグルは、彼らが外部RTCモジュールを使用していることを示唆しています。CPUクロックは重要ではないため、RTCを使用している場合は、はい、ウォッチドッグと内部発振器を使用できます。この場合、しかし、私は水晶の精度を求めています。また、これはATTiny85です。タイマー2はなく、0と1だけで、タイマー1はタイマー0よりも1桁多い電力を消費します。システムクロック以外の追加の外部コンポーネント。
nsayer 2014

回答:


6

データシートの図22-7によると、300µAしか引き込まないはずですが、そのグラフは、クロック分周なしの動作の電流引き込みを示しています。16MHzで動作する水晶発振器は、2MHzで動作する水晶発振器よりも多くの電流を消費するようにバインドされており、3ステージの分周器がもう少し追加します。問題は、さらにどれくらいですか?

データシートはまた、クロックを分周することによってアイドル電流を減らすことができることを示唆していますが、それでもどれだけそれが削減されるかについては述べていません。3.3Vラインを外挿すると、通常は16.4MHzで約1.5mAを消費し、850µAは大幅に減少しますが、それより少なくする必要がありますか?

あなたが来ているボードでより低い周波数のクリスタルを使うことができないなら、あなたは何もすることができないかもしれません。ただし、ブレッドボード上に回路がある場合でも、少なくとも2MHzクリスタルを試して、それが本当に問題かどうかを確認することができます。

ここに画像の説明を入力してください


OK。噛みます。今日は店に行って、2 MHzの水晶を手に取り、クロック分周がないようにチップを再融合して確認します。
nsayer 2014

もう1つの問題は、2 ^ xの水晶周波数の必要性です。店に行って4.096 MHzのものを見つけましたが、1.024と2.048は見つけるのが難しいです。しかし、2 ^ xクロックを使用しないと、プリスケールとOCR0A値を選択するのが難しくなり、結果として2番目の割り込みの端数も均等になります。16で割った8.192 MHzのは、かなりの電力を節約している場合でも、私は確かに32で割っ16.384の上にそれと幸せになりたい
nsayer

2
4.096 MHzの水晶振動子を配置し、CPUクロックのプリスケール値を8にすると、消費電流は約450 µAになります。
nsayer 2014

数年遅れますが、RTCを購入してそれをPPSで使用し、プロセッサをハードスリープして、割り込み時にのみウェイクアップさせてください。
HilarieAK、2016

3

そのチップでも同様の問題がありました。消費電力は予想より30%多かった。

問題は未使用のGPIOでした!

それらは入力として構成され、フローティングのままにされました。明確に定義された入力状態がないため、GPIOドライバーは指定されたものよりも多くを消費しました。

答えは、プルアップを有効にするか、未使用のピンを出力として構成することでした。

ピンが正しく設定されていますか?あなたのコードではそうですが、チェックしましたか?


まあ、くそ。pinMode(P_UNUSED, INPUT_PULLUP);十分でない場合は、WTF?
nsayer 2014

ええ、でも時々これは十分ではありません。たとえば、プログラムする方向に関係なく、デフォルトでADC入力またはアナログ入力のピンがある場合があります。そこで、最初に二次機能を無効にする必要があります。それが私が「チェックする」という意味です。
Blup1980 2014

これはATTiny85です。6つのピンがありますが、そのうちの3つはRESETと2つのxtalピンです。2つは出力で、1つは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)に下がりました。これは、水晶周波数ではなく、分周後のクロック周波数です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.