什么是WS2812B?
WS2812B是一款全彩LED控制IC,單總線控制,何為單總線我的理解就是數據線在一根線上傳輸的控制方式就是單總線。其實要把燈點亮僅有一根線是不行的,還需要電源線和地線給其供電。
WS2812B燈帶是怎么連接的呢?
就是一顆燈珠串聯另外一個燈珠,信號通過一根數據線相連起來控制等的亮滅就是在這根信號線上發送數據。
WS2812B燈帶的數據是什么樣的呢?
在說數據格式之前先來補充一下關于色彩的知識點,就是三原色,紅綠藍,也就是我們常說的RGB,R就是RED,G就是GREEN,B就是BLUE,一個彩色可以用這三種顏色的比例來混合出來。
為什么是紅綠藍?
三原色的原理不是出于物理原因,而是由于生理原因造成的。人的眼睛內有幾種辨別顏色的錐形感光細胞,到的刺激略大于辨別綠色的細胞,人的感覺是黃色;如果辨別黃綠色的細胞受到的刺激大大高于辨別綠色的細胞,人的感覺是紅色。雖然三種細胞并不是分別對紅色、綠色和藍色最敏感,但這三種光可以分別對三種錐形細胞產生刺激。
既然“三原色的原理不是出于物理原因,而是由于生理原因造成的”,那么前段所說的“用三種原色的光以不同的比例加合到一起,形成各種顏色的光”顯然就不大合適。使用三原色并不足以重現所有的色彩,準確的說法應該是“將三原色光以不同的比例復合后,對人的眼睛可以形成與各種頻率的可見光等效的色覺。”只有那些在三原色的色度所定義的顏色三角內的顏色,才可以利用三原色的光以非負量相加混合得到。
例如,紅光與綠光按某種比例復合,對三種錐狀細胞刺激后產生的色覺可與眼睛對單純的黃光的色覺等效。但絕不能認為紅光與綠光按某種比例復合后生成黃光,或黃光是由紅光和綠光復合而成的。
24bit數據如何構造?
既然是24bit數據代表三種顏色,我們就要首先知道一個bit的意義是什么,我們傳統意義上來說1個bit代表一個數據位,但是對于數據位bit的理解好像就是“1”或者“0”在數電里我們很容易把高低電平跟邏輯1和邏輯0對應起來,但是表示燈珠的邏輯電平不是簡單的高低電平。
在數值上0xFFFFFF就是24bit的1,0x000000就是24bit的0.這里有8個bit代表顏色G分量,G7G6G5G4G3G2G1G0,有8個bit代表R分量R7R6R5R4R3R2R1R0,有8個bit代表B分量B7B6B5B4B3B2B1B0,當不同分量組合時候就會有不同的數據產生,這個數據背后其實是邏輯電平,這里要說明的是彩燈的邏輯“1”并不是簡簡單單的高電平,彩燈的邏輯“0”也不是簡簡單單的低電平。
WS2812B的邏輯“1”和邏輯“0”
由上圖可知“0”碼和“1”碼都是既有高電平又有低電平不過高電平和低電平的比例不同,這點很好理解,重點是分析一下它的特點,首先直觀的特點就是編碼“0”的電平高電平時間短一些低電平時間長一些,這也恰好符合我們的邏輯畢竟它還是低電平多一些的,編碼“1”的電平高電平時間就長一些,而低電平就短一些。
但是不管是高電平還是低電平他們占用整個時間長度是一樣的,這里還有一個很長的低電平這個代表復位信號。
WS2812B控制波形的精準描述如何?
這里涉及到嚴格的數學描述了,長一點是多長?短一點是多短?這個肯定是有標準或者是約束的
理論上來說,高電平時長和低電平時長加起來應該是0.4us+0.85us或者0.85us+0.4us也就是說總共要占用1.25us的時間才可以編碼出來一個“0”或者“1”出來。復位是要求50us以上,顯然是要比編碼的0或者1占用的時間要多的。
當然既然是電路的高低電平時長就會引入誤差這個在誤差允許的范圍內我們可以接受,這個范圍就是上下不超過150ns這里是ns比us還要小的時間,這個其實時間要求還是很嚴格的。
如何編程實現?
這里我選用我手上一個正點原子開發板,網上基于這種方式有很多驅動方案,有直接驅動也有PWM驅動也有SPI驅動,還有PWM+DMA驅動,還有用一些開源庫進行驅動的,我感覺各種驅動方式各有優缺點,我先來嘗試我認為最容易想到的方式(不一定是最好的或者最合適的)玩一下,后面會根據這些方式的特點進行一個總結,在相對應的需求下選用合適的方案是我們應該重點考慮的。
實現us級別延時
硬件延時NOP實現
滴答定時器中斷實現
普通定時器實現
先用nop實現個us延時我手上的板子是精英板主控芯片是STM32F103ZET6系統頻率是72M,一個NOP的周期就是1/72M單位是s = 1/72=單位是us,換句話說也就是72個NOP浪費的時間是1us,0.4us就是0.4*72=28.8個NOP取整數29,0.2個NOP的誤差,因為一個NOP是1/72 1000 個約等于是13.88個ns 所以0.2個NOP引起的誤差在150ns以內可以接受。
0.8572=61.2NOP同樣取整數61個NOP,這樣組合一下編碼0的波形和編碼1的波形就有了,實現一個 us函數 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); //根據設定參數初始化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文章
39瀏覽量
16896 -
RGB
+關注
關注
4文章
798瀏覽量
58388 -
定時器中斷
+關注
關注
0文章
49瀏覽量
11164 -
PWM驅動
+關注
關注
0文章
28瀏覽量
1193 -
WS2812B
+關注
關注
1文章
38瀏覽量
2152
發布評論請先 登錄
相關推薦
評論