更多塔克創新資訊歡迎登陸【塔克社區 www.xtark.cn 】【塔克博客 www.cnblogs.com/xtark/ 】
WS2812B RGB全彩LED燈珠,只需通過一根信號線控制多個燈顯示,本教程使用X-CTR100控制器驅動WS2812燈環。
原理
WS2812B是一個集控制電路與發光電路於一體的智能外控LED光源。其外型與一個5050LED燈珠相同,每個元件即為一個像素點。像素點內部包含了智能數字接口數據鎖存信號整形放大驅動電路,還包含有高精度的內部振盪器和可編程定電流控制部分,有效保證了像素點光的顏色高度一致。
WS2812B為新一代的RGB5050將控制電路與RGB芯片集成在一個5050封裝的元器件中,構成一個完整的外控像素點。
-內置信號整形電路,任何一個像素點收到信號后經過波形整形再輸出,保證線路波形畸變不會累加。
-內置上電復位和掉電復位電路。
-每個像素點的三基色顏色可實現256級亮度顯示,完成16777216種顏色的全真色彩顯示,掃描頻率不低於400Hz/s。
-串行級聯接口,能通過一根信號線完成數據的接收與解碼。
-任意兩點傳傳輸距離在不超過5米時無需增加任何電路。
-當刷新速率30幀/秒時,低速模式級聯數不小於512點,高速模式不小於1024點。
-數據發送速度可達800Kbps。
-光的顏色高度一致,性價比高。
數據協議采用單線歸零碼的通訊方式,像素點在上電復位以后,DIN端接受從控制器傳輸過來的數據,首先送過來的24bit數據被第一個像素點提取后,送到像素點內部的數據鎖存器,剩余的數據經過內部整形處理電路整形放大后通過DO端口開始轉發輸出給下一個級聯的像素點,每經過一個像素點的傳輸,信號減少24bit。像素點采用自動整形轉發技術,使得該像素點的級聯個數不受信號傳送的限制,僅僅受限信號傳輸速度要求。
LED具有低電壓驅動,環保節能,亮度高,散射角度大,一致性好,超低功率,超長壽命等優點。將控制電路集成於LED上面,電路變得更加簡單,體積小,安裝更加簡便。
常用燈條、燈環、點陣
波形時序
例程
本例程實現X-CTR100控制器驅動WS2812全彩LED燈,並設計4種動態顯示效果,撥碼開關實現顯示效果切換。
硬件說明
硬件資源:
- 串口UART1
- TIM3-CH1擴展接口(RH)
- WS2812燈環、燈條或燈帶(需自備)
如下以燈環為例進行說明,燈環連接X-CTR100控制器右側H接口,使用處理器資源TIM3-CH1,燈環為5V供電。
軟件生態
X-SOFT軟件生態,X-API擴展文件如下。
ax_ws2812.c—— WS2812驅動源文件
ax_ws2812.h——WS2812操作接口頭文件
驅動代碼采用DMA+PWM方式,參考正點原子MiniFly四軸源碼,
X-CTR100定時器TIM3產生800KHz(t=1.25us)的PWM,當傳輸bit=0時,設置占空比=0.4us/1.25us;傳輸bit=1時,設置占空比=0.8us/1.25us。
傳輸完所有級聯個數的數據后,再發送50us以上的低電平信號。
接口函數
void AX_WS2812_Init(void); //WS2812初始化 void AX_WS2812_SetColor(uint8_t (*color)[3], uint8_t len); //WS2812設置燈條顏色 |
該驅動可控制最多65536個彩燈,適用所有WS2812燈條、燈帶、燈環、點陣。
控制時序允許產生±150ns誤差,示波器實測時序如下
軟件說明
方便控制,增加設置WS2812燈條為單一RGB顏色函數。
/** * @簡 述 WS2812設置燈條為單一顏色。 * @參 數 red 紅色值 green:綠色值 blue:藍色值 len:燈個數 * @返回值 無 */ void AX_WS2812_SetOneColor(uint8_t red, uint8_t green, uint8_t blue, uint8_t len) {
for(uint8_t i=0; i<len; i++) { ws2812_dispbuf[i][0] = red; ws2812_dispbuf[i][1] = green; ws2812_dispbuf[i][2] = blue; } AX_WS2812_SetColor(ws2812_dispbuf, len); } |
例程代碼實現了4種顯示效果,通過撥碼開關切換,主程序如下。
int main(void) { uint16_t i=0,j=0; u8 res;
//X-CTR100初始化 AX_Init(115200); printf("***X-CTR100 WS2812彩色LED燈例程***\r\n\r\n");
//設置系統中斷優先級分組2 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//WS2812初始化 AX_WS2812_Init();
//顯示黑色(關燈) AX_WS2812_SetOneColor(0,0,0,WS2812_NUM); AX_Delayms(10);
while (1) { res = AX_SW_GetSW12Status();
switch (res) { case 0: //8種顏色循環效果 for(j=0; j<WS2812_NUM; j++ ) { ws2812_dispbuf[j][0] = COLOR_RGB_LIST[i%8][0]; ws2812_dispbuf[j][1] = COLOR_RGB_LIST[i%8][1]; ws2812_dispbuf[j][2] = COLOR_RGB_LIST[i%8][2]; } AX_WS2812_SetColor(ws2812_dispbuf, WS2812_NUM); AX_Delayms(100); i++; break; case 1: //色環轉圈效果 for(j=0; j<WS2812_NUM; j++ ) { ws2812_dispbuf[j][0] = COLOR_RGB_LIST[(j+i)%8][0]; ws2812_dispbuf[j][1] = COLOR_RGB_LIST[(j+i)%8][1]; ws2812_dispbuf[j][2] = COLOR_RGB_LIST[(j+i)%8][2]; } AX_WS2812_SetColor(ws2812_dispbuf, WS2812_NUM); AX_Delayms(30); i++; break; case 2: //藍色呼吸燈效果 for(j=0; j<255; j++) //亮節奏控制 { AX_WS2812_SetOneColor(0,0,j,WS2812_NUM); AX_Delayms(1); } for(j=255; j>0; j--) //滅節奏控制 { AX_WS2812_SetOneColor(0,0,j,WS2812_NUM); AX_Delayms(2); } AX_Delayms(100); break; case 3: //紅色單點轉圈效果 for(j=0; j<WS2812_NUM; j++ ) { ws2812_dispbuf[j][0] = 0; ws2812_dispbuf[j][1] = 0; ws2812_dispbuf[j][2] = 0; } ws2812_dispbuf[i%8][0] = 0xFF; ws2812_dispbuf[i%8][1] = 0x0; ws2812_dispbuf[i%8][2] = 0x0; AX_WS2812_SetColor(ws2812_dispbuf, WS2812_NUM); AX_Delayms(30); i++; break; default: break; } AX_Delayms(10); } } |
特別注意:注意供電能力,單個彩燈白色狀態下最大電流60mA,8個彩燈為480mA,如果彩燈再多,需要考慮USB貢獻是否能帶動,一般電腦USB2.0供電能力為500mA。
如果供電能力不足,也可通過軟件設計優化,每個顏色付值為255時電流最大,可通過減小付值減小電流。
實現效果
顯示效果酷炫,如下。