低消費回路についての検討
TWEシリーズのスリープ時の消費を抑えるための回路についての検討事項です。
モジュールの外部回路について
最終回路が出来てからの電流抑制の検討は非常に困難です。必ず試作段階で確認するようにしてください。
- 未使用ディジタルピンは、プルアップ有効で未接続を推奨します。
- センサーなどの外部回路を用いる時には、FET などにより GND を切り離す回路を追加します。(センサーの VCC 側を切り離す設計は一般に複雑になります)
- 消費電流の小さいものであれば、DIO --- [センサーのGND], VCC --- [センサーのVCC] と接続して、センサーを利用する時に DIO を Lo 出力とします。3mA 程度の電流を流せます。センサーの誤差が通常と違う形で出るかもしれません。適宜分析調整してください。
- 未接続ピンのプルアップを停止するとスリープ中の消費電流が大きくなります(数十uA)。
- DIOが入力設定であって、外部がGNDのピンに接続する場合はプルアップを停止します。
- DIOが出力設定であって、Lo側の出力が必要な場合はプルアップを停止します。
- 不活性な外部ICのピンへの接続は大抵電流漏れの原因となります。外部ICのGNDも切り離すなど対処してください。
- ディジタルICの待機時の消費は小さいため、敢えて動作させた方が良い場合もあります。
- DIO0/1 を ADC3/4 として利用する場合は、リーク電流が発生します。スリープ中の電流消費を抑制するためには、ADC1/2の利用、または、スリープ中のアナログ回路部の GND を切り離し、スリープ中は内部プルアップを有効にします。
モジュール自身を遮断する
- 無線モジュールの GND 側を FET などにより切り離すようにしてください。他のピンも全て Vcc レベルに接続され、GND へ回り込む回路が無いようにします。
- 不活性な外部ICにピンを接続していると、そのピン経由で電流漏れを起こします。
- 無線モジュールが不活性の場合、無線モジュールの各ピンは電流漏れの原因になりますので、オープンにするか、Vcc側に接続(プルアップ)されるようにしてください。
回路例
DIOによる外部回路のスイッチ
DIOポートを電源として利用する簡易的な方法です。
- 外部回路の電源側を TWE モジュールの電源 (TWE_VCC) に接続します。
- 外部回路の GND 側を IO ポートに接続します。
- 逆に接続(外部回路の電源側をIOポートに接続する)は推奨しません。
※ 無線モジュール起動直後のファームウェア制御前に外部回路を動作させるなど、一般に利用の便が悪いためです。 - ポートから供給可能な電流は3mA程度に限られます。
- DO3 を LO に設定するとフォトリレーが稼働します。
※ TWE-VCC の電圧およびリレーの電流条件に注意してください。 - DO4 を LO に設定すると SENSOR1 が稼働します。
※ IO ポートを電源として利用するため、DO4 の替わりに GND に接続した場合と計測値に差異が出る場合もあります。
起動制御+FETによる外部回路のスイッチ
リセットIC(IC1)による安定した起動を行い※、起動後は IO の制御により外部回路の電源を投入する回路例を示します。
※ 必須ではありません。無線モジュールの半導体にも SVM というリセットICに似た仕組みがあります。以下に挙げる起動回路は、例えば、電圧降下のある電池を使用していて、より高い電圧で始動したい場合に有効です。
- 外部のバッテリー (BAT+, BAT-) を接続し、2.6V で動作するリセットICにより TWE_GND と BAT_GND を接続しすることで、TWELITEを起動させます。
- DO1 を Lo に設定する事で IC1 を非活性化し、IC1 による消費を抑制します。TWELITE起床後、速やかに DO1 の内部プルアップを無効にした上 DO1 を Lo に設定します。
- DO2 を Lo に設定する事で、外部回路 SENSOR, Photo RELAY を稼働します。DO2 が Hi の状態では外部回路が稼働しないため電流は消費しません(外部回路の配線によっては、電流が漏れる場合があります)。
- 無線モジュールが制御可能な状態になるまでは Hi の状態となり不用意に外部回路が動作する事を防ぐため、Hi 時はどうさせず Lo 時に動作するようにしています。
- 回路図上部ブロックを省略し TWE_GND, TWE_VCC に電源を直接接続する場合は、回路図下部ブロックのBAT_GND を TWE_GND に読み替えてください。
ソフトウェア上の対応
スリープ時の消費を抑えるために特別に特定のAPIを呼ぶと言った処理はありませんが、ペリフェラルやIO状態等により期待しない消費がある場合があります。原則として、ペリフェラルは停止手続きを行う、IO状態は上記のとおりプルアップ状態を正しく行う必要があります。
ToCoNet_vSleep (スリープ関数)
第3パラメータ (bRamOff) を TRUE にすると RAM の保持をしません。RAM の保持には約1uA消費します。
スリープの手続き例
スリープ手続きは、ペリフェラルの終了手続き(必須ではありません)、割り込みの停止、スリープ割り込みの設定、スリープ実行の順となります。
void vSleep(uint32 u32SleepDur_ms, bool_t bPeriodic, bool_t bDeep) { // ペリフェラルの終了 vAHI_UartDisable(UART_PORT); // UART を解除してから(このコードは入っていなくても動作は同じ) // 他の割り込み源がある場合は停止しておく ; // スリープ割り込みの設定 vAHI_DioSetDirection(PORT_INPUT_MASK, 0); // 対象ポートを入力に設定する (void)u32AHI_DioInterruptStatus(); //割り込み情報のクリア vAHI_DioWakeEnable(PORT_INPUT_MASK, 0); // also use as DIO WAKE SOURCE // vAHI_DioWakeEdge(0, PORT_INPUT_MASK); // 割り込みエッジ(立下りに設定) vAHI_DioWakeEdge(PORT_INPUT_MASK, 0); // 割り込みエッジ(立上がりに設定) // vAHI_DioWakeEnable(0, PORT_INPUT_MASK); // DISABLE DIO WAKE SOURCE // スリープ実行 ToCoNet_vSleep(E_AHI_WAKE_TIMER_0, u32SleepDur_ms, bPeriodic, bDeep); }
※ ToCoNet_vSleep() では、スリープ前に状態遷移関数 (vProcessEvCore() など) に対して E_EVENT_TOCONET_ON_SLEEP を発生させます。状態遷移関数中からの呼び出しでは、自身がもう一度呼び出されるため、ToCoNet_vSleep() は一度だけ呼び出されるように記述します。