在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

論如何使用WS2812以及類似燈珠

efans_01685260 ? 來源:efans_01685260 ? 作者:efans_01685260 ? 2024-09-30 15:11 ? 次閱讀

?

WS2812 LED燈珠,這是一種非常流行的可尋址RGB LED。每個WS2812 LED內部集成了控制電路,因此可以通過一個數據輸入線來單獨控制每一個LED的顏色和亮度。這種特性使得WS2812非常適合用來創建復雜的燈光效果和圖案。

一、控制邏輯

WS2812 LED的控制邏輯是基于一種特定的數據協議,這種協議通過單線串行接口(通常稱為“數據線”或“DIN”)來傳輸顏色信息。每個WS2812 LED都有一個內置的集成電路,能夠解碼從數據線上接收到的信號,并根據這些信號設置LED的顏色和亮度。

1、WS2812的數據協議

位時序:每個比特由高電平和低電平組成。

邏輯0:高電平持續約0.4微秒,然后是低電平持續約0.85微秒。

邏輯1:高電平持續約0.8微秒,然后是低電平持續約0.45微秒。

字節時序:每個LED需要24比特(3個字節)的數據,分別對應紅色、綠色和藍色通道。

數據格式為GRB(綠色、紅色、藍色),而不是常見的RGB。

幀時序:所有LED的數據連續發送,最后一個LED的數據之后需要有一個復位信號(至少50微秒的低電平)。

2、控制邏輯步驟

1、設置數據線為輸出模式。

2、確保在開始發送數據之前,數據線處于低電平狀態。

3、對于每個LED,依次發送24比特的數據(先綠色,后紅色,最后藍色)。

4、每個比特通過精確控制高電平和低電平的時間來表示邏輯0或邏輯1。

5、在所有LED的數據發送完畢后,發送一個至少50微秒的低電平信號,以觸發所有LED更新其顯示狀態。

二、示例代碼

為了方便使用,我使用51單片機進行模擬,并且舉例了三種不同的控制邏輯。

1、使用“堆指令”方法進行模擬實現

這個比較簡單,就不做過多介紹,直接貼代碼。

#include 

sbit WS2812_PIN = P1^0;  // 假設WS2812的數據線連接到了P1.0

void delay_us(unsigned int us) {
    unsigned char i;
    while (us--) {
        _nop_();  // 根據實際情況調整NOP的數量
        for (i = 0; i < 120; i++) {  // 大約1微秒的延時
            _nop_();
        }
    }
}

void write_bit(unsigned char bit) {
    if (bit) {  // 寫邏輯1
        WS2812_PIN = 1;
        delay_us(800);  // 高電平約0.8微秒
        WS2812_PIN = 0;
        delay_us(450);  // 低電平約0.45微秒
    } else {  // 寫邏輯0
        WS2812_PIN = 1;
        delay_us(400);  // 高電平約0.4微秒
        WS2812_PIN = 0;
        delay_us(850);  // 低電平約0.85微秒
    }
}

void send_color(unsigned char red, unsigned char green, unsigned char blue) {
    unsigned char i;
    for (i = 7; i >= 0; i--) {
        write_bit((red >> i) & 1);
    }
    for (i = 7; i >= 0; i--) {
        write_bit((green >> i) & 1);
    }
    for (i = 7; i >= 0; i--) {
        write_bit((blue >> i) & 1);
    }
}

void main() {
    WS2812_PIN = 0;  // 初始化引腳為低電平
    while (1) {
        send_color(255, 0, 0);  // 發送紅色
        delay_ms(500);  // 延時500毫秒
        send_color(0, 255, 0);  // 發送綠色
        delay_ms(500);
        send_color(0, 0, 255);  // 發送藍色
        delay_ms(500);
    }
}
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

2、PWM功能來模擬時序

PWM功能來模擬WS2812 LED的時序信號是一個比較復雜的過程,因為需要非常精確地控制高電平和低電平的時間。WS2812 LED對數據傳輸的時序要求非常嚴格,通常情況下直接使用PWM并不容易達到這樣的精度。不過,如果你確實希望嘗試這種方法,可以考慮以下步驟:

①PWM配置

選擇合適的定時器:51單片機通常有多個定時器(如Timer0, Timer1),你需要選擇一個定時器并配置其工作在PWM模式。

設置PWM頻率:根據你的具體需求,設置合適的PWM頻率。對于WS2812來說,通常需要在幾百kHz到幾MHz之間。

②生成精確的時序

調整占空比:通過調整PWM的占空比來近似WS2812所需的高電平和低電平時間。例如,邏輯0需要大約0.4微秒的高電平時間和0.85微秒的低電平時間;邏輯1需要大約0.8微秒的高電平時間和0.45微秒的低電平時間。

中斷處理:利用定時器中斷來更新PWM的占空比,確保每個位都能被準確發送。

#include 

sbit WS2812_PIN = P1^0;  // 假設WS2812的數據線連接到了P1.0

void Timer0_Init() {
    TMOD |= 0x01;  // 設置Timer0為模式1(16位計數器)
    TH0 = (65536 - 500) / 256;  // 設置初值,產生約200kHz的PWM
    TL0 = (65536 - 500) % 256;
    ET0 = 1;  // 使能Timer0中斷
    EA = 1;   // 開啟全局中斷
    TR0 = 1;  // 啟動Timer0
}

void write_bit(unsigned char bit) {
    if (bit) {  // 寫邏輯1
        TH0 = (65536 - 800) / 256;  // 高電平約0.8微秒
        TL0 = (65536 - 800) % 256;
        while (!TF0);  // 等待中斷標志
        TF0 = 0;  // 清除中斷標志
        TH0 = (65536 - 450) / 256;  // 低電平約0.45微秒
        TL0 = (65536 - 450) % 256;
        while (!TF0);
        TF0 = 0;
    } else {  // 寫邏輯0
        TH0 = (65536 - 400) / 256;  // 高電平約0.4微秒
        TL0 = (65536 - 400) % 256;
        while (!TF0);
        TF0 = 0;
        TH0 = (65536 - 850) / 256;  // 低電平約0.85微秒
        TL0 = (65536 - 850) % 256;
        while (!TF0);
        TF0 = 0;
    }
}

void send_color(unsigned char red, unsigned char green, unsigned char blue) {
    unsigned char i;
    for (i = 7; i >= 0; i--) {
        write_bit((red >> i) & 1);
    }
    for (i = 7; i >= 0; i--) {
        write_bit((green >> i) & 1);
    }
    for (i = 7; i >= 0; i--) {
        write_bit((blue >> i) & 1);
    }
}

void main() {
    Timer0_Init();  // 初始化定時器
    while (1) {
        send_color(255, 0, 0);  // 發送紅色
        delay_ms(500);  // 延時500毫秒
        send_color(0, 255, 0);  // 發送綠色
        delay_ms(500);
        send_color(0, 0, 255);  // 發送藍色
        delay_ms(500);
    }
}
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

注意事項

時鐘頻率:確保你的系統時鐘頻率足夠高,能夠支持所需的時間分辨率。

延時函數:delay_ms和_nop_等延時函數需要根據實際情況進行調整。

中斷處理:上述代碼中沒有包含中斷服務程序,實際上你可能需要在中斷服務程序中處理PWM的占空比變化

3、使用硬件spi模擬時序

為什么可以考慮使用硬件SPI呢?

①高速度:硬件SPI通常比軟件模擬的串行通信更快。

②減輕CPU負擔:硬件SPI由專用硬件控制,可以減少CPU的負擔,使其能夠執行其他任務。

③穩定性:硬件SPI提供的信號更加穩定,不容易受到中斷或其他因素的影響。

如何實現。

#include 

sbit WS2812_PIN = P1^0;  // 假設WS2812的數據線連接到了P1.0

void SPI_Init() {
    SCON = 0x50;  // 設置為模式0,波特率設置為T1溢出率的1/12
    TMOD |= 0x20;  // 設置Timer1為模式2(8位自動重裝)
    TH1 = 0xFD;  // 設置波特率為9600bps(具體值可能需要根據晶振頻率調整)
    TL1 = 0xFD;
    TR1 = 1;  // 啟動Timer1
}

void SPI_WriteByte(unsigned char byte) {
    unsigned char i;
    for (i = 0; i < 8; i++) {
        TI = 1;  // 設置TI標志,準備發送
        while (!TI);  // 等待TI標志清零
        if (byte & 0x80) {
            SBUF = 0xFF;  // 發送邏輯1
        } else {
            SBUF = 0x00;  // 發送邏輯0
        }
        byte 
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

注意事項

①時序調整:實際應用中,你可能需要根據具體的時鐘頻率和硬件特性調整SPI的配置和延時函數,以確保數據傳輸的準確性。

②復位信號:確保在數據發送完成后正確地發送復位信號,以便WS2812 LED更新顯示。

③硬件限制:某些51單片機可能沒有內置的SPI控制器,這種情況下你可能需要使用軟件模擬SPI或者選擇其他方法。

三、總結

通過上述三種方法,你可以根據具體的應用需求和硬件條件選擇最適合的控制方式。每種方法都有其優缺點,選擇時應綜合考慮系統的性能要求、硬件資源以及開發復雜度。希望這些信息對你理解和實現WS2812 LED的控制有所幫助。

?審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • led
    led
    +關注

    關注

    242

    文章

    23362

    瀏覽量

    663248
  • 串行接口
    +關注

    關注

    3

    文章

    331

    瀏覽量

    42730
  • WS2812
    +關注

    關注

    0

    文章

    32

    瀏覽量

    6257
收藏 人收藏

    評論

    相關推薦

    【敏矽微ME32G070開發板免費體驗】點亮WS2812B

    。數據格式注意:數據傳輸順序為GRB,先傳輸高位數據。 由此可舉例如下: 假如有三顆WS2812B, 設置第0個的RGB顏色為[15
    發表于 01-07 23:58

    【敏矽微ME32G070開發板免費體驗】開箱及環境搭建

    “http://www.mesilicon.com/”字樣,訪問的官方二維碼,還有一些少量電子元器件,非常人性化。 二、上電測試 開發板出廠時已燒錄了閃程序,板子上集成的8顆WS2812 RGB彩燈
    發表于 12-17 22:13

    SMD的性能特點 常見SMD故障及解決方法

    SMD(Surface-Mounted Device,表面貼裝器件)是一種常見的LED封裝形式,廣泛應用于照明、顯示、指示等領域。以下是關于SMD的性能特點、常見故障及解決方法
    的頭像 發表于 12-13 09:31 ?405次閱讀

    基于瑞薩FPB-RA4E2智能床頭燈項目——1編譯環境搭建與點亮驅動ws2812全彩LED

    /*ws2812b數量*/ #defineWS2812B_AMOUNT16 typedefstruct { uint8_tR; uint8_tG; uint8_
    發表于 11-22 21:34

    COB光源與LED的區別

    COB(Chip on Board)和LED(Light Emitting Diode)都是用于照明的光源技術,但它們在結構和性能上有一些區別。 結構: COB
    的頭像 發表于 09-19 09:33 ?5609次閱讀

    在AvaotaA1全志T527開發板上驅動WS2812 RGB LCD

    在 Avaota SBC 的開發板中,通常會有幾個 WS2812 RGB LED 。例如 Avaota A1 的如下位置: 對于 AvaotaOS,提供了硬件的 LEDC(Light
    發表于 07-22 10:45

    攝影補光常用LED一覽表

    影補光用到的LED有很多種,如5600K-6500K色溫的LED、3500K-450
    的頭像 發表于 07-18 13:51 ?1719次閱讀
    攝影補光<b class='flag-5'>燈</b>常用LED<b class='flag-5'>燈</b><b class='flag-5'>珠</b>一覽表

    WS2812是否可以反轉UART的輸出?

    是否可以反轉 UART 的輸出。輸出 1 而不是 0,輸出 0 而不是 1。 問題背景:按照以下方案使用 UART 控制 WS2812: (1)XX XXX XX(0). 具有 7 個數據位的 UART。 WS2812 的 3 位。
    發表于 07-15 07:37

    通過手機app與esp32或者cc2541連接,哪個開發難度小?

    各位,有個問題請教一下,我知道esp32有藍牙模塊,cc2541也有,我想使用這兩個ic控制ws2812彩燈,通過手機app設置的點亮方式,這兩個哪個開發難度小,能否給個相應的開發例程?
    發表于 07-09 20:59

    ESP32-S3控制WS2812帶顯示異常如何解決?

    本人用ESP32S3設計一款產品,在用ESP32-S3控制WS2812帶時出現多顯示異常,無法正常顯示。(顏色和位置都不對),異常率
    發表于 06-05 06:17

    開源項目!可編程的磁懸浮桌面氛圍(Arduino+WS2812

    ,喜歡的初學者可以來嘗試一下。 材料清單 Arduino Nano x 1 PLA 材料 x 若干 LED 帶(WS2812 60led/m)x 若干 12.7mm x 5mm 磁鐵 x 2
    發表于 06-03 11:53

    【Vision Board創客營連載體驗】利用 OpenMV 實現 AprilTag 跟蹤以及通過串口通訊控制 Arduino 驅動 LED

    作為下位機接收坐標信息并將信息轉化為 LED 矩陣坐標,再通過 FastLED 庫實現對 WS2812b 帶的 LED 操控。 開發現況 由于手頭上的 WS2812b 帶連接觸點
    發表于 05-31 00:01

    2024年如何挑選高光效,為攝影燈具添光加彩!

    LED 光電攝影 海隆興光電專業做LED
    的頭像 發表于 04-22 13:54 ?988次閱讀
    2024年如何挑選高光效<b class='flag-5'>燈</b><b class='flag-5'>珠</b>,為攝影燈具添光加彩!

    STM32F030 MDA+PWM驅動ws2812b,起始的50US的低電平是怎么產生?

    STM32F030 MDA+PWM 驅動 ws2812b,起始的50US的低電平怎么產生? 現在dma+pwm,倒是可以產生一個800K hz的驅動數據,但是WS2812要求有50US的低電平作為復位信號,這個復位信號怎么產生?
    發表于 04-12 07:23

    SPI+DMA對Ws2812數據總是有一個高電平為什么?

    SPI+DMA對Ws2812數據總是有一個高電平 時鐘沒錯,發送給DMA的數據大小也沒問題,想不明白還有有哪里的原因
    發表于 03-15 07:55
    主站蜘蛛池模板: 亚洲1卡二卡3卡四卡不卡 | 六月婷婷在线观看 | 日本人69xxxxx| 色的视频网站 | 欧美性猛交xxxx乱大交中文 | 国产全部理论片线观看 | 日日添天天做天天爱 | 乱人伦的小说 | 亚洲最大色网站 | 国产成人精品视频一区二区不卡 | 91极品女神嫩模在线播放 | 欧美日韩国产成人高清视频 | 成人精品视频在线观看播放 | 日本亚洲卡一卡2卡二卡三卡四卡 | 免费免费啪视频在线 | 操农村妇女 | 久久天天躁狠狠躁夜夜躁 | 中国一级特黄高清免费的大片 | 国产乱码精品一区二区三区四川人 | 色婷婷在线观看视频 | 男人你懂的在线观看视频 | 欧美精品一区在线看 | 欧美视频亚洲色图 | 欧美adc影院| 亚洲人成亚洲人成在线观看 | 99热99热| 成年网站在线播放 | 在线观看日本免费不卡 | 日日干干夜夜 | 小雪被老外黑人撑破了 | 日韩电影天堂网 | 最新四虎4hu影库地址在线 | 操美女免费网站 | 淫婷婷 | 日韩一级片在线免费观看 | 欧美黄色大片免费观看 | 色偷偷亚洲天堂 | 国产精品香蕉成人网在线观看 | 国产精品欧美久久久久天天影视 | 九色97| 黄网页在线观看 |