玩轉X-CTR100 l STM32F4 l WS2812全彩LED燈


更多塔克創新資訊歡迎登陸【塔克社區 www.xtark.cn 】【塔克博客 www.cnblogs.com/xtark/

    

WS2812B RGB全彩LED燈珠,只需通過一根信號線控制多個燈顯示,本教程使用X-CTR100控制器驅動WS2812燈環。

原理

WS2812B是一個集控制電路與發光電路於一體的智能外控LED光源。其外型與一個5050LED燈珠相同,每個元件即為一個像素點。像素點內部包含了智能數字接口數據鎖存信號整形放大驅動電路,還包含有高精度的內部振盪器和可編程定電流控制部分,有效保證了像素點光的顏色高度一致。

WS2812B為新一代的RGB5050將控制電路與RGB芯片集成在一個5050封裝的元器件中,構成一個完整的外控像素點。

-內置信號整形電路,任何一個像素點收到信號后經過波形整形再輸出,保證線路波形畸變不會累加。

-內置上電復位和掉電復位電路。

-每個像素點的三基色顏色可實現256級亮度顯示,完成16777216種顏色的全真色彩顯示,掃描頻率不低於400Hz/s。

-串行級聯接口,能通過一根信號線完成數據的接收與解碼。

-任意兩點傳傳輸距離在不超過5米時無需增加任何電路。

-當刷新速率30幀/秒時,低速模式級聯數不小於512點,高速模式不小於1024點。

-數據發送速度可達800Kbps。

-光的顏色高度一致,性價比高。

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

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

    

常用燈條、燈環、點陣

    

波形時序

    

    

例程

本例程實現X-CTR100控制器驅動WS2812全彩LED燈,並設計4種動態顯示效果,撥碼開關實現顯示效果切換。

硬件說明

硬件資源:

  • 串口UART1
  • TIM3-CH1擴展接口(RH)
  • WS2812燈環、燈條或燈帶(需自備)

如下以燈環為例進行說明,燈環連接X-CTR100控制器右側H接口,使用處理器資源TIM3-CH1,燈環為5V供電。

    

軟件生態

X-SOFT軟件生態,X-API擴展文件如下。

ax_ws2812.c—— WS2812驅動源文件

ax_ws2812.h——WS2812操作接口頭文件

驅動代碼采用DMA+PWM方式,參考正點原子MiniFly四軸源碼,

X-CTR100定時器TIM3產生800KHz(t=1.25us)的PWM,當傳輸bit=0時,設置占空比=0.4us/1.25us;傳輸bit=1時,設置占空比=0.8us/1.25us。

傳輸完所有級聯個數的數據后,再發送50us以上的低電平信號。

接口函數

void AX_WS2812_Init(void); //WS2812初始化

void AX_WS2812_SetColor(uint8_t (*color)[3], uint8_t len); //WS2812設置燈條顏色

該驅動可控制最多65536個彩燈,適用所有WS2812燈條、燈帶、燈環、點陣。

控制時序允許產生±150ns誤差,示波器實測時序如下

    

軟件說明

方便控制,增加設置WS2812燈條為單一RGB顏色函數。

/**

* @ WS2812設置燈條為單一顏色。

* @ red 紅色值

green:綠色值

blue:藍色值

len:燈個數

* @返回值

*/

void AX_WS2812_SetOneColor(uint8_t red, uint8_t green, uint8_t blue, uint8_t len)

{

 

    for(uint8_t i=0; i<len; i++)

    {

        ws2812_dispbuf[i][0] = red;

        ws2812_dispbuf[i][1] = green;

        ws2812_dispbuf[i][2] = blue;

    }

    AX_WS2812_SetColor(ws2812_dispbuf, len);

}

例程代碼實現了4種顯示效果,通過撥碼開關切換,主程序如下。

int main(void)

{    

    uint16_t i=0,j=0;

    u8 res;

    

    //X-CTR100初始化

    AX_Init(115200);

    printf("***X-CTR100 WS2812彩色LED燈例程***\r\n\r\n");    

    

    //設置系統中斷優先級分組2

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);    

    

    //WS2812初始化

    AX_WS2812_Init();

    

    //顯示黑色(關燈)

    AX_WS2812_SetOneColor(0,0,0,WS2812_NUM);

    AX_Delayms(10);

    

    while (1)

    {

        res = AX_SW_GetSW12Status();

        

        switch (res)

{

    case 0: //8種顏色循環效果

                for(j=0; j<WS2812_NUM; j++ )

                {

                    ws2812_dispbuf[j][0] = COLOR_RGB_LIST[i%8][0];

                    ws2812_dispbuf[j][1] = COLOR_RGB_LIST[i%8][1];

                    ws2812_dispbuf[j][2] = COLOR_RGB_LIST[i%8][2];                

                }

                AX_WS2812_SetColor(ws2812_dispbuf, WS2812_NUM);

                AX_Delayms(100);        

i++;                

        break;

    case 1: //色環轉圈效果

                for(j=0; j<WS2812_NUM; j++ )

                {

                    ws2812_dispbuf[j][0] = COLOR_RGB_LIST[(j+i)%8][0];

                    ws2812_dispbuf[j][1] = COLOR_RGB_LIST[(j+i)%8][1];

                    ws2812_dispbuf[j][2] = COLOR_RGB_LIST[(j+i)%8][2];                        

                }                

                AX_WS2812_SetColor(ws2812_dispbuf, WS2812_NUM);

                AX_Delayms(30);

i++;                

        break;

            case 2: //藍色呼吸燈效果

                for(j=0; j<255; j++) //亮節奏控制

                {

                    AX_WS2812_SetOneColor(0,0,j,WS2812_NUM);

                    AX_Delayms(1);            

                }

                for(j=255; j>0; j--) //滅節奏控制

                {

                    AX_WS2812_SetOneColor(0,0,j,WS2812_NUM);

                    AX_Delayms(2);                

                }

                AX_Delayms(100);            

        break;

            case 3: //紅色單點轉圈效果                

                for(j=0; j<WS2812_NUM; j++ )

                {

                    ws2812_dispbuf[j][0] = 0;

                    ws2812_dispbuf[j][1] = 0;

                    ws2812_dispbuf[j][2] = 0;

                }

                ws2812_dispbuf[i%8][0] = 0xFF;

                ws2812_dispbuf[i%8][1] = 0x0;

                ws2812_dispbuf[i%8][2] = 0x0;                

                AX_WS2812_SetColor(ws2812_dispbuf, WS2812_NUM);

                AX_Delayms(30);

i++;                

        break;

    default:

        break;

}

        AX_Delayms(10);        

    }

}

特別注意:注意供電能力,單個彩燈白色狀態下最大電流60mA,8個彩燈為480mA,如果彩燈再多,需要考慮USB貢獻是否能帶動,一般電腦USB2.0供電能力為500mA。

如果供電能力不足,也可通過軟件設計優化,每個顏色付值為255時電流最大,可通過減小付值減小電流。

實現效果

顯示效果酷炫,如下。

    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM