秋月で購入したフルカラーLEDの制御をESP32のRMTで行うため、データ転送のタイミングなどをちょっと調査してみた。調査することを決めたのは秋月のページにあるデバイスのデータシートがちぐはぐだったので。
データシート
秋月のページからデバイスのデータシートを見たところ、本体と搭載されているチップについてのPDFは見つかった。なのだがチップとLED側の記載に違いが結構あるではないか。
単位はμ秒。
T0H | T0L | T1H | T1L | RESET(L) | |
Pl9823 | 0.35 | 1.36 | 1.36 | 0.35 | ≧50 |
WS2811(Low) | 0.5 | 2.0 | 1.2 | 1.3 | ≧50 |
WS2811(High) | 0.25 | 1.0 | 0.6 | 0.75 | ≧50 |
WS2811のHighモードは「It is one half of the time when high speed mode(reset time unchanged)」とNoteに記載があったので半分にしている。
確認
10MHzに分周して設定可能なデータの時間単位を100nsにし、RMTを使って送信するプログラムを組みLEDが指定した設定内容で光るかどうかを試してみた。
LEDは2個カスケードでつなぎ3個分のデータを送信してみて、1,2個目のDIと2個めのDOの信号の内容をロジックアナライザでも確認をして見る。
ロジックアナライザの結果は1段目が1個めLEDのDI、2段目が2個めLEDのDI、3段目が2個めLEDのDOになっている。
Pl9823のタイミング
100ns単位なので、以下の様なタイミングでデータを送信してみた。
仕様書には±150nsまでが許容範囲なので問題ないだろうと思う。
T0H | T0L | T1H | T1L | RESET(L) | |
Pl9823 | 0.3 | 1.4 | 1.4 | 0.4 | ≧50 |
結果としては問題なく動作した。
ロジックアナライザの結果は以下の通り。
LEDから出るDOのタイミングが仕様とは異なるタイミングで出力されていた。
T0H | T0L | T1H | T1L | RESET(L) | |
Pl9823 DO | 0.42 | 1.28 | 0.82 | 0.88 |
LEDから出力されるタイミングなので、想像するにこれが正しいタイミングなのだろう。
WS2811(Low)
T0H | T0L | T1H | T1L | RESET(L) | |
WS2811(Low) | 0.5 | 2.0 | 1.2 | 1.3 | ≧50 |
次は上のタイミング。
こちらも問題なくLEDは発光した。
ロジックアナライザの結果は以下の通り。
T0H | T0L | T1H | T1L | RESET(L) | |
WS2811(Low) DO | 0.42 | 2.08 | 0.84 | 1.66 |
HighのタイミングのみPl9823 DOと同じ時間になっている。
WS2811(High)
T0H | T0L | T1H | T1L | RESET(L) | |
WS2811(High) | 0.25 | 1.0 | 0.6 | 0.75 | ≧50 |
上のタイミングでやってみたところLEDは正常に表示されなかった。
ロジックアナライザの結果は以下の通り。
1の出力タイミングもDOの結果を見る限り0として認識されているようだ。
DOの結果を使った場合
先の結果、DOのタイミングが正しいのではないかと認識し、以下のタイミングでまず挑戦。
T0H | T0L | T1H | T1L | RESET(L) | |
DO | 0.4 | 1.3 | 0.8 | 0.9 | ≧50 |
結果としては問題なくLEDの表示は行うことができた。
ロジックアナライザの結果は以下の通り。
3段ともほぼ同じタイミングになっているので、この結果が正しいのだろうと思う。
次にPL9823は800kHzで動くということなので、Low側のタイミングを調整して800kHzで動作するかどうか確認してみた。
T0H | T0L | T1H | T1L | RESET(L) | |
DO | 0.4 | 0.8 | 0.8 | 0.4 | ≧50 |
こちらも問題なく動作した。動作周波数としては800kHzをちょっと越したことになってしまったが。
ロジックアナライザの結果は以下の通り。
こちらも3段ともほぼ同じタイミングになっている。
追記 2021/07/21
タイミングに関してちょっと調べてみたところ、秋月の「マイコン内蔵RGBLED WS2812B」からリンクされている「WS2812B PDFデータシート(以前のロット、ご参考)」のデータシート内のタイミングが、今回調べたものと一致していた。
下の表の旧WS2812Bというやつ。
T0H | T0L | T1H | T1L | RESET(L) | |
旧WS2812B | 0.4 | 0.85 | 0.8 | 0.45 | ≧50 |
新WS2812B | 0.22~0.38 | 0.58~1.0 | 0.58~1.0 | 0.58~1.0 | ≧280 |
こうも情報が錯綜していると、デバイスにあったプログラムを作成するのは結構面倒だなと思った。
コメント