RGB三色燈珠WS2812B WS2815B

2021-09-17 22:29:39 字數 2470 閱讀 1693

ws2812b/ws2815b均為rgb三色燈珠,ws2815b是ws2812b的公升級版,區別在於兩點,首先是供電電壓由5v變為了12v供電,有效的降低了整個畫素點的工作電流,降低線路板壓降,最大限度保證畫素點在很遠距離傳輸時達到良好的混光一致性。其次是額外增加了一路訊號線,在單個畫素點損壞的情況下,不影響整體顯示效果。

每個燈珠控制需要24位資料,8bit綠色亮度+8bit紅色亮度+8bit藍色亮度,每個畫素點的三基色顏色可實現256級亮度顯示,完成16777216種顏色的全真色彩顯示。 典型電路我們由ws2812b說起,燈帶上的燈珠供電併聯,訊號線「串聯」。訊號由di進到燈珠,燈珠在「吃掉」(鎖存)24bit資料後,將剩餘資料整形放大後通過do埠輸出給下乙個級聯的燈珠,每經過乙個燈珠的傳輸,訊號減少24bit。當燈珠接收到280μs以上的reset資料,燈珠根據自己鎖存的資料完成對rgb三色燈的控制。24位資料採用歸零碼編碼,bit資料為高時,傳送1碼,bit資料為低時,傳送0碼。

ws2815b多了乙個bin引腳,這個引腳接前乙個燈珠的di腳(燈帶第乙個燈珠接地)。bin端接收到資料訊號丟棄24bit資料後,再將din接收的資料訊號與bin斷進行比較,若din端無訊號,bin端有接收到訊號,切換到bin端接收輸入訊號,這種措施可以確保在單個燈珠損壞時不至於影響到其餘的燈珠,但是如果連續兩個燈珠損壞,依然會導致後邊的燈珠不受控制。

兩種燈珠需要不同的燈板(燈珠封裝不同),但是兩種燈珠需要的嵌入式軟體是一樣的(資料的定義以及歸零碼的碼制可以是一樣的)

在嵌入式傳輸**的實現上。一般都存在兩種方式,一種為io口模擬,這種方式一般見以前玩51微控制器的嵌入式工程師,諸如i2c,spi等常見的通訊協議匯流排都習慣用io口去模擬時序。對於ws281xb的通訊協議,沒有像spi這種硬體幫我們實現的通訊介面,這麼看來用io口去模擬是乙個擺在桌面的實現方式。但是io口模擬存在乙個致命弱點,那就中斷會打斷你的時序模擬。以10個燈珠的控制為例,當你的**正在模擬時序發到控制第10個燈還沒有發的時候,中斷來了,這個時候io口正好被模擬程式控制為低,然後晶元去執行相應的中斷處理程式,執行了超過280μs(reset),執行完再回來繼續傳送第十個燈珠的資料,這時你會發現,你傳送控制的第10個燈珠的資料其實傳送給了第乙個燈珠,因為兩個資料之間因為中斷的原因夾雜了乙個reset碼。

我們採取的是spi+dma的方法來實現,使用晶元內部的spi控制器去傳送燈珠的控制資料,又因為我們採用的是dma傳送,能夠保證中斷來的時候晶元能依然準確的按照時序傳送我們控制燈珠的資料。

我的實現是在stm32f10x系列的mcu,時鐘的情況如下:

我使用的是spi3,初始化**如下:

void

spi3_init

(void

)

當我們傳送使用上述配置的spi傳送0xe0(11100000)時,spi傳送引腳高電平持續時間為111ns3=333ns,低電平時間持續的時間為111ns5=550,因為spi為逐字節傳送,用示波器量得spi傳送位元組之間的間隙時間大約是100ns左右,則連續傳送8位元組數,則低電平持續的時間為550ns+100ns=650ns,正符合ws281xb對0碼的要求。

於是,我們用傳送一位元組資料0xe0來模擬傳送乙個0碼。同理可得用0xfc傳送1碼。用連續310個0x00來模擬傳送reset碼。**如下:

unsigned

char pixelbuffer[pixelnumber*24+

310]=;

void

dma2_star_spi_tx()

void

set_all_pixel_color

(uint8_t r, uint8_t g, uint8_t b)

}void

ws281x_set_pixel

(uint32_t color,uint32_t position)

//void

ws281x_set_bits

(uint8_t bits,uint32_t position)

}uint32_t color_show

(uint8_t r, uint8_t g, uint8_t b)

下面的**片是我們測試燈帶的主函式,主要實現的是三色迴圈點亮。

int

main

(void)}

}

Arduino藍芽控制三色燈

最近開始研究arduino,網上關於arduino的材料,特別是中文的,不是很多。所以想要把自己實現的每一步都給記錄一下。以後如果忘了,可以再看看。看到網上有不少人實現用藍芽控制小燈,所以自己也動手小geek一下。藍芽模組用的是 買的,40塊錢乙個,雖說也有貴的,但是便宜的感覺功能上差不多。這裡用到...

Arduino藍芽控制三色燈

最近開始研究arduino,網上關於arduino的材料,特別是中文的,不是很多。所以想要把自己實現的每一步都給記錄一下。以後如果忘了,可以再看看。看到網上有不少人實現用藍芽控制小燈,所以自己也動手小geek一下。藍芽模組用的是 買的,40塊錢乙個,雖說也有貴的,但是便宜的感覺功能上差不多。這裡用到...

7 17 mmh學長的三色燈 20分

題目初步轉化出條件 n為1或者2的時候是特殊情況,因為對於燈成環來說,對於這兩個特殊情況是無效的 進一步轉化 這個題一定是有規律可循的,我們可以看到,n取得是1e6,一般就是寫乙個o n 的演算法 對於有n個燈的情況中,我們可以發現,當n 1與1是不同顏色的情況下,n這個位置只有一種可能,當n 1與...