R128-DevKit 擁有4顆 WS2812LED,本文將詳細(xì)敘述如何點(diǎn)亮他們。
1
LEDC模塊
簡(jiǎn)介
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ù)了。
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。
注意,如果在單次直接設(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 類(lèi)似的 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
勾選如下選項(xiàng)
3
LEDC參數(shù)
配置
參考電路圖可知,LEDC 模塊連接的是 R128 的 PA13 引腳。參考手冊(cè)可知 MUX 為 7。
前往以下目錄并編輯 LEDC 的引腳和MUX
lichee/rtos/drivers/rtos-hal/hal/source/ledc/platform/ledc_sun20iw2.h
#define LEDC_PIN GPIOA(13) #define LEDC_PINMUXSEL 7

然后在以下目錄編輯并配置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", };

4
編譯測(cè)試
簡(jiǎn)介
編譯后燒錄開(kāi)發(fā)板
可以用命令hal_ledc來(lái)測(cè)試
hal_ledc<亮度>
5
編譯測(cè)試
點(diǎn)亮紅色LED
運(yùn)行命令
hal_ledc 1 R 100

即可點(diǎn)亮第一顆紅色LED
6
編譯測(cè)試
點(diǎn)亮綠色LED
運(yùn)行命令
hal_ledc 2 G 100

即可點(diǎn)亮第二顆綠色LED
7
七彩流水燈
實(shí)現(xiàn)
前往項(xiàng)目文件夾編輯main.c,這里我選擇在 M33 核心上編寫(xiě)程序,所以選用的是:
lichee/rtos/projects/r128s2/module_m33/src/main.c
如果是編寫(xiě) 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 中。
重新燒錄即可實(shí)現(xiàn)七彩流水燈
本文內(nèi)容均轉(zhuǎn)載自
https://r128.docs.aw-ol.com/demo/ws2812/#_2
審核編輯:劉清
-
led
+關(guān)注
關(guān)注
242文章
23617瀏覽量
669343 -
控制器
+關(guān)注
關(guān)注
114文章
16854瀏覽量
182357 -
DRAM
+關(guān)注
關(guān)注
40文章
2340瀏覽量
184980 -
流水燈
+關(guān)注
關(guān)注
21文章
433瀏覽量
60220 -
WS2812
+關(guān)注
關(guān)注
0文章
33瀏覽量
6474 -
R128
+關(guān)注
關(guān)注
0文章
41瀏覽量
226
原文標(biāo)題:R128點(diǎn)燈指南加強(qiáng)篇——LEDC點(diǎn)三色流水燈(WS2812)
文章出處:【微信號(hào):gh_79acfa3aa3e3,微信公眾號(hào):全志在線】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
【RA-Eco-RA4M2開(kāi)發(fā)板評(píng)測(cè)】點(diǎn)亮WS2812點(diǎn)陣屏
51單片機(jī)ws2811驅(qū)動(dòng)程序
用Microchip PIC16單片機(jī)驅(qū)動(dòng)WS2812
Arduino控制WS2812燈帶的方法
自制60位WS2812燈環(huán)
全志R128芯片應(yīng)用開(kāi)發(fā)案例——驅(qū)動(dòng) WS2812 流水燈
如何進(jìn)行WS2812的面板燈制作詳細(xì)資料合集免費(fèi)下載

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

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

超小60位WS2812燈環(huán)

迪文屏控制WS2812氛圍燈

論如何使用WS2812以及類(lèi)似燈珠

評(píng)論