SyntaxHigh

Monday, July 21, 2014

大量のPWMを生成するためのIC

PWM を大量に(10個以上)必要とする場合、それ専用のICを使うのが便利。

PWM用のICは、主にサーボとLEDを駆動するような低電流のものと、フィードバック機能のついたスイッチング・レギュレータ用のものがあるようだ。ここでは前者について書く。主に、LEDを沢山光らせたいとか、サーボを動かしたいとかいう場合。

サーボのみを大量に制御したい場合はそれ専用のモジュールがあるので、そいつを使えばいい。PWMドライバの出力をプルアップすることでサーボに対応できるようにしてある。本作品の場合は、システムの簡易化のために同一のICでLEDとサーボを同時に制御する必要があり、基板を設計する必要があった。

個人でも手に入りやすいのは、TI の TLC594x シリーズと Macroblock の MBI50xx シリーズ。ほぼ性能は同じだが、16bit を安価に実現したいのであれば MBI5026 を使用するのがいいとおもわれる。ここでいう16bitとは、生成できるPWMの幅の細かさ。16bit だと2の16乗の細かさで幅が設定できる。

LED の場合、16bit で制御するメリットはプログラムが楽になることぐらいだろう。12bitの場合はデータを送出するときに少し面倒なことをしないといけない。例えば、マイコンに負担をかけずにデータを送りたい場合、この変換をPCで行う必要がある。

サーボをコントロールしたい場合、16bit だと精度がかなり上がる。サーボにもよるが、一般的な安いサーボだと、12bitで分解能が8bit 程度になってしまう。16bit だと12bit程度の分解能を持つことができる。

MBIシリーズはMBI5030, MBI5040より下のICは内部クロックで動き、PWMの周波数の設定が出来ない。性能的には MBI5030 でも十分だが、高機能版のMBI5040がやすければそれでもいいだろう。

TLC5940

ネット上で最も情報が多く、また不具合報告も多いIC。Arduinoでのライブラリが落ちていたのでこいつを使うことにしたが、サーボをコントロールするにあたって少し修正する必要があった。チュートリアルはたいてい一つICを使って終わっているものが多いが、問題はそれからである。Aliexpress で買えば 2000円/20個、程度で手に入る.

今回の作品を作る上で最も苦労したのがこのICだった。電流を引き込む性質上、IC内部に大量の電流が流れこむ可能性があり、私のような素人が扱うと非常に壊れやすい。例えば、SIN等の入力をHIGHにした状態でICの電源を入れると、内部のMOSFETに大量の電流が流れ壊れる。逆電圧をかけると壊れる、等、あらゆるやってはいけないことがある。さすがにソフト、ハード共に安定してしまえば壊れることはなくなったが、それでも素人には使いにくいICだと思う。だがPWMを扱う以上これ以外にほとんど選択肢がない。

本作ではマイコンを3つ使い、それぞれTLC5940を10,10,5 個ずつシリアルに接続使うことで100個のユニットをコントロールしている。10個のICには40個のサーボと120のLEDが繋がっており、こいつらを正しく機能させるのにかなり時間を要した。

ネットのフォーラムにあるように、主な症状は「flickering」つまりチカチカすること。データが上手く送られていないのが原因だが、パスコンを適当に挟むだけでは解決しない。

この問題の原因は以前のブログで書いたとおり、「SOUTのタイミングがSINのタイミングと異なる」だと思う。SPIにはいくつかのモードがあるが、入力に要求されるモードと、TLC5940自体が出力するSPIのモードが違い、これにより、ラッチが上がった時に次段のICに正しくデータが入力されない(可能性が高い)。この辺りデータシートに書いていないので、どうもごまかされているような感じがする。本作品では、SOUTにローパスを挟んで遅延させることでこの問題を解決している。少なくとも本作ではこの修正でうまく行っている。