低電力モードの使用に関する記事を見つけることができます。 ほとんどの場合、特定のマイクロコントローラーの長所と短所を説明しており、すべての推奨事項は一般化されたフレーズであるスリープモードを使用します。
この記事では、これらの推奨事項について少し掘り下げ、デバイスの1つを開発する際に個人的に対処しなければならなかったエネルギー消費を削減する方法について読者に伝えたいと思います。
背景は、アナログ信号のロガーを開発する必要があったほどです。 技術的に問題ないサーキット:
-11個のADCチャンネル
-ブルートゥース
-SDカード
-OLEDディスプレイ128x64
-1つのAAAバッテリーで駆動
これは、ユーザーがボタンとディスプレイを使用してデバイスの電源を入れ、パラメーターを設定し、測定を開始するというアイデアでした。 次に、チャネルがデジタル化され、メモリカードに保存されます。 オプションで、Bluetoothをオンにして、スマートフォンからいつでも測定値をリアルタイムで確認したり、以前に保存したデータをカードにアップロードしたりできます。 測定モードでは、デバイスは1つのAAAバッテリーで3日間使用することになっています。
計算に精通していない読者のために、概算の見積もり:
平均24日で、公称値1.5VのAAAバッテリーは600-1000mAhを出力するため、最悪の場合、デバイスは600 /(24 * 3)= 8.3mAを消費し、せいぜい1000 /(24 * 3)= 13mAです。 しかし、非常に重要な機能があります:これは1.5Vの消費です。 メモリカードとマイクロコントローラは3Vで動作するため、3Vに関しては、この数値は約2倍小さくする必要があります。 4-6mA。 Bluetoothとディスプレイをオンにしたとき、要件は「ソフト」であったため、考慮されませんでした。
プラットフォームの選択に疑いの余地はありませんでした-STM32は、主に他の開発者の可用性と推奨事項のためであり、プラットフォームは長い間マスターされてきました。 L0は、必要な量のきざみ付きの石がないため適合しなかったため、STM32L151を優先して選択しました。 STM32L4については考えられていましたが、当時の価格は高く、それを選択する明確な理由はありませんでした。
当時、私は正確に低電力のデバイスを開発した経験はありませんでしたが、一般に、データシート+ cubemxによるエネルギー消費の要件と予備計算は、一見、すべてが収束することを示しました。 少しの洞察を得るために、たとえば72 MHzの最大周波数でSTM32F103などの通常のマイクロコントローラーをオンにすると、周辺機器なしで数十mAで1つのプロセッサーの消費のみがわかります。 通常の赤色LEDでも1.9Vで10mAを消費します。 したがって、デバイスはほとんどの時間スリープすると想定されていました。
回路には回路機能は含まれていません。 すでにテスト済みの電源スキームが使用されました。 1.5Vのうち、3Vにポンプされ、ADCの一部は2.5Vで駆動されました。 電力が0.95Vに低下すると、デバイスはオフになりました。
最初に遭遇した問題は、ADCからデータを取得する方法でした。 実際、11のチャネルがあり、それぞれが独自の周波数でデジタル化され、さらに一部のチャネルは12ビット、一部は8ビットです。 合計データストリームは1秒あたり約6.5kBytesです。 2つのオプションがありました。1。DMAを介して受け取ります。 2.タイマー変換を開始し、割り込みを受け取ります。
経験の浅い読者は、DMA +タイマールールを使用すると、変換を開始してCPUをスリープ状態にできると言うでしょう。 ただし、L151にはADCが1つしかないため、異なる周波数で同時に起動することはできません。 1つのチャネルが1 Hzの周波数で質問され、2番目のチャネルが2 kHzである場合、DMAを使用して作業するときは、2 kHzで両方に質問する必要があります。 欠点は明らかです-追加のメモリ消費、CPUの参加による追加のバッファのレーキ、追加のDMAの消費。
明らかに、ポーリング頻度による分布が異なる場合、すべてが異なりますが、特に私の場合、DMAを使用することは完全に不利であることが判明しました。 テストでは、ポーリング割り込みによりバッテリー消費が大幅に節約されることが示されています。 繰り返しますが、すべて特定の状況に依存します。
もう1つの興味深い点は、ADC + DMAの組み合わせ+タイマーを使用している場合です。 タイマー自体の消費量は大きく異なるため、このタイマーを使用する前に必ずデータシートを確認してください。
L1にはさまざまな睡眠パターンがありますが、かなり限られています。 たとえば、DMA + ADCを実行してCPUを無効にしますか? ADCはHSIからクロック供給され、HSIはスリープでのみ動作するため、使用できるモードはスリープのみです。
さらなる研究のトピックは、メモリカードに使用するインターフェイス(SPIまたはSDIO)でした。 残念ながら、詳細は正確には覚えていませんが、セクターごとの記録では消費量はほぼ同じでしたが、記録速度/電力比のためにマルチブロックでは明らかにSDIOが優先されました。
また、原則として、マルチブロックはエネルギー消費の観点からより収益性が高いことが判明したため、RAMに可能な限りデータを保存することが正しい判断です。 外部の工作員を配置するオプションがありましたが、多くの新しいリスクがそこに現れました。
もう1つの作業は、FATファイルシステムです。 PCに接続されたメモリカードは、追加のソフトウェアを使用せずにどのコンピューターでも表示できることが必要でした。 機能を考えると、FAT32のみが必要でした。 同時に、突然の停電時にデータが失われないようにします。
エネルギー消費の観点からは、上で書いたように、マルチブロックで書く方がはるかに有益であり、同時にカードへのアクセス数を最小限に抑える必要がありました。 FATの問題は、クラスターチェーンが更新されるFATテーブルへの定期的なアクセスです。
解決策はシンプルであることが判明しました-記録の開始前に、大きなファイルに場所が割り当てられ、その後、通常の低レベル関数を使用して、FATライブラリなしでデータが書き込まれました。 また、突然の停電に関連する問題を回避しました。
SDメモリカード自体については、これは別の話です。 それらの普及にもかかわらず、カードがインターネット上でどのように機能するかについての100%の信頼できるデータは全くありません。 情報は少しずつ収集する必要がありました。 私が遭遇した2つの問題があります。1.消費方法が異なる2.セクター転送の動作が異なります。
問題1では、単に戦うことは不可能です。 簡単な例。 あなたはカードを取ります-あなたはセクターを記録し、N mAがそれに費やされます。 書き込みを停止します-カードはこれらのN mAを例えば64ms消費し続け、何もしません。 あなたは別のカードを取ります、それはセクターを消費した直後に消費をやめます。
問題2.誰かがウェアレベリングなどがあると聞いたのかもしれません。要するに、メモリーカード内のコントローラーが、カードのセクターが均一に摩耗することを保証するのです。 どうやら、この主題に関する単一の基準はなく、これについての粗末な言及は、東芝から(私が間違っていなければ)出会っただけです。 したがって、このコントローラーはカードごとにまったく異なる動作をすると信じる理由があります。 そして、いくつかのカードでは、一般的に不在です。
このように現れ、同じセクターで何度も書きます。 明らかにコントローラーを持たないカードは、N個のレコードの読み取りを停止します。 他のカードでは、一定の間隔で、記録時間が1回急激に増加します。 さらに、テストにより、この時間は最大1秒に達することが示されています。 はい、はい、この図に間違いはありません。 同じセクターで5,000回記録する例を次に示します。記録時間が定期的に増加しています。
実際には、ブランドカードとノーネームカードの間に違いはありませんでした。 さまざまなメーカーの多数のカードを確認しました。 テストでは、あるメーカーのカードが優れた結果を示しましたが、同じカードを別のストアで購入したり、GBの量を変えて購入した場合、まったく嫌な指標が生成されました。
問題の唯一の解決策は、デバイスでメモリカードテスターを完成させ、カードを購入することです。カードをデバイスに挿入し、テストし、エネルギー消費に合格したら、バッチを購入します。 1つのバッチ内で、カードの消費量は同様でした。
合計で、STM32L151は1.5Vで10mAに収まりました。 開発の過程で、多くの追加のウィッシュリストが登場したため、デバイスがスリープ状態になるという当初の考えは根本的に間違っていました。 一般に、これは3日間の要件に適合しましたが、4mAの顧客の追加料金を含める必要があることが判明しました:)。 唯一の希望は、プロジェクトをSTM32L4に移行することでした。
メインの切り札STM32L4は、1つではなく3つのADCでした。 それはどうですか? 各ADCを実行して、個別に変換できます。 ADC + DMA +タイマー、L1のようなオーバーヘッドは発生しなくなりました。 これで、1秒あたりのサンプル数でチャネルをグループ化できました。 これにより、プロセッサがより頻繁にスリープ状態になり、バッファのレイクアップに最小限の時間を費やすことができました。
L1のADCクロッキングの比較
そして、L4
前述のように、L1での測定は非常に限られています。 たとえば、ADCはHSIから直接クロックされます。何かを測定する必要がある場合、16 MHzでHSIをオンにする必要があります。 STM32L4では、ほとんどすべてが互いに独立して構成されています。 ADCはどのジェネレーターからでもクロックできます。
最も嬉しい驚きはMSIクロックでした。 はい、それはL1にもありますが、上記のように、そこからADCを取得することは不可能です。 私の場合、16 MHz HSIと8 MHz MSIの消費量の差は非常に大きかったです。
しかし、クロック周波数の電力消費への依存性の研究により、クロックを4 MHzに下げても消費に大きな差は生じないことが示されましたが、パフォーマンスは劇的に低下します。
周辺の残りの部分のクロック信号も、今や過小評価することが可能になりました。 送信時にクロックが直接オンになっている場合、低電力クロックSDIOやADCなど、L4のボーナスもありました。 ハードウェアCRCモジュールの使用も報われました。 ここで、もう1つの機能を含めることができます。周辺機器を設定して、スリープに入ると自動的にオフになるようにすることができます。
結果を達成するための重要なステップは、圧縮の使用でした。 より正確には、デバイスの最初のバージョンにも存在し、使用されるアルゴリズムはこのデバイス専用に顧客によって開発されました。 ただし、テストでは、LZ4の方が大幅に優れたプレスを実行し、CPUの消費が大幅に少ないことが示されました。 平均で、6.5kBから1.5-2kBのデータが得られました。
重要な要因は、サスペンダーの各額面の検証、プリント回路基板の高品質の洗浄、不十分に洗浄されたフラックスの滴が追加の漏れを与えることでした。 慣例により、回路基板は通常のアルコールでのみ洗浄するのが最適です。 目に見えないように見えるインストールの欠陥は、非常に影響を受けます。そのため、これに細心の注意を払うことを強くお勧めします。
結論として、L4の移行と価格は、非常に低い電力消費を必要とするデバイスに対して絶対に正当化されると言えます。 最終的に、1.5Vで4.5〜5.5mAの所望の消費を達成することができました。 テストでは、デバイスは1つのバッテリーで3日間以上正常に動作しました。