一、WS2812模塊簡(jiǎn)介
WS2812是一個(gè)集控制電路與發(fā)光電路于一體的智能外控LED光源。其外型與一個(gè)5050LED燈珠相同,每個(gè)元件即為一個(gè)像素點(diǎn)。像素點(diǎn)內(nèi)部包含了智能數(shù)字接口數(shù)據(jù)鎖存信號(hào)整形放大驅(qū)動(dòng)電路,還包含有高精度的內(nèi)部振蕩器和12V高壓可編程定電流控制部分,有效保證了像素點(diǎn)光的顏色高度一致。
數(shù)據(jù)協(xié)議采用單線歸零碼的通訊方式,像素點(diǎn)在上電復(fù)位以后,DIN端接受從控制器傳輸過(guò)來(lái)的數(shù)據(jù),首先送過(guò)來(lái)的24bit數(shù)據(jù)被第一個(gè)像素點(diǎn)提取后,送到像素點(diǎn)內(nèi)部的數(shù)據(jù)鎖存器,剩余的數(shù)據(jù)經(jīng)過(guò)內(nèi)部整形處理電路整形放大后通過(guò)DO端口開(kāi)始轉(zhuǎn)發(fā)輸出給下一個(gè)級(jí)聯(lián)的像素點(diǎn),每經(jīng)過(guò)一個(gè)像素點(diǎn)的傳輸,信號(hào)減少24bit。像素點(diǎn)采用自動(dòng)整形轉(zhuǎn)發(fā)技術(shù),使得該像素點(diǎn)的級(jí)聯(lián)個(gè)數(shù)不受信號(hào)傳送的限制,僅僅受限信號(hào)傳輸速度要求。
LED具有低電壓驅(qū)動(dòng),環(huán)保節(jié)能,亮度高,散射角度大,一致性好,超低功率,超長(zhǎng)壽命等優(yōu)點(diǎn)。將控制電路集成于LED上面,電路變得更加簡(jiǎn)單,體積小,安裝更加簡(jiǎn)便。
二、主要特點(diǎn)與LED特性參數(shù)
- 特點(diǎn)
● 控制電路與RGB芯片集成在一個(gè)5050封裝的元器件中,構(gòu)成一個(gè)完整的外控像素點(diǎn)。
● 內(nèi)置信號(hào)整形電路,任何一個(gè)像素點(diǎn)收到信號(hào)后經(jīng)過(guò)波形整形再輸出,保證線路波形畸變不會(huì)累加。
● 內(nèi)置上電復(fù)位和掉電復(fù)位電路。
● 每個(gè)像素點(diǎn)的三基色顏色可實(shí)現(xiàn)256級(jí)亮度顯示,完成16777216種顏色的全真色彩顯示,掃描頻率不低于400Hz/s。
● 串行級(jí)聯(lián)接口,能通過(guò)一根信號(hào)線完成數(shù)據(jù)的接收與解碼。
● 任意兩點(diǎn)傳傳輸距離在不超過(guò)5米時(shí)無(wú)需增加任何電路。
● 當(dāng)刷新速率30幀/秒時(shí),低速模式級(jí)聯(lián)數(shù)不小于512點(diǎn),高速模式不小于1024點(diǎn)。
● 數(shù)據(jù)發(fā)送速度可達(dá)800Kbps。
● 光的顏色高度一致,性價(jià)比高。 - LED參數(shù)

三、模塊引腳定義
| VCC | 輸入電壓正極 |
|---|---|
| GND | 輸入電壓負(fù)極 |
| DI | 數(shù)據(jù)輸入 |
| DO | 數(shù)據(jù)輸出,與下一聯(lián)級(jí)的DI連接 |
四、工作原理與數(shù)據(jù)協(xié)議
工作原理
- 高度集成的像素級(jí)控制
WS2812 本質(zhì)上是將一個(gè)小型控制器和 3 顆小功率 LED 集成在一起的智能光源?。其封裝內(nèi)包含:
- 精密振蕩器:提供約 800 kHz 的時(shí)鐘參考,確保協(xié)議時(shí)序穩(wěn)定;?
- 數(shù)字移位寄存器:按順序接收并鎖存 24 bit 的顏色數(shù)據(jù);?
- 信號(hào)重塑單元:對(duì)接收到的微弱信號(hào)進(jìn)行再生放大,保證后級(jí)級(jí)聯(lián)時(shí)信號(hào)不失真;?
- 恒流驅(qū)動(dòng)模塊:為 R、G、B 三色 LED 提供精確的驅(qū)動(dòng)電流,保證色彩一致性;?
- 信號(hào)重塑與級(jí)聯(lián)能力
當(dāng)?shù)谝活w WS2812 接收到完整的 24 bit 數(shù)據(jù)并將其鎖存后,余下的數(shù)據(jù)(即除自身所用的 24 bit 外)會(huì)被 信號(hào)重塑電路 放大并輸出到 DOUT,引入下一級(jí)的 DIN 端?。這一機(jī)制使得即使在長(zhǎng)鏈(理論上可達(dá)數(shù)千點(diǎn))中,每一級(jí)仍能收到清晰、符合時(shí)序的波形,無(wú)需額外的中繼或放大器。
數(shù)據(jù)協(xié)議
- 單線編碼
WS2812 只需一根數(shù)據(jù)線即可傳輸所有信息,協(xié)議利用“高電平時(shí)長(zhǎng)”區(qū)分 0/1:
‘0’ 碼:高電平約 0.35 μs(±150 ns),低電平約 0.8 μs,總周期 ≈ 1.25 μs;?
‘1’ 碼:高電平約 0.7 μs,低電平約 0.6 μs,總周期 ≈ 1.25 μs;?
這種編碼在高電平和低電平上都不歸零于同一電平,不僅簡(jiǎn)化了硬件設(shè)計(jì),還提升了抗抖動(dòng)能力。

- 24 Bit 數(shù)據(jù)格式
每個(gè)像素點(diǎn)需要 24 bit,按 G7…G0 → R7…R0 → B7…B0 的順序依次發(fā)送?。例如,要顯示純綠(255,0,0),主控會(huì)發(fā)送:11111111 00000000 00000000;其中 11111111 對(duì)應(yīng)十進(jìn)制 255 的綠色通道,高位先發(fā)。
- 復(fù)位與數(shù)據(jù)鎖存
在一連串 24 bit 數(shù)據(jù)發(fā)送完畢后,必須將數(shù)據(jù)線拉低 > 50 μs,WS2812 內(nèi)部的移位寄存器才會(huì)被復(fù)位并將新接收的數(shù)據(jù)輸出到 LED 驅(qū)動(dòng)單元,否則會(huì)出現(xiàn)刷新失敗?。 - 總線級(jí)聯(lián)
WS2812 擁有內(nèi)置信號(hào)整形功能,能將余下的數(shù)據(jù)完整透?jìng)髦料乱患?jí),無(wú)需中斷或額外控制。這使得在同一根數(shù)據(jù)線下,可以串聯(lián)數(shù)十、乃至上千顆 WS2812,主控只需一次完整的數(shù)據(jù)發(fā)送即可更新整條鏈?。
通過(guò)上述工作原理與協(xié)議解讀,在有多個(gè)led級(jí)聯(lián)的情況下,先發(fā)送第一個(gè)led的數(shù)據(jù),后第二個(gè)、第三個(gè)、以此類推。
五、STM32F103C8T6驅(qū)動(dòng)示例
1.引腳接線
| STM32F103C8T6 | WS2812 |
|---|---|
| 5V | 5V,注意:如果多個(gè)級(jí)聯(lián)要外接電源,不要用單片機(jī)的5V |
| GND | GND |
| PA0 | DI |
| 2. 代碼示例 | |
| WS2812.c |
#include "ws2812.h"
void WS2812_Init(void) {
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
DMA_InitTypeDef DMA_InitStructure;
//使能 TIM2、DMA1 和 GPIOA 時(shí)鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // TIM2 定時(shí)器時(shí)鐘
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); // DMA1 總線時(shí)鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // GPIOA 時(shí)鐘
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
TIM_InternalClockConfig(TIM2);
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period = 90 - 1; //ARR
TIM_TimeBaseInitStructure.TIM_Prescaler = 1 - 1; //PSC
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
TIM_OCStructInit(&TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0; //CCR
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
DMA_DeInit(DMA1_Channel2);
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&TIM2- >CCR1;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)My_ws_buf;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_BufferSize = 0;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_Init(DMA1_Channel2, &DMA_InitStructure);
TIM_DMACmd(TIM2, TIM_DMA_Update, ENABLE);
}
/**
* @brief 設(shè)置單顆 WS2812B 燈的 RGB 顏色(十進(jìn)制 0–255)
* @param r 紅色分量,0 表示關(guān)閉,255 表示最大亮度
* @param g 綠色分量,0 表示關(guān)閉,255 表示最大亮度
* @param b 藍(lán)色分量,0 表示關(guān)閉,255 表示最大亮度
*/
void WS2812B_SetColor(uint32_t r, uint32_t g, uint32_t b)
{
uint16_t *p = My_ws_buf;
uint32_t mask, rep, bit;
uint32_t GRB_Data;
GRB_Data = ((g & 0xFFU) < < 16)
| ((r & 0xFFU) < < 8)
| (b & 0xFFU);
for (rep = 0; rep < LED_REPEAT; rep++) {
mask = 1UL < < (BITS_PER_LED - 1);
for (bit = 0; bit < BITS_PER_LED; bit++, mask > >= 1) {
*p++ = (GRB_Data & mask) ? WS2812_HIGH : WS2812_LOW;
}
}
}
//發(fā)送信號(hào)
void WS2812B_Send(void)
{
//清除 DMA 標(biāo)志、重載傳輸長(zhǎng)度
DMA_ClearFlag(DMA1_FLAG_TC2);
DMA_SetCurrDataCounter(DMA1_Channel2, LED_REPEAT * BITS_PER_LED);
//啟動(dòng) DMA & 定時(shí)器
DMA_Cmd(DMA1_Channel2, ENABLE);
TIM_Cmd(TIM2, ENABLE);
//等待傳輸完成
while (!DMA_GetFlagStatus(DMA1_FLAG_TC2));
//關(guān)閉 TIM & DMA 并清標(biāo)志,產(chǎn)生 >50μs 復(fù)位低電平
TIM_Cmd(TIM2, DISABLE);
DMA_Cmd(DMA1_Channel2, DISABLE);
DMA_ClearFlag(DMA1_FLAG_TC2);
}
void ws2812_OFF(void)
{
WS2812B_SetColor(0, 0, 0);
WS2812B_Send();
}
main.c
#include "stm32f10x.h" // Device header
#include "ws2812.h"
#include "delay.h"
static const uint8_t color_list[][3] = {
{255, 0, 0}, // 紅
{255, 125, 0}, // 橙
{255, 255, 0}, // 黃
{ 0, 255, 0}, // 綠
{ 0, 255, 255}, // 青
{ 0, 0, 255}, // 藍(lán)
{255, 0, 255}, // 紫
{ 0, 0, 0} // 關(guān)燈
};
uint16_t NUM_COLORS = sizeof(color_list) / sizeof(color_list[0]);
uint32_t idx = 0;
int main(void)
{
WS2812_Init();
// ws2812_OFF();
while(1){
uint8_t r = color_list[idx][0];
uint8_t g = color_list[idx][1];
uint8_t b = color_list[idx][2];
WS2812B_SetColor(r, g, b);
WS2812B_Send();
Delay_ms(1000);
idx = (idx + 1) % NUM_COLORS;
}
}
- 效果展示

總結(jié)
WS2812 是一款將控制電路、信號(hào)整形放大和恒流驅(qū)動(dòng)與 RGB 發(fā)光單元集成于 5050 封裝中的智能化全彩 LED 模塊,僅需一根數(shù)據(jù)線即可以 800 kbps 單線協(xié)議傳輸精確的色彩控制信號(hào),從而實(shí)現(xiàn)鏈?zhǔn)郊?jí)聯(lián)上千點(diǎn)的獨(dú)立尋址與顯示?。內(nèi)部集成的數(shù)字移位寄存器與精密振蕩器可按 GRB 順序(G7…G0→R7…R0→B7…B0)接收并鎖存 24 bit 顏色數(shù)據(jù),隨后通過(guò)恒流驅(qū)動(dòng)電路根據(jù)不同位的高低電平寬度產(chǎn)生對(duì)應(yīng)亮度,并將余下數(shù)據(jù)重塑后輸出到下一顆,實(shí)現(xiàn)信號(hào)級(jí)聯(lián)???蓮V泛應(yīng)用于燈帶、燈環(huán)、可穿戴燈效、舞臺(tái)裝飾等場(chǎng)景?。
注意事項(xiàng):
- 嚴(yán)格時(shí)序控制:軟件模擬易受中斷或系統(tǒng)抖動(dòng)影響,易導(dǎo)致亮度不穩(wěn)定或色偏,推薦使用定時(shí)器+DMA、SPI 或 RMT(ESP32)等硬件外設(shè)生成 PWM 波形,以確保 T0H/T1H 與 T0L/T1L 寬度的高精度?。
- 復(fù)位低電平:發(fā)送完 24 bit 數(shù)據(jù)后,必須將數(shù)據(jù)線保持低電平 > 50 μs,WS2812 內(nèi)部才會(huì)將新數(shù)據(jù)鎖存并更新輸出;低于此時(shí)長(zhǎng)可能導(dǎo)致刷新失敗或出現(xiàn)殘影?。
- 鏈?zhǔn)郊?jí)聯(lián)能力:得益于內(nèi)部信號(hào)整形,單線級(jí)聯(lián)可支持 ≥ 1 024 個(gè)像素刷新(30 fps 條件下);在更高刷新率或更長(zhǎng)鏈長(zhǎng)場(chǎng)景下,建議分段布線并選用多路輸出或并行總線以降低時(shí)延和信號(hào)累積失真?。
以上僅為個(gè)人觀點(diǎn)供參考,如有問(wèn)題歡迎大家留言討論,如需源碼可點(diǎn)贊收藏加關(guān)注,在評(píng)論留下郵箱獲?。。?!
審核編輯 黃宇
-
STM32單片機(jī)
+關(guān)注
關(guān)注
59文章
553瀏覽量
60458 -
WS2812
+關(guān)注
關(guān)注
0文章
35瀏覽量
7116
發(fā)布評(píng)論請(qǐng)先 登錄
【瑞薩RA6E2】點(diǎn)亮 WS2812 全彩點(diǎn)陣屏
WS2812硬件電路設(shè)計(jì)資料分享
STM32F103C8T6+PWM+DMA驅(qū)動(dòng)WS2812燈帶的方法
怎樣使用STM32F103C8T6微控制器去點(diǎn)亮LED燈呢
STM32F103C8T6核心板的資料合集免費(fèi)下載
利用STM32F103C8T6最小系統(tǒng)板點(diǎn)亮流水燈
利用STM32F103C8T6最小系統(tǒng)板點(diǎn)亮流水燈
WS2812硬件電路設(shè)計(jì)
STM32F103C8T6+PWM+DMA驅(qū)動(dòng) WS2812燈帶
基于STM32F103C8T6驅(qū)動(dòng)WS2812彩燈模塊點(diǎn)亮RGB燈
評(píng)論