什么是WS2812B?
WS2812B是一款全彩LED控制IC,單總線控制,何為單總線我的理解就是數(shù)據(jù)線在一根線上傳輸?shù)目刂品绞骄褪菃慰偩€。其實要把燈點亮僅有一根線是不行的,還需要電源線和地線給其供電。
WS2812B燈帶是怎么連接的呢?

就是一顆燈珠串聯(lián)另外一個燈珠,信號通過一根數(shù)據(jù)線相連起來控制等的亮滅就是在這根信號線上發(fā)送數(shù)據(jù)。
WS2812B燈帶的數(shù)據(jù)是什么樣的呢?

在說數(shù)據(jù)格式之前先來補充一下關于色彩的知識點,就是三原色,紅綠藍,也就是我們常說的RGB,R就是RED,G就是GREEN,B就是BLUE,一個彩色可以用這三種顏色的比例來混合出來。
為什么是紅綠藍?
三原色的原理不是出于物理原因,而是由于生理原因造成的。人的眼睛內有幾種辨別顏色的錐形感光細胞,到的刺激略大于辨別綠色的細胞,人的感覺是黃色;如果辨別黃綠色的細胞受到的刺激大大高于辨別綠色的細胞,人的感覺是紅色。雖然三種細胞并不是分別對紅色、綠色和藍色最敏感,但這三種光可以分別對三種錐形細胞產生刺激。
既然“三原色的原理不是出于物理原因,而是由于生理原因造成的”,那么前段所說的“用三種原色的光以不同的比例加合到一起,形成各種顏色的光”顯然就不大合適。使用三原色并不足以重現(xiàn)所有的色彩,準確的說法應該是“將三原色光以不同的比例復合后,對人的眼睛可以形成與各種頻率的可見光等效的色覺?!敝挥心切┰谌纳人x的顏色三角內的顏色,才可以利用三原色的光以非負量相加混合得到。
例如,紅光與綠光按某種比例復合,對三種錐狀細胞刺激后產生的色覺可與眼睛對單純的黃光的色覺等效。但絕不能認為紅光與綠光按某種比例復合后生成黃光,或黃光是由紅光和綠光復合而成的。
24bit數(shù)據(jù)如何構造?
既然是24bit數(shù)據(jù)代表三種顏色,我們就要首先知道一個bit的意義是什么,我們傳統(tǒng)意義上來說1個bit代表一個數(shù)據(jù)位,但是對于數(shù)據(jù)位bit的理解好像就是“1”或者“0”在數(shù)電里我們很容易把高低電平跟邏輯1和邏輯0對應起來,但是表示燈珠的邏輯電平不是簡單的高低電平。
在數(shù)值上0xFFFFFF就是24bit的1,0x000000就是24bit的0.這里有8個bit代表顏色G分量,G7G6G5G4G3G2G1G0,有8個bit代表R分量R7R6R5R4R3R2R1R0,有8個bit代表B分量B7B6B5B4B3B2B1B0,當不同分量組合時候就會有不同的數(shù)據(jù)產生,這個數(shù)據(jù)背后其實是邏輯電平,這里要說明的是彩燈的邏輯“1”并不是簡簡單單的高電平,彩燈的邏輯“0”也不是簡簡單單的低電平。
WS2812B的邏輯“1”和邏輯“0”

由上圖可知“0”碼和“1”碼都是既有高電平又有低電平不過高電平和低電平的比例不同,這點很好理解,重點是分析一下它的特點,首先直觀的特點就是編碼“0”的電平高電平時間短一些低電平時間長一些,這也恰好符合我們的邏輯畢竟它還是低電平多一些的,編碼“1”的電平高電平時間就長一些,而低電平就短一些。
但是不管是高電平還是低電平他們占用整個時間長度是一樣的,這里還有一個很長的低電平這個代表復位信號。
WS2812B控制波形的精準描述如何?
這里涉及到嚴格的數(shù)學描述了,長一點是多長?短一點是多短?這個肯定是有標準或者是約束的

理論上來說,高電平時長和低電平時長加起來應該是0.4us+0.85us或者0.85us+0.4us也就是說總共要占用1.25us的時間才可以編碼出來一個“0”或者“1”出來。復位是要求50us以上,顯然是要比編碼的0或者1占用的時間要多的。
當然既然是電路的高低電平時長就會引入誤差這個在誤差允許的范圍內我們可以接受,這個范圍就是上下不超過150ns這里是ns比us還要小的時間,這個其實時間要求還是很嚴格的。
如何編程實現(xiàn)?
這里我選用我手上一個正點原子開發(fā)板,網(wǎng)上基于這種方式有很多驅動方案,有直接驅動也有PWM驅動也有SPI驅動,還有PWM+DMA驅動,還有用一些開源庫進行驅動的,我感覺各種驅動方式各有優(yōu)缺點,我先來嘗試我認為最容易想到的方式(不一定是最好的或者最合適的)玩一下,后面會根據(jù)這些方式的特點進行一個總結,在相對應的需求下選用合適的方案是我們應該重點考慮的。
實現(xiàn)us級別延時
硬件延時NOP實現(xiàn)
滴答定時器中斷實現(xiàn)
普通定時器實現(xiàn)
先用nop實現(xiàn)個us延時我手上的板子是精英板主控芯片是STM32F103ZET6系統(tǒng)頻率是72M,一個NOP的周期就是1/72M單位是s = 1/72=單位是us,換句話說也就是72個NOP浪費的時間是1us,0.4us就是0.4*72=28.8個NOP取整數(shù)29,0.2個NOP的誤差,因為一個NOP是1/72 1000 個約等于是13.88個ns 所以0.2個NOP引起的誤差在150ns以內可以接受。
0.8572=61.2NOP同樣取整數(shù)61個NOP,這樣組合一下編碼0的波形和編碼1的波形就有了,實現(xiàn)一個 us函數(shù) 50us的低電平也可以產生復位信號,理論分析完畢咱直接上代碼測試。
void RGB_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PA,PD端口時鐘
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //LED0-- >PA.8 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度為50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //根據(jù)設定參數(shù)初始化GPIOA.8
GPIO_ResetBits(GPIOB,GPIO_Pin_12); //PD.2 輸出高
}
void Bit_0(void)
{
GPIO_SetBits(GPIOB,GPIO_Pin_12); //PB12 輸出高
Delay_L();
GPIO_ResetBits(GPIOB,GPIO_Pin_12); //PB12 輸出高
Delay_H();
}
void Bit_1(void)
{
GPIO_ResetBits(GPIOB,GPIO_Pin_12); //PB12 輸出高
Delay_H();
GPIO_SetBits(GPIOB,GPIO_Pin_12); //PB12 輸出高
Delay_L();
}
void RGB_Set(void)
{
for(uint8_t i = 0;i< 8;i++)
{
Bit_1();
}
for(uint8_t i = 0;i< 8;i++)
{
Bit_0();
}
for(uint8_t i = 0;i< 8;i++)
{
Bit_1();
}
// for(uint8_t i = 0;i< 24;i++)
// {
// delay_us(100);
// }
}
void Delay_L(void)
{
__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
}
void Delay_H(void)
{
__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
__nop();
}
-
LED控制
+關注
關注
0文章
42瀏覽量
17249 -
RGB
+關注
關注
4文章
819瀏覽量
61276 -
定時器中斷
+關注
關注
0文章
49瀏覽量
11670 -
PWM驅動
+關注
關注
0文章
28瀏覽量
1542 -
WS2812B
+關注
關注
2文章
40瀏覽量
2803
發(fā)布評論請先 登錄
零知開源——使用 GPIO 模擬時序驅動 WS2812B LED 燈帶
使用ESP8266驅動WS2812B型RGB LED智能燈制作分享
WS2812B RGB全彩LED燈珠
怎樣給WS2812B發(fā)送數(shù)據(jù)呢
基于GD32F427開發(fā)板點亮WS2812B炫彩燈環(huán)的設計實現(xiàn)
Arduino WS2812B LED燈帶設計方案
使用WS2812b Led燈條的diy光劍控制器
適用于Azure Sphere的WS2812B LED燈帶驅動器
零知開源——使用 GPIO 模擬時序驅動 WS2812B LED 燈帶

什么是WS2812B?WS2812B燈帶是怎么連接的呢?
評論