WS2812RGB
WS2812/2811只需一根信號線就能控制燈帶上所有led。多個燈帶間可以通過串聯輕鬆延長。在30hz的刷新頻率下一個信號線能夠控制至多500個led。
原理
WS2812B是一個集控制電路與發光電路於一體的智能外控LED光源。其外型與一個5050LED燈珠相同,每個元件即爲一個像素點。像素點內部包含了智能數字接口數據鎖存信號整形放大驅動電路,還包含有高精度的內部振盪器和可編程定電流控制部分,有效保證了像素點光的顏色高度一致。
WS2812B爲新一代的RGB5050將控制電路與RGB芯片集成在一個5050封裝的元器件中,構成一個完整的外控像素點。
-內置信號整形電路,任何一個像素點收到信號後經過波形整形再輸出,保證線路波形畸變不會累加。
-內置上電覆位和掉電覆位電路。
-每個像素點的三基色顏色可實現**256級亮度顯示**,完成16777216種顏色的全真色彩顯示,掃描頻率不低於400Hz/s。
-**串行級聯接口**,能通過一根信號線完成數據的接收與解碼。
-任意兩點傳傳輸距離在不超過**5米**時無需增加任何電路。
-當刷新速率30幀/秒時,低速模式級聯數不小於512點,高速模式不小於1024點。
-數據發送速度可達**800Kbps**。
-光的顏色高度一致,性價比高。
數據協議採用單線歸零碼的通訊方式,像素點在上電覆位以後,DIN端接受從控制器傳輸過來的數據,首先送過來的24bit數據被第一個像素點提取後,送到像素點內部的數據鎖存器,剩餘的數據經過內部整形處理電路整形放大後通過DO端口開始轉發輸出給下一個級聯的像素點,每經過一個像素點的傳輸,信號減少24bit。像素點採用自動整形轉發技術,使得該像素點的級聯個數不受信號傳送的限制,僅僅受限信號傳輸速度要求。
LED具有低電壓驅動,環保節能,亮度高,散射角度大,一致性好,超低功率,超長壽命等優點。將控制電路集成於LED上面,電路變得更加簡單,體積小,安裝更加簡便。
程序實現:
使用的NRF51822去實現。參考小馬哥飛控程序中的LED。
#define RGB_H (NRF_GPIO->OUTSET = (1UL << RGB_LED)) //RGB 對應管腳設置 高電平
#define RGB_L (NRF_GPIO->OUTCLR = (1UL << RGB_LED)) //RGB 對應管腳設置 高電平
/*
初始化RGB_LED
*/
void LED_GPIO_Configuration(void)
{
nrf_gpio_cfg(
RGB_LED,
NRF_GPIO_PIN_DIR_OUTPUT,
NRF_GPIO_PIN_INPUT_DISCONNECT,
NRF_GPIO_PIN_PULLUP,
NRF_GPIO_PIN_S0S1,
NRF_GPIO_PIN_NOSENSE);
}
/*
寫 0碼 函數
根據RGB燈手冊查得 :RGB_H 延時 300ns,RGB_L 延時 900ns
RGB_H,RGB_L之間的延時,根據不同芯片的主頻實際調節__nop()函數的個數(以下nop個數未知)
*/
void Write0(void)
{
RGB_H;
__nop();__nop();__nop();
RGB_L;
__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
}
/*
寫 1碼 函數
根據RGB燈手冊查得 :RGB_H 延時 600ns,RGB_L 延時 600ns
RGB_H,RGB_L之間的延時,根據不同芯片的主頻實際調節__nop()函數的個數
*/
void Write1(void)
{
RGB_H;
__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
__nop();__nop();__nop();_
RGB_L;
__nop();__nop();__nop();__nop();__nop();__nop();
}
/*
寫一個字節(8bit)數據
備 注: RGB的亮度通過更改 0x01 處的值進行調節
*/
void RGB_WByte(uint8_t byte)
{
uint8_t i=0;
for(i=0;i<8;i++)
{
if((byte<<i)&0x01)
Write1();
else
Write0();
}
}
/*
設置一個RGB燈的色彩
green red blue,紅綠藍光所佔比例大小,範圍0~255
燈亮的順序爲GRB,每種顏色佔8位數據,因此一個燈需要寫24位數據
*/
void Write24Bit(uint8_t green, uint8_t red, uint8_t blue)
{
RGB_WByte(green);
RGB_WByte(red);
RGB_WByte(blue);
}
/*
紅燈
*/
void RGB_LED_Red(void)
{
Write24Bit(0,0xff,0);
}
/*
橙燈
*/
void RGB_LED_Orange(void)
{
for(i=0;i<4;i++) //4個燈
{
Write24Bit(0xa5,0xff,0x00);
}
}
/*
藍燈
*/
void RGB_LED_Off(void)
{
uint8_t i;
for(i=0;i<4;i++) //四個燈
{
Write24Bit(0,0,0);
}
}
//.......