SyntaxHigh

Monday, February 24, 2014

TLC5940: BLANK と GSCLK のタイミング

フリッカーは,一瞬だけ起こる.いま.TLC5940 のPWMの周期をサーボもコントロールするために50Hzにしてあるのだけど,LEDの電源が切れる時間もそれぐらいに見える.

このあたりをヒントにすると,「BLANKがちゃんとカウンタをリセット出来ていないのではないか?」という疑問がでてくる

tlc_servo.h の以下の部分

#define SERVO_TIMER1_TOP  20000
#define SERVO_TIMER2_TOP   77

これは,BLANK と GSCLK のタイミングを決めるもの.ちょっと変わったやり方で出力している.

http://garretlab.web.fc2.com/arduino/lab/led_driver/index.html 
によく解析してあって,どうやって値を決めたらいいのかがわかる.

サーボの場合,tlc_servo.hに

/** The top value for GSCLK pulses.  Related to SERVO_TIMER1_TOP by
    \f$\displaystyle SERVO\_TIMER2\_TOP =
        \frac{2 * 8 * SERVO\_TIMER1\_TOP}{4096} - 1 \f$
    The default is 77. */

こうなっていて,-1の部分は,BLANK の Duty Cycle の二倍より少し大きい値を引く,ということになっている.8がかかっているのは prescale が8に設定されているから.

計算はこれで会うのだけど,これだとフリッカーが起こる.

#define SERVO_TIMER1_TOP  19968
#define SERVO_TIMER2_TOP   77

試しにこのようにしてみた.こうするとフリッカーが消える.

この値は,(77+1)*4096/16 = 19968.というふうに決めたもの.上の計算で,余りが出ないようなTOP1の値を逆算した.

GSCLKはいつからカウントをはじめるのだろう?データシートを見てみると,BLANKが下がったあと,GSCLKの立ち上がりでカウンタが増え始める,とある.

カウンタが 4095 になった時点で,カウンタはゼロになり,「すべての出力がゼロになる」とある.次のBLANKが来るまでOFFのままだということになる.

つまり,無駄なカウントをすると出力がゼロになってしまうということになる.

まぁでも,BLANK が少々遅れても,出力がゼロになる時間は非常に短いはずで,(50Hzの1/4096 ぐらいの時間)この場合視認できるほどのフリッカーは生じないはず.

なぜTOP1の値が20000と19968でこれほど違いが生じるのだろう?

仮説として,「GSCLK が HIGH の時に BLANK が HIGH になるとリセットされず,次のGSの周期の間ずっと電流が出力されない」という可能性がでてくる.

上のように TIMER1, 2 のTOPを割り切れる値にすると,少しずつずれていくということがなくなるので,一度波形がかぶらなければずっとかぶらない.

試しに,4096個よりも多いGSCLKを入れてみる.ただし,波形がずれていくことのないよう,16で割り切れる値にする.そのためには,4096+16 個のパルスを送ることになる.この場合,

(77+1)*257 =20046

この場合でのフリッカーは起きない.

試しに
    OCR2B = 70;                // duty factor (as short a pulse as possible)としてみると,
としてみる.

GSCLKがHighになっているにもかかわらず,フリッカーがおこらない.65にすると,BLANKが立ち上がると同時に立ち下がる.

残ったタイミングは BLANK と GSCLK が同時に立ち上がる,というもの.これをちょっと再現するには,ちょっと計算をしないといけない.

とにかくTOPを合わせればうまくいっているのでこれで再度10個のテストをする.

No comments:

Post a Comment