mbed の NeoPixel ライブラリがおかしい件、
やはり波形を細かく見てみないとダメだと言うことで、
ズームアップしてみました。
特におかしなところは無さそうに見えます。
こちらがArduino UNO の波形です。
比較しても、違いが有るようには見えません。
しょうがないので、表示がおかしくなっているところの波形を見てみます。
このLEDは自分の分(24ビット)を取り込むと、それ以降を後段にスルーします。
だから、後ろの方になるとデータが少なくなります。
なんじゃこら!
明らかにLの時間が長いところがあります。
元は有ったパルスが消えているようです。
だから表示がおかしくなったと言うわけです。
改めてmbed直後の信号波形を見てみると、
長いパルスが連続するとLの時間がだんだん短くなっているみたいです。
測ってみると
330nsしかありません。
その直前のLの時間は
440nsあります。
WS2812のスペックでは
T1L = 600 ± 150 ns なので、アウトですが、
WS2812Bのスペックでは
T1L = 450 ± 150 ns なので、OKなはずです。
実際、私の基板はWS2812Bです。
いやいや、そもそもデータシートの書き方が違うだけで
デバイスの正味のスレッショルドは600nsあたりにあることが分かっています。
では、なぜビットが抜ける現象が起こったのでしょうか。
改めて、ビット周期を測ってみます。
ビットが抜けたところは2.4μsになっています。
これは2ビット分なので、ビット周期は1.2μsです。
800kbpsだと1.25μsなので、少し短いのです。
そこで、改めてArduinoの波形と比べてみると、
mbedの方が、見て分かるくらいジッタが大きいです。
どうもジッタのせいで周期が短くなった時にビット抜けが
発生したようです。
やはり、このライブラリは素性が良くありません。
波形発生の処理方法に問題がありそうです。
やはり波形を細かく見てみないとダメだと言うことで、
ズームアップしてみました。
特におかしなところは無さそうに見えます。
こちらがArduino UNO の波形です。
比較しても、違いが有るようには見えません。
しょうがないので、表示がおかしくなっているところの波形を見てみます。
このLEDは自分の分(24ビット)を取り込むと、それ以降を後段にスルーします。
だから、後ろの方になるとデータが少なくなります。
なんじゃこら!
明らかにLの時間が長いところがあります。
元は有ったパルスが消えているようです。
だから表示がおかしくなったと言うわけです。
改めてmbed直後の信号波形を見てみると、
長いパルスが連続するとLの時間がだんだん短くなっているみたいです。
測ってみると
330nsしかありません。
その直前のLの時間は
440nsあります。
WS2812のスペックでは
T1L = 600 ± 150 ns なので、アウトですが、
WS2812Bのスペックでは
T1L = 450 ± 150 ns なので、OKなはずです。
実際、私の基板はWS2812Bです。
いやいや、そもそもデータシートの書き方が違うだけで
デバイスの正味のスレッショルドは600nsあたりにあることが分かっています。
では、なぜビットが抜ける現象が起こったのでしょうか。
改めて、ビット周期を測ってみます。
ビットが抜けたところは2.4μsになっています。
これは2ビット分なので、ビット周期は1.2μsです。
800kbpsだと1.25μsなので、少し短いのです。
そこで、改めてArduinoの波形と比べてみると、
mbedの方が、見て分かるくらいジッタが大きいです。
どうもジッタのせいで周期が短くなった時にビット抜けが
発生したようです。
やはり、このライブラリは素性が良くありません。
波形発生の処理方法に問題がありそうです。
※コメント投稿者のブログIDはブログ作成者のみに通知されます