TLC5940 dot correction

2011-11-14 11:55

先日からいろいろと問題があった、TLC5940+Arduino、事の顛末のまとめです。

フルカラーLEDを4灯制御するために、定番のTLC5940ライブラリを使う事にしました。
ハードウェア構成は、

Arduino Fio /w Xbee
TLC5940(DIP)
RGB LED (秋月 OSTCXBTHC1S) x 4
電源 単4eneloop x 3

という感じ。
接続は、arduinoのページ武蔵野電波さん、sparkfun pwm sheildを参考にさせていただきました。(というか、ほぼそのままです。。)LEDに流す電流は、80mAぐらいの計算で外部抵抗を入れました。回路作ってスケッチをアップして問題なく動いていたので、プリント基板を発注、量産しました。問題が発覚したのは、その後でした。
症状としては、
・何らかのタイミングでLEDの色がおかしくなる
・RGB、フル点灯させたときに明らかに色がおかしい。
・ICを一度抜いて、さし直すと色が戻ったりする
・電源投入後、動かし続けている限りは色は、ずれない
と言う感じ。回路も外部抵抗も問題なさそうなので、データシートをじっくり読むことに。で、問題はここにありました。データシートの15ページ目真ん中辺りに

The TLC5940 has operating modes depending on the signals DCPRG and VPRG. Table 4 shows the availableoperating modes. The TPS5940 GS operating mode (see Figure 11 ) and shift register values are not defined after power up. One solution to solve this is to set dot correction data after TLS5940 power-up and switch back to GS PWM mode. The other solution is to overflow the input shift register with 193 bits of dummy data and latch it while TLS540 is in GS PWM mode. The values in the input shift register, DC register and GS register are unknown just after power on. The DC and GS register values should be properly stored through the serial interface before starting the operation.

の記述が。
TLC5940は、LEDの輝度のばらつきをなくすために、各ポートの出力を微調整(64段階)できるdot correctionという機能があるのですが、このレジスタの値は電源投入後、保証されてないのですね。TLC5940のライブラリには、setAllDC(uint8_t value)という関数があります。これで最初にデータを初期化してあげればよさそうです。ただ、dot correctionモードでデータを流すには、TCL5940のVPRGピンをarduinoのD8に接続しておく必要があります。(spark funのシールドは、パッドで切り替えられるようになっていますが、デフォルトではGNDに接続されています。)
ということで、VPRGをD8につなぎ直して、arduino起動時にsetAllDC(63)をやってあげる事で、色がばらつく問題は解決しました。。。

で、なぜかarduinoのライブラリにはポートごとにdot correctionする関数がないので、せっかくなのでキレイに色をそろえられるようにポートごとにdot correction値を設定できるようにTLC5940ライブラリ内のTlc5940.hとTlc5940.cppを修正。
ダウンロード
こんな感じで使えると思います。

#include “Tlc5940.h”
setup(){
Tlc.init();
Tlc.setAllDC(63);
Tlc.setDC(10, 60); //port 10の出力を60/63に
Tlc.updateDC();//dot correctionモードでデータを流す
}

それから、spark funのシールドを使って各ポートに100mAとか流す場合は、レギュレータとICに放熱版をつけないと、発熱で動作がおかしくなります。これも要注意ですね。

というわけで、なにか、間違い等あればご指摘ください。
あと、LEDの色をきちんと計測するためには、どういう機材が適しているのでしょうか。。そろそろ色の計測器が欲しいところです。
ちなみに、TLC5940はEEPROMを内蔵していて、そこにdot correciton値を保存できるのですが、そのためには23Vの電源が必要になります。これは面倒。。今回は、arduino側でEEPROMに補正値を書き込んで、それを起動時に毎回読み出してsetDCしてあげて、、という感じで使っています。


comments