最近入手一個多彩LED模組 WS2812,使用Arduino要讓它"亮起來"很容易,但我想用Silicon lab的單晶片讓它工作,沒想到比我想像中的困難。

最後的成果是搭配示波器所完成,並且是工作在48MHz的情況下。

單晶片型號:EFM8UB2F64G @ 48MHz

多彩LED模組:WS2812-12

開發環境:Keil uVision V5.38.0.0

參考資料:WS2812B datasheet

我觀察到這一顆單晶片的1個機械週期需要2個系統時脈(不是很確定),效率比"很久之前"學單晶片的12個系統時脈高多了。

程式碼如下:(程式中紅色底的 "delay++" 是延遲用)

程式碼

其實程式碼非常簡單,值得注意的是,for迴圈使用++的方式,跟使用--的方式,編譯出來的效能不同(使用--的方式較快)。變數我用1個位元組的unsigned char,這樣搬來搬去或是運算會比較快。

以示波器觀察如下:

使用單晶片EFM8UB2控制WS2812-12 LED模組

使用單晶片EFM8UB2控制WS2812-12 LED模組

使用單晶片EFM8UB2控制WS2812-12 LED模組

使用單晶片EFM8UB2控制WS2812-12 LED模組

使用單晶片EFM8UB2控制WS2812-12 LED模組

使用單晶片EFM8UB2控制WS2812-12 LED模組

T0L(e)及T1L(e)這兩個是每傳完8個bit (for j迴圈結束)後,跳至下一個8bit時,會有延遲問題。但沒關係,因為這些時間誤差都在WS2812的容許誤差裡(正負150nS)

成果如下:

加上一層衛生紙,有一種朦朧美^^

後記:

使用單晶片EFM8BB1控制WS2812LED模組(組合語言)

 

 

文章標籤
全站熱搜
創作者介紹
創作者 肯特王 的頭像