1. 程式人生 > >STC89C52RC控制WS2812B LED 調色調光(一)

STC89C52RC控制WS2812B LED 調色調光(一)

前言

       一直想自己做一個LED的檯燈,能夠實現三色調節和光暗調節,搜尋了下淘寶裡的可調LED燈發現要麼是隻能調光暗,無法做到單色的調節,要麼就是可以能實現調各種顏色,但是是無線的,多出一個遙控器是什麼鬼...我只是想在臺燈的底座上開三個孔,連上旋鈕實現調色和調光啊,多一個遙控器不像話啊,看來只能自己實現了。

       一通翻箱倒櫃,發現5年前買的51開發板還在,就差一個能控的LED模組了!又一通搜尋,發現一款WS2812B的LED控制模組好像挺符合我的需求的,但是網上發的程式要麼是STM32的,要麼是15系列的晶片的,沒有我手頭上51的,看來還是得自己手動來調了。

WS2812B資料

主要特點

  • 智慧反接保護,電源反接不會損壞IC。
  • IC控制電路與LED點光源公用一個電源。
  • 控制電路與RGB晶片整合在一個5050封裝的元器件中,構成一個完整的外控畫素點。
  • 內建訊號整形電路,任何一個畫素點收到訊號後經過波形整形再輸出,保證線路波形畸變不會累加。
  • 內建上電覆位和掉電覆位電路。
  • 每個畫素點的三基色顏色可實現256級亮度顯示,完成16777216種顏色的全真色彩顯示,掃描頻率不低於400Hz/s。
  • 序列級聯介面,能通過一根訊號線完成資料的接收與解碼。
  • 任意兩點傳傳輸距離在不超過5米時無需增加任何電路。
  • 當重新整理速率30幀/秒時,級聯數不小於1024點。
  • 資料傳送速度可達800Kbps。
  • 光的顏色高度一致,價效比高。

主要應用領域

  • LED全綵發光字燈串,LED全綵模組, LED全綵軟燈條硬燈條,LED護欄管。
  • LED點光源,LED畫素屏,LED異形屏,各種電子產品,電器裝置跑馬燈。

產品概述

WS2813B是一個集控制電路與發光電路於一體的智慧外控LED光源。其外型與一個5050LED燈珠相同,每個元件即為一個畫素點。畫素點內部包含了智慧數字介面資料鎖存訊號整形放大驅動電路,還包含有高精度的內部振盪器和12V高壓可程式設計定電流控制部分,有效保證了畫素點光的顏色高度一致。

資料協議採用單線歸零碼的通訊方式,畫素點在上電覆位以後,DIN端接受從控制器傳輸過來的資料,首先送過來的24bit資料被第一個畫素點提取後,送到畫素點內部的資料鎖存器,剩餘的資料經過內部整形處理電路整形放大後通過DO埠開始轉發輸出給下一個級聯的畫素點,每經過一個畫素點的傳輸,訊號減少24bit。畫素點採用自動整形轉發技術,使得該畫素點的級聯個數不受訊號傳送的限制,僅僅受限訊號傳輸速度要求。

LED具有低電壓驅動,環保節能,亮度高,散射角度大,一致性好,超低功率,超長壽命等優點。將控制電路集成於LED上面,電路變得更加簡單,體積小,安裝更加簡便。

機械尺寸(單位mm)

機械尺寸與引腳圖(單位mm)

引腳功能 :

序號

符號

管腳名

功 能 描 述

1

VDD

電源

供電管腳

2

DOUT

資料輸出

控制資料訊號輸出

3

VSS

訊號接地和電源接地

4

DIN

資料輸入

控制資料訊號輸入

最大額定值(如無特殊說明,TA=25℃,VSS=0V

引數

符號

範圍

單位

電源電壓

VDD

+3.5~+5.3

V

邏輯輸入電壓

VI

-0.5~VDD+0.5

V

工作溫度

Topt

-25~+80

儲存溫度

Tstg

-55~+150

電氣引數(如無特殊說明,TA=-20~+70℃,VDD=4.5~5.5V,VSS=0V

引數

符號

最小

典型

最大

單位

測試條件

輸入電流

II

——

——

±1

µA

VI=VDD/VSS

高電平輸入

VIH

0.7VDD

——

——

V

DIN,SET

低電平輸入

VIL

——

——

0.3 VDD

V

DIN,SET

滯後電壓

VH

——

0.35

——

V

DIN,SET

 

開關特性(如無特殊說明,TA=-20~+70℃,VDD=4.5~5.5V,VSS=0V

引數

符號

最小

典型

最大

單位

測試條件

振盪頻率

Fosc

——

600

——

KHz

——

傳輸延遲時間

tPLZ

——

——

300

ns

CL=15pF,DIN→DOUT,RL=10KΩ

下降時間

tTHZ

——

——

120

µs

CL=300pF,OUTR/OUTG/OUTB

輸入電容

CI

——

——

15

pF

——

LED 特性引數

資料傳輸時間TH+TL=1.25µs±600ns)

T0H

0碼,  高電平時間

0.4µs

±150ns

T1H

1碼,  高電平時間

0.8 µs

±150ns

T0L

0碼,  低電平時間

0.85µs

±150ns

T1L

1碼,  低電平時間

0.45 µs

±150ns

RES

幀單位,低電平時間

50µs以上

 

時序波形圖


 

WS2812B

輸入碼型:

連線方法:


 

WS2812B

 


 

WS2812B

資料傳輸方法

注:其中D1為MCU端傳送的資料,D2、D3、D4為級聯電路自動整形轉發的資料。

24bit資料結構:

G7

G6

G5

G4

G3

G2

G1

G0

R7

R6

R5

R4

R3

R2

R1

R0

B7

B6

B5

B4

B3

B2

B1

B0

注:高位先發,按照GRB的順序傳送資料。

典型應用電路:

以上內容複製貼上。。。來源https://wenku.baidu.com/view/25f176db482fb4daa48d4ba1.html,還有英文版https://wenku.baidu.com/view/76a0294580eb6294dc886c4d.html

主要注意以下幾個點:

1.傳送的01資料流一定要跟規格書走;誤差不能超過150ns,51微控制器的頻率小一點的晶振可能根本達不到這個要求,所以我採用     了一顆24M晶振,並且在ISP下載工具中打開了,使頻率翻了一倍,大概48M,那麼一條指令的大概時間就       是6/24M=0.25µs,勉強夠用。

2.傳送的24位資料一定注意傳送的順序,文件中的要求是先發綠色色值,並且是從高位開始傳送;

3.傳送資料時有多少個燈要傳送多少個24位顏色值,而且2個24位顏色值之間時間間隔不能超過50µs,否則,模組會把這個24位     數當做是第一個燈的資料;

4.嗯,想起來再補充;

關鍵思路

        先實現能調光,而想要調光,那麼肯定要有一個電位器進行調節,然後通過ADC模組來讀入值,再轉化後傳送到ws2812b模組。嗯,直接先用51開發板上的ADC模組來除錯吧。

51開發板上自帶的ADC模組,J2直接短接34腳,使用電位器來調節。

ADC模組程式碼開發板已經自帶了,直接拿來使用,不在本文的關鍵內容中,不做贅述!

ws2812b有四口,一個VCC,一個GND,一個DATA IN,一個DATA OUT。51與ws2812b的連線電路很簡單,P0.0口上拉一個10K電阻後與ws2812b的data in口連線,ws2812b的電源地端與51的電源共地,電源的+-之間並一個100uf的電容,搞定!

 

相關程式碼

注意,以下程式碼都是在stc89c52rc,晶振為24M,開啟使能6T功能下測試成功,P0口上拉電阻,接ws2812b的data in端,其他條件下需要自己做程式碼上的調整!

(1)寫入一位資料時序:

/*寫入資料時序*/
void Send_A_bit(uchar VAL)
{
    if (VAL==1)
    {
        Send_Dat=1;
        _nop_();//兩個nop,大概是0.5us,經測試,傳送完1後的延時最重要
        _nop_();
        Send_Dat=0;
    }
    else
    {
        Send_Dat=1;
        _nop_(); //一個nop,大概是0.25us
        Send_Dat=0;
    }
}

(2)傳送一個燈的24位資料:

//儲存一個轉化後的RGB2進位制數  共24bits
struct My_24bits                    //結構體
{
    uchar G_VAL;                 //綠色  0-255
    uchar R_VAL;                  //紅色 0-255
    uchar B_VAL;                  //藍色0-255
};

/*傳送24位字元(包含RGB資訊各8位)*/
void Send_24bits(struct My_24bits RGB_VAL)
{
    uchar i;
    for(i=0; i<8; i++)
    {
        Send_A_bit(RGB_VAL.G_VAL>>(7-i)&0x01);//注意是從高位先發
    }
    for(i=8; i<16; i++)
    {
        Send_A_bit(RGB_VAL.R_VAL>>(15-i)&0x01);
    }
    for(i=16; i<24; i++)
    {
        Send_A_bit(RGB_VAL.B_VAL>>(23-i)&0x01);
    }
}

(3)ADC轉換程式碼,不是重點,可以下載後檢視,略;

 

以上,實現了電位器對led燈亮度進行調節,可以對ws2812b模組進行很好的瞭解與熟悉。因為此部分只能調光,不能對單色進行調節,下部分會把ADC模組替換掉,改用EC11編碼器,就可以對單色逐一調節,然後用上EEPROM儲存顏色值,斷電重啟能記憶上次顏色值。嗯,EC11還沒買,沒有示波器,只能純手調,看運氣和人品了。。。

完整程式碼:https://download.csdn.net/download/yaleond/10749279