国产久操视频-国产久草视频-国产久热精品-国产久热香蕉在线观看-青青青青娱乐-青青青青在线成人视99

  • 正文
    • 一模塊來源
    • 二規(guī)格參數
    • 三移植過程
    • 四移植驗證
  • 相關推薦
申請入駐 產業(yè)圖譜

S2812彩燈:CW32F030C8T6開發(fā)板實現設置彩燈顏色的功能

02/11 08:47
1502
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

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

模塊來源

模塊實物展示:

資料鏈接:https://pan.baidu.com/s/1OkCpw8ooDyuw947V0b89Rw

資料提取碼:AB12

規(guī)格參數

工作電壓:3.7-5.3V

工作電流:16MA

控制方式:單總線

管腳數量:4 Pin(2.54mm間距排針

以上信息見廠家資料文件

移植過程

我們的目標是將例程移植至CW32F030C8T6開發(fā)板上【能夠實現設置彩燈顏色的功能】。首先要獲取資料,查看數據手冊應如何實現讀取數據,再移植至我們的工程。

3.1查看資料

WS2812的數據協(xié)議采用單線歸零碼的通訊方式,支持串行級聯接口,能通過一根信號線完成數據的接收與解碼。每個燈就是一個像素點,每個像素點的三基色顏色可實現256級亮度顯示,完成16777216種顏色的全真色彩顯示。

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

控制方式

因為使用的是單總線,一根線完成一個燈要顯示的24位顏色數據,是通過高低電平的時間長度來確定發(fā)送的是什么數據。24位的數據結構見下圖。

其中G代表三色中的綠色,R代表三色中的紅色,B表示三色中的藍色。例如想要只顯示紅色則發(fā)送 0X00FF00即可。

控制時序

發(fā)送24位顏色數據,是通過高低電平的時間長度來確定發(fā)送的是0還是1。

發(fā)送一位數據0,需要總線拉高T0H的時間再拉低T0L的時間,WS2812才會自動識別該數據是0。

發(fā)送一位數據1,需要總線拉高T1H的時間再拉低T1L的時間,WS2812才會自動識別該數據是1

3.2引腳選擇

該模塊有3個引腳,具體引腳連接見各引腳連接。

模塊接線圖

3.3移植至工程

移植步驟中的導入.c和.h文件與【CW32模塊使用】DHT11溫濕度傳感器相同,只是將.c和.h文件更改為bsp_ws2812.c與bsp_ws2812.h。這里不再過多講述,移植完成后面修改相關代碼。

在文件bsp_ws2812.c中,編寫如下代碼。

/* * Change Logs: * Date           Author       Notes * 2024-06-24     LCKFB-LP    first version */#include "bsp_ws2812.h"#include "stdio.h"#include "math.h"

unsigned char LedsArray[WS2812_MAX * 3];      //定義顏色數據存儲數組unsigned int  ledsCount   = WS2812_NUMBERS;   //定義實際彩燈默認個數unsigned int  nbLedsBytes = WS2812_NUMBERS*3; //定義實際彩燈顏色數據個數
void delay_0_30us(void){        __NOP;__NOP;__NOP;__NOP;__NOP;}

/****************************************************************** * 函 數 名 稱:WS2812_GPIO_Init * 函 數 說 明:對WS2812引腳初始化 * 函 數 形 參:無 * 函 數 返 回:無 * 作       者:LC * 備       注:無******************************************************************/void WS2812_GPIO_Init(void){    GPIO_InitTypeDef GPIO_InitStruct; // GPIO初始化結構體
    RCC_DIN_ENABLE();        // 使能GPIO時鐘
    GPIO_InitStruct.Pins = GPIO_DIN;                        // GPIO引腳    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;             // 推挽輸出    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;                // 輸出速度高    GPIO_Init(PORT_DIN, &GPIO_InitStruct);                  // 初始化
    GPIO_WritePin(PORT_DIN, GPIO_DIN, GPIO_Pin_RESET);}/****************************************************************** * 函 數 名 稱:rgb_SetColor * 函 數 說 明:設置彩燈顏色 * 函 數 形 參:LedId控制的第幾個燈  color顏色數據 * 函 數 返 回:無 * 作       者:LC * 備       注:在這里我將綠和紅色進行顛倒,這樣比較符合我們日常生活的紅綠藍的順序******************************************************************/
void rgb_SetColor(unsigned char LedId, unsigned long color){    if( LedId > ledsCount )    {        return;    //to avoid overflow    }    LedsArray[LedId * 3]     = (color>>8)&0xff;    LedsArray[LedId * 3 + 1] = (color>>16)&0xff;    LedsArray[LedId * 3 + 2] = (color>>0)&0xff;}
/****************************************************************** * 函 數 名 稱:rgb_SetRGB * 函 數 說 明:設置彩燈顏色(三原色設置) * 函 數 形 參:LedId控制的第幾個燈 red紅色數據  green綠色數據  blue藍色數據 * 函 數 返 回:無 * 作       者:LC * 備       注:無******************************************************************/void rgb_SetRGB(unsigned char LedId, unsigned long red, unsigned long green, unsigned long blue){    unsigned long Color=red<<16|green<<8|blue;    rgb_SetColor(LedId,Color);}
/****************************************************************** * 函 數 名 稱:rgb_SendArray * 函 數 說 明:發(fā)送彩燈數據 * 函 數 形 參:無 * 函 數 返 回:無 * 作       者:LC * 備       注:無******************************************************************/void rgb_SendArray(void){    unsigned int i;    //發(fā)送數據    for(i=0; i<nbLedsBytes; i++)        Ws2812b_WriteByte(LedsArray[i]);}
/****************************************************************** * 函 數 名 稱:RGB_LED_Reset * 函 數 說 明:復位ws2812 * 函 數 形 參:無 * 函 數 返 回:無 * 作       者:LC * 備       注:低電平280us以上******************************************************************/void RGB_LED_Reset(void){        RGB_PIN_L();        delay_us(285);}
/****************************************************************** * 函 數 名 稱:Ws2812b_WriteByte * 函 數 說 明:向WS2812寫入單字節(jié)數據 * 函 數 形 參:byte寫入的字節(jié)數據 * 函 數 返 回:無 * 作       者:LC * 備       注:1碼的時序 = 高電平580ns~1us    再低電平220ns~420ns *              0碼的時序 = 高電平220ns~380ns  再低電平580ns~1us******************************************************************/void Ws2812b_WriteByte(unsigned char byte){    int i = 0, k = 0;    for(i = 0; i < 8; i++ )    {        if( byte & (0x80 >> i) )//當前位為1        {            RGB_PIN_H();            delay_us(1);//0.75us            RGB_PIN_L();            __NOP;__NOP;__NOP;__NOP;__NOP;//0.25us        }        else//當前位為0        {            RGB_PIN_H();            __NOP;__NOP;__NOP;__NOP;__NOP;//0.25us            RGB_PIN_L();            delay_us(1);//0.833us        }    }}

在文件bsp_ws2812.h中,編寫如下代碼。

/* * Change Logs: * Date           Author       Notes * 2024-06-24     LCKFB-LP    first version */
#ifndef _BSP_WS2812_H_#define _BSP_WS2812_H_
#include "board.h"
#define RCC_DIN_ENABLE()    __RCC_GPIOB_CLK_ENABLE()#define PORT_DIN            CW_GPIOB#define GPIO_DIN            GPIO_PIN_12

//用戶修改參數區(qū)//#define WS2812_FREQUENCY#define RGB_PIN_L()       GPIO_WritePin(PORT_DIN, GPIO_DIN, GPIO_Pin_RESET)  //控制彩燈引腳(需要配置為強推挽輸出)#define RGB_PIN_H()       GPIO_WritePin(PORT_DIN, GPIO_DIN, GPIO_Pin_SET)    //控制彩燈引腳(需要配置為強推挽輸出)#define WS2812_MAX        8                        //彩燈最大個數#define WS2812_NUMBERS    8                        //彩燈個數

#define RED               0xff0000                  //紅色#define GREEN             0x00ff00                  //綠色#define BLUE              0x0000ff                  //藍色#define BLACK             0x000000                  //熄滅#define WHITE             0xffffff                  //白色


//8.3 -8  0.000000083//4.16 -9 0.00000000416void Ws2812b_WriteByte(unsigned char byte);//發(fā)送一個字節(jié)數據(@12.000MHz,理論每個機器周期83ns,測試約為76ns)void setLedCount(unsigned char count);//設置彩燈數目,范圍0-25.unsigned char getLedCount();//彩燈數目查詢函數void rgb_SetColor(unsigned char LedId, unsigned long color);//設置彩燈顏色void rgb_SetRGB(unsigned char LedId, unsigned long red, unsigned long green, unsigned long blue);//設置彩燈顏色void rgb_SendArray();//發(fā)送彩燈數據
void WS2812_GPIO_Init(void);
void RGB_LED_Write1(void);void RGB_LED_Reset(void);

#endif

移植驗證

在自己工程中的main主函數中,編寫如下。

/* * Change Logs: * Date           Author       Notes * 2024-06-24     LCKFB-LP    first version */#include "board.h"#include "stdio.h"#include "bsp_uart.h"#include "bsp_ws2812.h"
uint8_t Co = 100;unsigned int buff[]={RED,GREEN,BLUE,WHITE};
int32_t main(void){    int i = 0;
    board_init();
    uart1_init(115200);
    WS2812_GPIO_Init();    printf("Start--->rn");
    while(1)    {        for( i = 0; i < 8; i++ )        {            rgb_SetColor(i,buff[i%3]);            rgb_SendArray();            delay_ms(10);        }        delay_ms(3000);
        i = 0;        while( Co )        {            rgb_SetColor((i+0)%8,buff[0]);            rgb_SetColor((i+1)%8,buff[1]);            rgb_SetColor((i+2)%8,buff[2]);            rgb_SetColor((i+3)%8,buff[3]);
            rgb_SetColor((i+4)%8,BLACK);            rgb_SetColor((i+5)%8,BLACK);            rgb_SetColor((i+6)%8,BLACK);            rgb_SetColor((i+7)%8,BLACK);
            rgb_SendArray();            delay_ms(200);            Co--;            i++;        }        Co = 100;    }}

移植現象:三秒前八個燈全亮,后面循環(huán)流水燈顯示。

模塊移植成功案例代碼:

鏈接:https://pan.baidu.com/s/1boqb5UkpomK2avKNqAjz-w?pwd=LCKF

提取碼:LCKF

相關推薦

登錄即可解鎖
  • 海量技術文章
  • 設計資源下載
  • 產業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄

以開放、共享、互助為理念,致力于構建武漢芯源半導體CW32系列MCU生態(tài)社區(qū)。無論是嵌入式MCU小自還是想要攻破技術難題的工程師,亦或是需求解決方案的產品經理都可在CW32生態(tài)社區(qū)汲取營養(yǎng)、共同成長。

乃东县| 鸡东县| 天津市| 西乡县| 襄汾县| 准格尔旗| 滨海县| 镇巴县| 招远市| 大埔区| 赫章县| 双城市| 吉林省| 苍溪县| 长葛市| 通州区| 高尔夫| 大邑县| 都兰县| 洪湖市| 广平县| 奉新县| 安福县| 汉中市| 防城港市| 昌吉市| 四会市| 芷江| 成武县| 东乡| 玉田县| 佛冈县| 呼图壁县| 柳江县| 芷江| 五莲县| 左权县| 信宜市| 临洮县| 晋中市| 宁陵县|