WS2812RGB燈的控制學習

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);
	}
}
//.......

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章