neopixel

NeoPixel

シリアル通信で発光制御可能なLED全般として呼ぶ。
stm32の場合、タイマーを使う方法、シリアル通信(UART,SPI等)を使う方法がある。

0、1の信号をPWMタイマーのDutyで再現し、DMAを用いて周期毎にDutyを更新する。
この場合、一回につき24つのDutyの設定が必要になる。シリアルでつなぐLEDの数が増えるとそれに合わせて設定用配列がどんどん大きくなることには注意する。

周期の計算をしてみる。

マイコン内蔵RGBLED WS2812C-2020より引用(2025年11月1日閲覧)
それぞれのCode(0,1)を満たすようにPWMの周期を決定したい。 $$ \rm{T0L}+\rm{T0H}=\rm{T1L}+\rm{T1H}=\rm{PWM\_Period} $$ の関係を満たすように値を選択したい。すべての要素が等しくマージンを取れるような値としては、$\rm{PWM\_{Period}}=\rm{1270ns}$として、

時間(ns)
T0H 325
T1H 635
T0L 945
T1L 635

とすれば良い。この組み合わせではすべての要素が等しく55nsのマージンを有する。
しかし、タイマーでの実装の容易さを考えると、$\rm{PWM\_{Period}}=\rm{1200ns}$として、

時間(ns)
T0H 300
T1H 600
T0L 900
T1L 600

とするほうが良さそう。T1H,T1Lのマージンが20nsに減ってしまうが、タイマーでの実装の際は最大300nsが作れれば組み合わせはどうとでもなる。上の方法だと5nsを作れないといけない。

参考文献

  • neopixel.txt
  • 最終更新: 2025/11/01
  • by yuqlid