強誘電体(強誘電体)メモリと電子インク-バッテリー電源に最適な組み合わせ

テキサス・インスツルメンツが有名な低電力MSP430シリーズに強誘電体メモリを装備したとき、そのようなメモリはフラッシュとRAMの利点を兼ね備えているため、操作がさらに簡単で楽しくなりました。 また、セグメントインジケータを備えた新しいランチャーは、ある種のホームオートメーション用の既製のプラットフォームです。 しかし、グラフィックディスプレイが必要な場合はどうでしょうか。 ここで、電子インクは更新時にのみエネルギーを消費し、1組のバッテリーで駆動される美しい対照的な画像で何年も喜ばれるため、救助に来ます。 そのようなデバイスのプログラミング体験に興味があるなら、catへようこそ。 強誘電体メモリとは何か、なぜそれが必要なのか、可能な限り低いエネルギー消費を達成し、電子ペーパーで美しい写真を撮る方法、およびarduinoで書かれたテキサスベースのコードを使用する方法について説明します。









最初のMSP-EXP430G2フォークランチャーで MSP430シリーズの研究を開始しました。 そのため、強誘電体メモリとセグメントLCDを備えたマザーオブパールボタンを備えMSP-EXP430FR4133およびMSP-EXP430FR6989ラッチパッドが発売され、ほぼ同じ価格で、すぐに何か美しいガジェットを作るというアイデアを得ました。



良い強誘電体メモリとは



強誘電体メモリは、チタン酸ジルコン酸鉛(PZT)という特別な材料に基づいています。 彼は強誘電体、つまり自発分極が可能です。 この材料の構造には、負に帯電した結晶格子のセルに「ロック」された正に帯電した原子があり、このセルの中心に対してシフトできます。 この変位は、電界の影響下で発生し、外部回路に電荷が流れます。 電界を除去した後、セルは分極されたままであるため、この効果を使用してバイナリ情報を保存できます。







ゼロと1は、PZTを反対方向に偏光することによりエンコードされます。 唯一の問題は、外部回路で電流パルスを取得する唯一の方法であるため、読み取りは偏光の方向を変更することでのみ可能であるということです。 つまり、読み取りには、以前に記録された情報の消去が含まれ、直ちに復元する必要があります。 この欠点は、偏光の方向を変えるために非常に短い時間が必要であるという事実によって補われます-ナノ秒のオーダー。 したがって、記録は従来のフラッシュメモリよりもはるかに高速であり、ブロックを事前に消去する必要はありません。 実際、このようなメモリは操作可能なメモリと同じ方法で操作でき、同時に電源をオフにしても内容は保持されます。 設定を保存するため、またはRAMに収まらないデータの配列に収まるためにバッファが必要だと想像してください。 次のように実装できます。

const uint8_t buff_holder[BUFF_SZ]; //    FRAM uint8_t* buff = (uint8_t*)buff_holder; //   buff       
      
      





フラッシュブロックを消去するよりもずっと便利ですよね。



大食いの戦い



MSP-EXP430FR6989ボードを取り上げて最初にやったことは、それによって消費される電流を測定し、わずかに驚いたことです。プロセッサが停止したため、電流は約80マイクロアンペアだったからです。 プロセッサを停止するという意味の2行の最も単純なプログラムを作成しました。

 void main() { WDTCTL = WDTPW | WDTHOLD; //    _bis_SR_register(LPM3_bits); //   }
      
      





もちろん、I / Oポートを未初期化のままにするのは正しくありませんが、デフォルトでは入力で動作し、フローティング入力電位は入力バッファトランジスタに貫通電流を流します。 出力用のポートをプログラムするか、プルアップ抵抗を接続する必要があります。 プロセッサに接続されている周辺機器を恐れて、2番目のオプションを実装しました。

 void main() { WDTCTL = WDTPW | WDTHOLD; //    //      P1OUT = P2OUT = P3OUT = P4OUT = P5OUT = P6OUT = P7OUT = P8OUT = P9OUT = P10OUT = PJOUT = 0; P1REN = P2REN = P3REN = P4REN = P5REN = P6REN = P7REN = P8REN = P9REN = P10REN = PJREN = ~0; _bis_SR_register(LPM3_bits); //   }
      
      





消費電流は40マイクロアンペアに減少しましたが、これは前世代のMSP430プロセッサーが示した結果の10倍です。 問題は何ですか? 新しいプロセッサは、クォーツ発振器を特に情熱を持って監視する高度なシュレッド品質管理スキームを実装していることがわかりました。 低周波チップのソースとしてデフォルトで選択されているのは、外部水晶発振器です。 接続されていない場合、または接続されているレッグを設定していない場合、低周波ロックエラーフラグが立てられ、その後バックアップ内部RC周波数ジェネレーター5MHzが起動し、この周波数は128で除算され、低周波ブロックとして使用されます。 40マイクロアンペアを消費するのはこのジェネレーターです。 シュレッド品質に対するこの強迫的な懸念のパラドックスは、この状況では低周波シュレッドがまったく使用されないことです!

この現象に対処するには2つの方法があります。 まず、内部RC低周波シュレッドジェネレーターを使用できます。 この場合のコードは次のとおりです。

 void main() { WDTCTL = WDTPW | WDTHOLD; //    //      P1OUT = P2OUT = P3OUT = P4OUT = P5OUT = P6OUT = P7OUT = P8OUT = P9OUT = P10OUT = PJOUT = 0; P1REN = P2REN = P3REN = P4REN = P5REN = P6REN = P7REN = P8REN = P9REN = P10REN = PJREN = ~0; CSCTL0_H = CSKEY >> 8; //     CSCTL2 = SELA__VLOCLK | SELS__DCOCLK | SELM__DCOCLK; //       _bis_SR_register(LPM3_bits); //   }
      
      





時計の精度が重要な場合(時計など)、この方法は適していません。 あなたは本当に低周波水晶発振器が必要です。 クォーツが接続されているレッグを事前設定することを忘れずに、スタブが安定してエラーフラグをクリアするのを待つループを追加できます。

 void main() { WDTCTL = WDTPW | WDTHOLD; //    //      P1OUT = P2OUT = P3OUT = P4OUT = P5OUT = P6OUT = P7OUT = P8OUT = P9OUT = P10OUT = PJOUT = 0; P1REN = P2REN = P3REN = P4REN = P5REN = P6REN = P7REN = P8REN = P9REN = P10REN = PJREN = ~0; PJSEL0 = BIT4 | BIT5; //    CSCTL0_H = CSKEY >> 8; //     CSCTL4 &= ~LFXTOFF; //    do { CSCTL5 &= ~LFXTOFFG; //      SFRIFG1 &= ~OFIFG; //    } while (SFRIFG1 & OFIFG); //    _bis_SR_register(LPM3_bits); //   }
      
      





このソリューションの問題は、例えば電磁干渉による動作中に低周波発生器エラーが再び発生した場合、いかなる方法でも処理されないため、時計が故障し、バッテリーを積極的に消費することです。 常に機能する代替手段は、割り込みエラーを処理することです。

 void main() { WDTCTL = WDTPW | WDTHOLD; //    //      P1OUT = P2OUT = P3OUT = P4OUT = P5OUT = P6OUT = P7OUT = P8OUT = P9OUT = P10OUT = PJOUT = 0; P1REN = P2REN = P3REN = P4REN = P5REN = P6REN = P7REN = P8REN = P9REN = P10REN = PJREN = ~0; PJSEL0 = BIT4 | BIT5; //    CSCTL0_H = CSKEY >> 8; //     CSCTL4 &= ~LFXTOFF; //    SFRIE1 = OFIE; //      for (;;) { _bis_SR_register(LPM3_bits + GIE); //  ,   } } #pragma vector=UNMI_VECTOR __interrupt void UNMI_ISR(void) { do { CSCTL5 &= ~LFXTOFFG; //      SFRIFG1 &= ~OFIFG; //    } while (SFRIFG1 & OFIFG); //    }
      
      





現在、プロセッサ停止モードのボードは、水晶発振器で0.9マイクロアンペア、それ以外で0.6マイクロアンペアを消費します。これは、前世代のMSP430の結果よりもほぼ1桁優れています。



TIが提供するライブラリのおかげでボード上のLCDセグメントを管理することは問題ではありませんが、いくつかの驚きももたらしました。 まず、TIが提供するLCD初期化コードは、実際よりも多くのセグメントを初期化します。 その結果、平均値が電源電圧の半分に近い交流電圧が拡張コネクタの多くの端子に存在していました。 第二に、LCDは不当に多く消費します-約40マイクロアンペア。 しかし、ご存知のように、牛が食べる量を減らすためには、頻繁に給餌する必要がありません。 LCDクロック信号の周波数を下げると、消費電流が6.5マイクロアンペアに減少しました。



画面を接続する





グラフィック表示として電子インク画面が選択されました。 メーカーのページには多くのライブラリがありますが、通常は必要なライブラリはありません。 スクリーンメーカーが提供するライブラリは一般に、印象的な印象を与えます。なぜなら、それらは書きやすさを期待して作られており、RaspberryPiのような非常に高速なものでのみパフォーマンスが許容される多層ケーキだからです。 しかし、arduinoに適合したバージョンがあり、このレイヤーケーキ全体が1つのモジュールに詰め込まれていました。 別の自転車を発明するためのより良いと不本意の欠如のために彼から始めることが決定されました。 最初は、最も一般的な方法でdigitalWrite / digitalReadなどのポートアクセス関数を実装しました。 予想される画像の代わりに、画面に泥の汚れがゆっくりと現れるのを見たとき、私の最初の望みは画面を送り返すことでした。 しかし、常識的に、ここで何かが間違っていると判断しました。 最初に、泥汚れの発現プロセスを加速し、コードをわずかに最適化しました。すべてのI / O関数をインラインにしました。 同時に、必要なすべてのレッグが同じポートにあるという事実だけに依存したため、レッグのArduino番号が対応するビットになります。 SPIとの連携もインラインになりました 。結果はこちらで確認できます 。 途中で、私はarduino SPIにポートが1つしか存在しないことを知って驚いた-したがって、上記のリンクのファイルの最後の2行。 最適化されたバージョンでは、汚れがはるかに速くペイントされ、以前ほど汚れていませんでした。 その後、さらに進んで、プロセッサのクロック速度を8MHzに上げました。画像はほぼ完璧になりました。 どうやらディスプレイコントローラーには独自のメモリやクロックはなく、単に入力信号を使用して必要な電圧を生成しているようです。 したがって、データ転送が遅すぎる場合、これらの電源電圧は更新に必要な電圧よりも低くなります。 更新プロセスを次のビデオクリップに示します。







バッテリーから電力を供給しようとする場合、画面で最後に行う必要があるのは、ボーナスとしてディスプレイコントローラーボードに取り付けられている余分な部品を取り外すことです。 U6温度センサーは100マイクロアンペアを消費します。 この電流は、シャットダウンコマンドを送信することによってのみ削減できますが、そのためにI2Cポートに接続するだけではありません。 電源線を切断する方がはるかに簡単です。 U5フラッシュメモリはさらに5マイクロアンペアを消費しますが、これを完全にはんだ付け解除することで対処しました。 現在、動作するリアルタイムクロックを備えたシステム全体は10マイクロアンペアを消費します。 画面は、更新時に5秒間10ミリアンペアを消費します。 バッテリー容量は1 A *時間(通常はAA形式)で10年間持続しますが、1時間半に1回(5年間)画面を更新します。 その上で意味のある何かを描くことだけが残っていますが、次回はさらに詳しく説明します。



ソースコード



ここにあります 。 コンパイルには、MSP430バージョン6.40.1のIAR Embedded Workbenchが使用されました。 追加のライブラリは必要ありません。



All Articles