0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

R128點(diǎn)燈指南加強(qiáng)篇—LEDC點(diǎn)三色流水燈(WS2812)

全志在線 ? 來(lái)源:全志在線 ? 2023-10-13 17:31 ? 次閱讀

R128-DevKit 擁有4顆 WS2812LED,本文將詳細(xì)敘述如何點(diǎn)亮他們。

1

LEDC模塊

簡(jiǎn)介

c6cb0286-69a9-11ee-939d-92fbcf53809c.png

LEDC 硬件方框圖如上圖所示,CPU 通過(guò) APB 總線操作 LEDC 寄存器來(lái)控制 LEDC;當(dāng) CPU配置好 LEDC 的相關(guān)寄存器之后,通過(guò) CPU 或 DMA 將 R、G、B 數(shù)據(jù)從 DRAM 搬到 LEDC FIFO 中,啟動(dòng) LEDC 之后就可以通過(guò) PIN 腳向外部的 LED 發(fā)送數(shù)據(jù)了。

c6ea2f08-69a9-11ee-939d-92fbcf53809c.png

LED 典型電路如圖所示,其中 DI 表示控制數(shù)據(jù)輸入腳,DO 表示控制數(shù)據(jù)輸出腳。DI 端接收從控制器傳過(guò)來(lái)的數(shù)據(jù),每個(gè) LED 內(nèi)部的數(shù)據(jù)鎖存器會(huì)存儲(chǔ) 24bit 數(shù)據(jù),剩余的數(shù)據(jù)經(jīng)過(guò)內(nèi)部整形處理電路整形放大后通過(guò) DO 端口開(kāi)始轉(zhuǎn)發(fā)輸出給下一個(gè)級(jí)聯(lián)的 LED。因此,每經(jīng)過(guò)一個(gè)LED,數(shù)據(jù)減少 24bit。

c6f90b86-69a9-11ee-939d-92fbcf53809c.png

注意,如果在單次直接設(shè)置第 n 個(gè) LED 的亮度和色彩的時(shí)候,前面 n-1 個(gè) LED 的亮度數(shù)據(jù)會(huì)在第 n 個(gè) LED 的數(shù)據(jù)前發(fā)送,不過(guò)這些數(shù)據(jù)將會(huì)是原來(lái) n-1 個(gè) LED 的亮度數(shù)據(jù)。

由于擁有獨(dú)立的 LEDC 模塊,在 R128 平臺(tái)上驅(qū)動(dòng) WS2812 類似的 RGB LED 不需要使用 SPI 模擬,也不需要使用 PWM 配置時(shí)序。直接使用這個(gè)模塊即可。

2

LEDC驅(qū)動(dòng)

設(shè)置

運(yùn)行 mrtos_menuconfig 進(jìn)入配置面,前往下列地址找到 LEDC Devices。

Drivers Options --->
  soc related device drivers --->
      LEDC devices --->
        [*] enable ledc driver

找到 LEDC Devices

c74fea6e-69a9-11ee-939d-92fbcf53809c.png

勾選如下選項(xiàng)

c77091b0-69a9-11ee-939d-92fbcf53809c.png

3

LEDC參數(shù)

配置

參考電路圖可知,LEDC 模塊連接的是 R128 的 PA13 引腳。參考手冊(cè)可知 MUX 為 7。

c7c24686-69a9-11ee-939d-92fbcf53809c.png

前往以下目錄并編輯 LEDC 的引腳和MUX

lichee/rtos/drivers/rtos-hal/hal/source/ledc/platform/ledc_sun20iw2.h
#define LEDC_PIN  GPIOA(13)
#define LEDC_PINMUXSEL 7
c7dc97ca-69a9-11ee-939d-92fbcf53809c.png

然后在以下目錄編輯并配置WS2812的時(shí)序參數(shù):

lichee/rtos/drivers/rtos-hal/hal/source/ledc/hal_ledc.c
struct ledc_config ledc_config = {
  .led_count = 4,
  .reset_ns = 84,
  .t1h_ns = 1000,
  .t1l_ns = 1000,
  .t0h_ns = 580,
  .t0l_ns = 1000,
  .wait_time0_ns = 84,
  .wait_time1_ns = 84,
  .wait_data_time_ns = 600000,
  .output_mode = "GRB",
};
c7f53f8c-69a9-11ee-939d-92fbcf53809c.png

4

編譯測(cè)試

簡(jiǎn)介

編譯后燒錄開(kāi)發(fā)板

c83f8eca-69a9-11ee-939d-92fbcf53809c.png

可以用命令hal_ledc來(lái)測(cè)試

hal_ledc   <亮度>

5

編譯測(cè)試

點(diǎn)亮紅色LED

運(yùn)行命令

hal_ledc 1 R 100
c899cc5a-69a9-11ee-939d-92fbcf53809c.png

即可點(diǎn)亮第一顆紅色LED

c8ac8aca-69a9-11ee-939d-92fbcf53809c.png

6

編譯測(cè)試

點(diǎn)亮綠色LED

運(yùn)行命令

hal_ledc 2 G 100
c902848e-69a9-11ee-939d-92fbcf53809c.png

即可點(diǎn)亮第二顆綠色LED

c919ba50-69a9-11ee-939d-92fbcf53809c.png

7

七彩流水燈

實(shí)現(xiàn)

前往項(xiàng)目文件夾編輯main.c,這里我選擇在 M33 核心上編寫程序,所以選用的是:

lichee/rtos/projects/r128s2/module_m33/src/main.c 

如果是編寫 C906 核心的程序,請(qǐng)修改

lichee/rtos/projects/r128s2/module_c906/src/main.c
#include 
#include 
#include 


// 使用RGB 分量合成顏色值
#define MERAGECOLOR(G, R, B) (((uint32_t)G << 16) | ((uint16_t)R << 8) | B)
#define PIXEL_NUM 4


// 生成顏色
uint32_t WS281x_Wheel(uint8_t wheelPos) {
 ?wheelPos = 255 - wheelPos;
 ?if (wheelPos < 85) {
 ? ?return MERAGECOLOR(255 - wheelPos * 3, 0, wheelPos * 3);
 ?}
 ?if (wheelPos < 170) {
 ? ?wheelPos -= 85;
 ? ?return MERAGECOLOR(0, wheelPos * 3, 255 - wheelPos * 3);
 ?}
 ?wheelPos -= 170;
 ?return MERAGECOLOR(wheelPos * 3, 255 - wheelPos * 3, 0);
}


// 亮度設(shè)置
uint32_t WS281xLSet(uint32_t rgb, float k) {
 ? ?uint8_t r, g, b;
 ? ?float h, s, v;
 ? ?uint8_t cmax, cmin, cdes;


 ? ?r = (uint8_t) (rgb >> 16);
  g = (uint8_t) (rgb >> 8);
  b = (uint8_t) (rgb);


  cmax = r > g ? r : g;
  if (b > cmax)
    cmax = b;
  cmin = r < g ? r : g;
 ? ?if (b < cmin)
 ? ? ? ?cmin = b;
 ? ?cdes = cmax - cmin;


 ? ?v = cmax / 255.0f;
 ? ?s = cmax == 0 ? 0 : cdes / (float) cmax;
 ? ?h = 0;


 ? ?if (cmax == r && g >= b)
    h = ((g - b) * 60.0f / cdes) + 0;
  else if (cmax == r && g < b)
 ? ? ? ?h = ((g - b) * 60.0f / cdes) + 360;
 ? ?else if (cmax == g)
 ? ? ? ?h = ((b - r) * 60.0f / cdes) + 120;
 ? ?else
 ? ? ? ?h = ((r - g) * 60.0f / cdes) + 240;


 ? ?v *= k;


 ? ?float f, p, q, t;
 ? ?float rf, gf, bf;
 ? ?int i = ((int) (h / 60) % 6);
 ? ?f = (h / 60) - i;
 ? ?p = v * (1 - s);
 ? ?q = v * (1 - f * s);
 ? ?t = v * (1 - (1 - f) * s);
 ? ?switch (i) {
 ? ?case 0:
 ? ? ? ?rf = v;
 ? ? ? ?gf = t;
 ? ? ? ?bf = p;
 ? ? ? ?break;
 ? ?case 1:
 ? ? ? ?rf = q;
 ? ? ? ?gf = v;
 ? ? ? ?bf = p;
 ? ? ? ?break;
 ? ?case 2:
 ? ? ? ?rf = p;
 ? ? ? ?gf = v;
 ? ? ? ?bf = t;
 ? ? ? ?break;
 ? ?case 3:
 ? ? ? ?rf = p;
 ? ? ? ?gf = q;
 ? ? ? ?bf = v;
 ? ? ? ?break;
 ? ?case 4:
 ? ? ? ?rf = t;
 ? ? ? ?gf = p;
 ? ? ? ?bf = v;
 ? ? ? ?break;
 ? ?case 5:
 ? ? ? ?rf = v;
 ? ? ? ?gf = p;
 ? ? ? ?bf = q;
 ? ? ? ?break;
 ? ?default:
 ? ? ? ?break;
 ? ?}


 ? ?r = (uint8_t) (rf * 255.0);
 ? ?g = (uint8_t) (gf * 255.0);
 ? ?b = (uint8_t) (bf * 255.0);


 ? ?return ((uint32_t) r << 16) | ((uint32_t) g << 8) | b;
}


// 延時(shí)函數(shù)
static inline int msleep(int ms) {
 ? ?vTaskDelay(ms / portTICK_RATE_MS); 
}


// 測(cè)試 LEDC
int ledc_test_loop() {
 ?int i = 0, j = 0, err;
 ?int mode = 0;
 ?uint8_t R = 0, G = 0, B = 0;


 ?err = hal_ledc_init();
 ?if (err) {
 ? ?printf("ledc init error
");
 ? ?return -1;
 ?}


 ?while (1) {
 ? ?for (j = 0; j < 256; j++) {
 ? ? ?for (i = 0; i < PIXEL_NUM; i++) {
 ? ? ? ?sunxi_set_led_brightness(
 ? ? ? ? ? ?i + 1, WS281xLSet(WS281x_Wheel(((i * 256 / PIXEL_NUM) + j) & 255), 0.2));
 ? ? ? ?msleep(1);
 ? ? ?}
 ? ? ?msleep(10);
 ? ?}
 ?}
 ?return 1;
}

并且將測(cè)試函數(shù)加入到 cpu0_app_entry 中。

c96f431c-69a9-11ee-939d-92fbcf53809c.png

重新燒錄即可實(shí)現(xiàn)七彩流水燈

c985e2f2-69a9-11ee-939d-92fbcf53809c.png

本文內(nèi)容均轉(zhuǎn)載自

https://r128.docs.aw-ol.com/demo/ws2812/#_2






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • led
    led
    +關(guān)注

    關(guān)注

    240

    文章

    22992

    瀏覽量

    654726
  • 控制器
    +關(guān)注

    關(guān)注

    112

    文章

    16035

    瀏覽量

    176676
  • DRAM
    +關(guān)注

    關(guān)注

    40

    文章

    2292

    瀏覽量

    183132
  • 流水燈
    +關(guān)注

    關(guān)注

    21

    文章

    432

    瀏覽量

    59558
  • WS2812
    +關(guān)注

    關(guān)注

    0

    文章

    32

    瀏覽量

    6091
  • R128
    +關(guān)注

    關(guān)注

    0

    文章

    41

    瀏覽量

    89

原文標(biāo)題:R128點(diǎn)燈指南加強(qiáng)篇——LEDC點(diǎn)三色流水燈(WS2812)

文章出處:【微信號(hào):gh_79acfa3aa3e3,微信公眾號(hào):全志在線】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    51單片機(jī)ws2811驅(qū)動(dòng)程序

    51單片機(jī)ws2811驅(qū)動(dòng)程序,51驅(qū)動(dòng)WS2812B三色流水燈 WS2812簡(jiǎn)介模組選型關(guān)于WS281
    發(fā)表于 07-21 08:44

    用Microchip PIC16單片機(jī)驅(qū)動(dòng)WS2812

    用Microchip PIC16單片機(jī)驅(qū)動(dòng)WS2812 LEDWS2812是一款集成了控制電路與發(fā)光電路的三色LED源,具有連接簡(jiǎn)單、擴(kuò)展方便、調(diào)控方便的特點(diǎn)。下圖是其數(shù)據(jù)傳輸?shù)膮f(xié)議
    發(fā)表于 11-23 07:20

    用STM32控制WS2812 RGB帶的代碼分享

    用STM32控制WS2812 RGB帶的代碼分享
    發(fā)表于 12-15 07:09

    Arduino控制WS2812帶的方法

    形與一個(gè)5050LED珠相同,每個(gè)元件即為一個(gè)像素點(diǎn)。像素點(diǎn)內(nèi)部包含了智能數(shù)字接口數(shù)據(jù)鎖存信號(hào)整形放大電路,還包括有高精度的內(nèi)部振蕩器和可編程電流控制部分,有效保證了像素點(diǎn)的顏色高度
    發(fā)表于 01-12 08:08

    自制60位WS2812環(huán)

    描述60位WS2812環(huán)超小60位WS2812環(huán)可作為超小時(shí)鐘采用2020環(huán)圈只有36mm不到目前市60位環(huán)半徑78毫米的雙面鋪銅上層
    發(fā)表于 09-01 07:11

    全志R128芯片應(yīng)用開(kāi)發(fā)案例——驅(qū)動(dòng) WS2812 流水燈

    驅(qū)動(dòng) WS2812 流水燈 本文案例代碼 下載地址 驅(qū)動(dòng) WS2812 流水燈案例代碼 https://www.aw-ol.com/downloads?cat=24
    發(fā)表于 10-10 14:08

    如何進(jìn)行WS2812的面板制作詳細(xì)資料合集免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是如何進(jìn)行WS2812的面板制作詳細(xì)資料合集免費(fèi)下載包括了:DMX512轉(zhuǎn)WS2812 面板程序,STC8系列單片機(jī)技術(shù)參考手冊(cè),
    發(fā)表于 05-29 17:36 ?162次下載
    如何進(jìn)行<b class='flag-5'>WS2812</b>的面板<b class='flag-5'>燈</b>制作詳細(xì)資料合集免費(fèi)下載

    STM32使用LL庫(kù)PWM的DMA模式驅(qū)動(dòng)ws2812

    STM32使用LL庫(kù)PWM的DMA模式驅(qū)動(dòng)ws2812一、WS2812簡(jiǎn)介二、CUBEMX初始化代碼配置一、WS2812簡(jiǎn)介給個(gè)鏈接吧,ws2812時(shí)序簡(jiǎn)介
    發(fā)表于 11-30 10:21 ?66次下載
    STM32使用LL庫(kù)PWM的DMA模式驅(qū)動(dòng)<b class='flag-5'>ws2812</b>

    STM32F103C8T6+PWM+DMA驅(qū)動(dòng) WS2812

    #STM32+PWM+DMA驅(qū)動(dòng) WS2812帶#文章目錄1.理論:2代碼:理論:使用STM32F103C8T6驅(qū)動(dòng)WS2812帶,每個(gè)
    發(fā)表于 12-27 19:29 ?211次下載
    STM32F103C8T6+PWM+DMA驅(qū)動(dòng) <b class='flag-5'>WS2812</b><b class='flag-5'>燈</b>帶

    PWM+DMA 驅(qū)動(dòng) WS2812

    包括使用庫(kù)函數(shù)翻轉(zhuǎn)電平和使用寄存器翻轉(zhuǎn)電平的代碼執(zhí)行效率的差距while(1)和 for(;;)的執(zhí)行效率的對(duì)比二、原理講解DMA是什么?——幫 CPU 跑腿的 DMA詳細(xì)介紹在另外一鏈接:WS2812B 說(shuō)明詳細(xì)介紹在另外一
    發(fā)表于 12-28 19:14 ?112次下載
    PWM+DMA 驅(qū)動(dòng) <b class='flag-5'>WS2812</b>

    超小60位WS2812環(huán)

    電子發(fā)燒友網(wǎng)站提供《超小60位WS2812環(huán).zip》資料免費(fèi)下載
    發(fā)表于 08-12 09:58 ?20次下載
    超小60位<b class='flag-5'>WS2812</b><b class='flag-5'>燈</b>環(huán)

    最簡(jiǎn)WS2812類似RGB條驅(qū)動(dòng)方法

    最簡(jiǎn)WS2812類似RGB條驅(qū)動(dòng)方法
    的頭像 發(fā)表于 06-19 17:51 ?3284次閱讀
    最簡(jiǎn)<b class='flag-5'>WS2812</b>類似RGB<b class='flag-5'>燈</b>條驅(qū)動(dòng)方法

    多個(gè)WS2812珠的點(diǎn)亮實(shí)驗(yàn)

    今天看到一位同學(xué)在群里面的留言,要我寫一個(gè)長(zhǎng)串WS2812點(diǎn)亮的程序
    的頭像 發(fā)表于 10-24 14:51 ?1533次閱讀
    多個(gè)<b class='flag-5'>WS2812</b><b class='flag-5'>燈</b>珠的點(diǎn)亮實(shí)驗(yàn)

    迪文屏控制WS2812氛圍

    ——來(lái)自迪文開(kāi)發(fā)者論壇本期為大家推送迪文開(kāi)發(fā)者論壇獲獎(jiǎng)開(kāi)源案例——迪文屏控制WS2812氛圍。工程師通過(guò)COF智能屏的OS核精準(zhǔn)控制WS2812幻彩燈帶每一顆珠顏色,實(shí)現(xiàn)炫酷的
    的頭像 發(fā)表于 01-26 08:12 ?857次閱讀
    迪文屏控制<b class='flag-5'>WS2812</b>氛圍<b class='flag-5'>燈</b>

    論如何使用WS2812以及類似

    ? ?WS2812 LED珠,這是一種非常流行的可尋址RGB LED。每個(gè)WS2812 LED內(nèi)部集成了控制電路,因此可以通過(guò)一個(gè)數(shù)據(jù)輸入線來(lái)單獨(dú)控制每一個(gè)LED的顏色和亮度。這種特性使得
    的頭像 發(fā)表于 09-30 15:11 ?175次閱讀
    論如何使用<b class='flag-5'>WS2812</b>以及類似<b class='flag-5'>燈</b>珠