找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 15316|回復(fù): 9
收起左側(cè)

WS2812B燈珠RGB調(diào)色單片機(jī)程序,只是能亮,完全不受控制

  [復(fù)制鏈接]
ID:373838 發(fā)表于 2018-10-19 15:13 | 顯示全部樓層 |閱讀模式
MCU型號(hào)為:STC12C5A60S2,晶振11.0592mhz現(xiàn)在想點(diǎn)亮一個(gè)WS2812B的rgb燈珠調(diào)色!但試了好多程序案例,但只是能亮,完全不受控制!求大神分享一下設(shè)計(jì)思路


WS2812B參數(shù)如下:

數(shù)據(jù)傳輸時(shí)間( TH+TL=1.25μs±600ns)
T0H
0碼,  高電平時(shí)間
0.4μs
±150ns
T1H
1碼,  高電平時(shí)間
0.8 μs
±150ns
T0L
0碼,  低電平時(shí)間
0.85μs
±150ns
T1L
1碼,  低電平時(shí)間
0.45 μs
±150ns
RES
幀單位,低電平時(shí)間
50μs以上

時(shí)序波形圖


WS2812B
輸入碼型:
連接方法:


WS2812B


WS2812B
數(shù)據(jù)傳輸方法:
注:其中D1為MCU端發(fā)送的數(shù)據(jù),D2、D3、D4為級(jí)聯(lián)電路自動(dòng)整形轉(zhuǎn)發(fā)的數(shù)據(jù)。
24bit數(shù)據(jù)結(jié)構(gòu):
G7
G6
G5
G4
G3
G2
G1
G0
R7
R6
R5
R4
R3
R2
R1
R0
B7
B6
B5
B4
B3
B2
B1
B0
注:高位先發(fā),按照GRB的順序發(fā)送數(shù)據(jù)。
典型應(yīng)用電路:



回復(fù)

使用道具 舉報(bào)

ID:233756 發(fā)表于 2018-11-2 14:36 | 顯示全部樓層
樓主解決了嗎?我用STM32,再示波器上看時(shí)序都是對(duì)的 ,就是顏色完全不受控制。。。
回復(fù)

使用道具 舉報(bào)

ID:373838 發(fā)表于 2018-11-16 10:08 | 顯示全部樓層
一樣,色彩完全不受控制。全亮白光!
回復(fù)

使用道具 舉報(bào)

ID:437369 發(fā)表于 2018-12-29 21:02 | 顯示全部樓層
樓主,我的一只亮紅光,咋辦呀
回復(fù)

使用道具 舉報(bào)

ID:21069 發(fā)表于 2018-12-30 20:49 | 顯示全部樓層
先頂起!大家都在努力中!,不過(guò)晶振11.0592mhz是不行的,最起碼要24MHZ

評(píng)分

參與人數(shù) 1黑幣 +35 收起 理由
shuisheng + 35

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:423345 發(fā)表于 2019-4-18 13:07 | 顯示全部樓層
控制時(shí)序沒(méi)有寫(xiě)對(duì),我發(fā)個(gè)測(cè)試程序給你參考:
#include "IAP15F105W.h"
#include "intrins.h"

typedef unsigned char uchar;
typedef unsigned int  uint;

#define  Number 20

sbit DAI=P3^2;

void Delay (uint x)  // 1ms Delay
{
    uint t;
    t = 0;
    while (x--)
                {
      WDT_CONTR|=0x10;         
                        for (t = 0; t < 175; t++);
    }
}

void send_2811_24bits(uchar dat1,uchar dat2,uchar dat3)   // ·¢?íêy?Y
{
        uchar a,b;
        for(a=0;a<8;a++)         //dat1
        {
                if(dat1&0x80)
                {
                        DAI=1;                                              // CODE "1"
                        for(b=0;b<2;b++)
                        {
                                _nop_(); _nop_();
                        }
                        DAI=0;       
                }
                else
                {               
                        DAI=1;                                //CODE "0"
                        for(b=0;b<1;b++);
                        DAI=0;         
                        for(b=0;b<1;b++);
                }
                dat1=dat1<<1;               
        }
        for(a=0;a<8;a++)                       //dat2
        {       
                if(dat2&0x80)
                {                  
                        DAI=1;                                              // CODE "1"
                        for(b=0;b<2;b++)
                        {
                        _nop_(); _nop_();
                        }
                        DAI=0;                       
                }
                else
                {               
                        DAI=1;                                //CODE "0"
                        for(b=0;b<1;b++);
                        DAI=0;         
                  for(b=0;b<1;b++);
                }
                dat2=dat2<<1;       
        }                                                 
        for(a=0;a<8;a++)                      //dat3
        {       
                if(dat3&0x80)
                {               
                        DAI=1;                                              // CODE "1"
                        for(b=0;b<2;b++)
                        {
                                _nop_();  _nop_();
                        }
                        DAI=0;
                }
                else
                {       
                        DAI=1;                                //CODE "0"
                        for(b=0;b<1;b++);
                        DAI=0;         
                        for(b=0;b<1;b++);
                }
                dat3=dat3<<1;               
        }
}

void rst()
{
        uchar s;
        DAI=0;
        WDT_CONTR|=0x10;     
        for(s=0;s<50;s++);  
}
void Flowing()
{
        uint i;
        uint Stack;
        Stack=0;
        while(1)
        {
                for(i=0;i<Stack;i++)
                {
                        send_2811_24bits(255,255,255);
                }
                for(i=0;i<Number-Stack;i++)
                {
                        send_2811_24bits(0,0,0);
                }
                rst();
                Delay(1000);
                Stack++;
                if(Stack>Number)
                {
                        break;
                }
        }
}
void main()
{
        P3M0=0x04;                 
        P3M1=0x00;
        P32=0;
        WDT_CONTR=0x3F;         
        while(1)
        {
                Flowing();
        }
}
回復(fù)

使用道具 舉報(bào)

ID:575533 發(fā)表于 2019-7-20 11:11 | 顯示全部樓層
雖然是挖墳 但我也找了好多資料才研究到規(guī)律  想炫耀一下
第一點(diǎn)  nop數(shù)量為(1/(晶頻))我的是33.1776  所以每條nop需要(1 / 33.1776)us
第二點(diǎn)  盡量用減法  減法比加法省時(shí)間  nop數(shù)會(huì)更準(zhǔn)確
第三點(diǎn)  用#define    比調(diào)用函數(shù)省時(shí)間  nop數(shù)會(huì)更準(zhǔn)確

亮白點(diǎn)因?yàn)閚op數(shù)不對(duì) 延遲時(shí)間不對(duì)
不符合燈條的要求
回復(fù)

使用道具 舉報(bào)

ID:190075 發(fā)表于 2019-11-19 15:05 | 顯示全部樓層
漢神俊 發(fā)表于 2019-7-20 11:11
雖然是挖墳 但我也找了好多資料才研究到規(guī)律  想炫耀一下
第一點(diǎn)  nop數(shù)量為(1/(晶頻 ...

第一點(diǎn)怎么算,他不是分0和1嗎,怎么分配
回復(fù)

使用道具 舉報(bào)

ID:516874 發(fā)表于 2021-1-22 13:36 | 顯示全部樓層
本帖最后由 dzzsz2019 于 2021-1-28 14:09 編輯

WS2812.PNG 用邏輯分析儀看看時(shí)序,注意的是一個(gè)燈珠的24信號(hào) ,每8bit后要增加1個(gè)bit的低電平時(shí)間,每個(gè)燈珠要增加2個(gè)bit的低電平時(shí)間
最近也在做led的控制程序,發(fā)現(xiàn)有些帶自控的芯片,當(dāng)在一定時(shí)間沒(méi)控制信號(hào)輸入時(shí),就轉(zhuǎn)入自控程序,這個(gè)時(shí)間大概有7-8ms。所以如果發(fā)現(xiàn)led不受控,可以提高刷新率,以免芯片進(jìn)入自控程序而造成不受控的現(xiàn) 象。

回復(fù)

使用道具 舉報(bào)

ID:390416 發(fā)表于 2021-2-22 20:18 | 顯示全部樓層
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表