ESP-8266でBトレ(第4回 ハードウェア編その4 位相同期...の前ふり)

このブログを、なんと make: さんに紹介していただきました。ビックリ

makezine.jp

make:さんの評判を下げないためにもちゃんと書かねば...

異なるマイコン個体間の位相差

ESP8266では、PWM用のタイマが一つ(※)なので、6セクション分出力しても位相はすべて一致しています。ですので、同一のESP8266配下のセクションの間を列車が渡るときはスムースに通過できます。しかし、おじさんが目的にしている「鉄道運行の模型化」のためには、列車は異なるESP8266配下のセクションを渡っていかなければなりません。 (※ Arduino環境です。ハードウェア的な制約かどうかは調べていません)

異なるマイコンは、それぞれが持っているカウンタからPWM信号を作っていますので、それらの位相は一致していません。また、それぞれ異なる発振器が作る「微妙に異なるクロック」で動いていますので、仮に、ある時点で位相を合わせることができたとしても、やがてずれてしまいます。もし、2つのESP8266のクロックが月差15秒(ありがちなクォーツ時計の精度です)だったとすると、約3分で1msずれます。ESP8266のPWMの周波数は(デフォルトで)1kHzですので、このケースだと約3分で1サイクルずれる計算です。

位相差があると何が問題なのか

となりあうセクションを車両が通り過ぎるとき、一時的に両方のセクションから給電されることになります。給電方式が純直流で、両方からの給電電圧が同じならば、問題は生じません。

しかしPWM制御の場合は、高い電圧の期間と0Vの期間を短い周期で繰り返し、その比率(Duty)を変えることにより、実効(平均)電圧を調節しています。

このような仕組みですので、両方のPWMの位相が一致していれば問題ありませんが、ずれている場合は、そのずれ具合によって実効電圧が変わります。例えばONの電圧が10VでDutyが30%の場合、車両がうける実効電圧は3V~6Vになります。何Vになるかは、そのときどきの位相のずれ具合によって異なります。

f:id:cacao1:20151205122110j:plain

本当かどうか見てみます?

youtu.be

オシロぽちってしまいました...

この状態で車両の走り方をみてみるとこう

youtu.be

位相差をなくすにはどうすればよいか

これではちょっと困るので、どうにかして位相差をなくす必要があります。位相を同期させないで解決するのであれば、たとえば次のような方法が考えらます。。

  1. 次のセクションに入った瞬間に、前のセクションからの給電を止める。

  2. セクションとセクションの間に、どちらからでも給電を受けられるセクション(中間セクション)を設け、列車が中間セクションに完全に入っているうちに給電元を切り替える。

  3. 出力に平滑回路をはさんで純直流(に近い波形)にしてしまう。

それぞれ課題や制限事項があります。1は編成あたり1動力車の列車でないと適用できません。2は中間セクションへの給電を切り替えるための仕組みが必要になります。3は...せっかくのPWMなのに、ちょっともったいないですね。 また、1 2とも、制御対象のセクションが、隣のセクションの情報を得ることが必要になります。WiFi経由で送ってもらうとすると、状況によっては100ms程度かかります。ちょっと遅すぎですので、自力でとなりセクションの情報を得る必要があります。

つづきはオシロの使い方を覚えてから...