PICマイコンのBOR機能を設定する 2014.6.10


     4足歩行ロボットの製作を終えてから、今、また別のロボットの製作に取り組んでいます。サーボモータを7個使った、手足の動く2足歩行ロボットです。着ぐるみにより、「ふなっしー」型のロボットとなることを目指しています。その製作途中で起こった話です。

     今までのマイコン工作では、ACアダプタの抜き差しで電源を切り入りしており、特に電源スィッチなどは必要ありませんでしたが、今回の製作では、マイコン回路は電池とともに着ぐるみの中に格納する予定ですので、ロボットの頭部にあたる位置に、オルタネート型のプッシュスィッチによる電源スィッチを設けることとしました。

     回路を組み上げて、マイコンプログラムの動作確認をしている時に、ちょっと困ったことが起こりました。一旦電源スィッチを入れて回路が動いている時に、電源スィッチの切り、入りを素早く繰り返すと、マイコン回路が再起動もぜず、うまく動かなくなります。電源を切って、暫く時間(数秒)をおいて入れ直した時には、正常に立ち上がります。

     なぜ、こんなことが起こるのか、ちょっと考えて見ました。

     製作した回路を右に示します。電源ICの入力側には、1000uF、出力側には、220uF、更に、オーディオICの電源部分に100uFの合わせて1320uFの電解コンデンサを取り付けています。これらにより、スィッチの素早い切り、入りは、電源断ではなく電源瞬断となります。

     使用しているマイコンdsPIC30F3012は、電源電圧2.5V〜5.5Vの範囲で動きますので、2.5Vまで低下しない限りは、何も問題は起こらないはずです。確かにリセットはしていませんが、ハングアップ状態となってしまっています。電源断時間が長い場合には、パワーオンリセットにより立ち上がり直すので問題ありません。

     dsPIC30F3012は、電源電圧+5Vでは、約30MHzのクロックで動作しますが、低電圧では、クロックを落とさないとうまく動きません。今回の製作では、+5Vで動かすことを前提に、クロック設定は、29.48MHzにしていますので、これが原因だと思われます。電源電圧が瞬時低下した時に、クロック異常となりハングアップ状態に陥っているのだと考えられます。

     一度電源を切った後は、数秒間待って電源を入れればよいのですが、テスト中には、まどろこしいものです。なんとかならないものでしょうか。電解コンデンサを少なくするとか、あるいは、もっと電源を消費するような回路にして、電源瞬断ではなく確実に電源断となるようにすればよいのかも知れませんが、これでは、ちょっと後ろ向きです。

     dsPIC30Fだけでなく最近のPICには、ブラウンアウトリセット機能というものがあります。これは、電源電圧の低下を検出したらリセットするというものです。電源電圧が復帰したらパワーオンリセットから再起動します。

     この機能は、コンフィグレーションで設定します。現在のコンフィグレーションは、次のようになっています。

      _FOSC(CSW_FSCM_OFF & FRC_PLL16) // Clock Switching Disabled, FRC w/PLL 16x
      _FWDT(WDT_OFF) // watchdog Timer Disabled
      _FBORPOR(PBOR_OFF & MCLR_EN)  // Brown Out Reset Disabled, MCLR Enabled
      _FGS(CODE_PROT_OFF) // Code Segment Write Protect Diabled
      _FICD(ICS_PGD) // Use PGC and PGD

     ウォッチドッグタイマーやコードプロテクト、ブラウンアウトなどは、いつも外しています。組み込み機器の製品ともなれば、これらの設定を考慮すべきですが、アマチュアの工作では、なくてもいいとの判断です。

     今回は、電源電圧低下で確実にリセットしてくれるよう、次のような設定にしました。

      _FOSC(CSW_FSCM_OFF & FRC_PLL16) // Clock Switching Disabled, FRC w/PLL 16x
      _FWDT(WDT_OFF) // watchdog Timer Disabled
      _FBORPOR(BORV_42 & MCLR_EN)    // Brown Out Voltage 4.2V, MCLR Enabled
      _FGS(CODE_PROT_OFF) // Code Segment Write Protect Diabled
      _FICD(ICS_PGD) // Use PGC and PGD

    電源電圧が、4.2Vまで低下するとリセットするようにしました。設定できる値には、もう一段上の、BORV_45(4.5V)がありますが、この設定は、データシートによると、4.58V~4.73Vの範囲で検出するとあります。電源電圧の変動にたいする検出マージンを考慮して、今回は、低い方の値を採用しました。

     なお、電源電圧+3.3Vで使う時には、この設定は外すか、もしくは、BORV_27(2.7V)にしなければ、うまく動かないことになります。

    さて、このようにブラウンアウトリセットを有効にして、素早い電源スィッチの切り、入りを試して見ました所、マイコンは確実にリセットし、再起動してくれるようになりました。これで一つストレスが解消されました。