0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

R128点灯指南加强篇—LEDC点三色流水灯(WS2812)

全志在线 来源:全志在线 2023-10-13 17:31 次阅读

R128-DevKit 拥有4颗 WS2812LED,本文将详细叙述如何点亮他们。

1

LEDC模块

简介

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

LEDC 硬件方框图如上图所示,CPU 通过 APB 总线操作 LEDC 寄存器来控制 LEDC;当 CPU配置好 LEDC 的相关寄存器之后,通过 CPU 或 DMA 将 R、G、B 数据从 DRAM 搬到 LEDC FIFO 中,启动 LEDC 之后就可以通过 PIN 脚向外部的 LED 发送数据了。

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

LED 典型电路如图所示,其中 DI 表示控制数据输入脚,DO 表示控制数据输出脚。DI 端接收从控制器传过来的数据,每个 LED 内部的数据锁存器会存储 24bit 数据,剩余的数据经过内部整形处理电路整形放大后通过 DO 端口开始转发输出给下一个级联的 LED。因此,每经过一个LED,数据减少 24bit。

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

注意,如果在单次直接设置第 n 个 LED 的亮度和色彩的时候,前面 n-1 个 LED 的亮度数据会在第 n 个 LED 的数据前发送,不过这些数据将会是原来 n-1 个 LED 的亮度数据。

由于拥有独立的 LEDC 模块,在 R128 平台上驱动 WS2812 类似的 RGB LED 不需要使用 SPI 模拟,也不需要使用 PWM 配置时序。直接使用这个模块即可。

2

LEDC驱动

设置

运行 mrtos_menuconfig 进入配置面,前往下列地址找到 LEDC Devices。

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

找到 LEDC Devices

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

勾选如下选项

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

3

LEDC参数

配置

参考电路图可知,LEDC 模块连接的是 R128 的 PA13 引脚。参考手册可知 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的时序参数:

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

编译测试

简介

编译后烧录开发板

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

可以用命令hal_ledc来测试

hal_ledc   <亮度>

5

编译测试

点亮红色LED

运行命令

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

即可点亮第一颗红色LED

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

6

编译测试

点亮绿色LED

运行命令

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

即可点亮第二颗绿色LED

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

7

七彩流水灯

实现

前往项目文件夹编辑main.c,这里我选择在 M33 核心上编写程序,所以选用的是:

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

如果是编写 C906 核心的程序,请修改

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);
}


// 亮度设置
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;
}


// 延时函数
static inline int msleep(int ms) {
    vTaskDelay(ms / portTICK_RATE_MS); 
}


// 测试 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;
}

并且将测试函数加入到 cpu0_app_entry 中。

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

重新烧录即可实现七彩流水灯

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

本文内容均转载自

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






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • led
    led
    +关注

    关注

    240

    文章

    23128

    浏览量

    658263
  • 控制器
    +关注

    关注

    112

    文章

    16185

    浏览量

    177336
  • DRAM
    +关注

    关注

    40

    文章

    2303

    浏览量

    183287
  • 流水灯
    +关注

    关注

    21

    文章

    432

    浏览量

    59633
  • WS2812
    +关注

    关注

    0

    文章

    32

    浏览量

    6127
  • R128
    +关注

    关注

    0

    文章

    41

    浏览量

    96

原文标题:R128点灯指南加强篇——LEDC点三色流水灯(WS2812)

文章出处:【微信号:gh_79acfa3aa3e3,微信公众号:全志在线】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    51单片机ws2811驱动程序

    51单片机ws2811驱动程序,51驱动WS2812B三色流水灯 WS2812简介模组选型关于WS281
    发表于 07-21 08:44

    用Microchip PIC16单片机驱动WS2812

    用Microchip PIC16单片机驱动WS2812 LEDWS2812是一款集成了控制电路与发光电路的三色LED源,具有连接简单、扩展方便、调控方便的特点。下图是其数据传输的协议
    发表于 11-23 07:20

    用STM32控制WS2812 RGB带的代码分享

    用STM32控制WS2812 RGB带的代码分享
    发表于 12-15 07:09

    Arduino控制WS2812带的方法

    形与一个5050LED珠相同,每个元件即为一个像素。像素内部包含了智能数字接口数据锁存信号整形放大电路,还包括有高精度的内部振荡器和可编程电流控制部分,有效保证了像素的颜色高度
    发表于 01-12 08:08

    自制60位WS2812

    描述60位WS2812环超小60位WS2812环可作为超小时钟采用2020环圈只有36mm不到目前市60位环半径78毫米的双面铺铜上层
    发表于 09-01 07:11

    全志R128芯片应用开发案例——驱动 WS2812 流水灯

    驱动 WS2812 流水灯 本文案例代码 下载地址 驱动 WS2812 流水灯案例代码 https://www.aw-ol.com/downloads?cat=24
    发表于 10-10 14:08

    如何进行WS2812的面板制作详细资料合集免费下载

    本文档的主要内容详细介绍的是如何进行WS2812的面板制作详细资料合集免费下载包括了:DMX512转WS2812 面板程序,STC8系列单片机技术参考手册,
    发表于 05-29 17:36 163次下载
    如何进行<b class='flag-5'>WS2812</b>的面板<b class='flag-5'>灯</b>制作详细资料合集免费下载

    STM32使用LL库PWM的DMA模式驱动ws2812

    STM32使用LL库PWM的DMA模式驱动ws2812一、WS2812简介二、CUBEMX初始化代码配置一、WS2812简介给个链接吧,ws2812时序简介
    发表于 11-30 10:21 66次下载
    STM32使用LL库PWM的DMA模式驱动<b class='flag-5'>ws2812</b>

    STM32F103C8T6+PWM+DMA驱动 WS2812

    #STM32+PWM+DMA驱动 WS2812带#文章目录1.理论:2代码:理论:使用STM32F103C8T6驱动WS2812带,每个
    发表于 12-27 19:29 213次下载
    STM32F103C8T6+PWM+DMA驱动 <b class='flag-5'>WS2812</b><b class='flag-5'>灯</b>带

    PWM+DMA 驱动 WS2812

    包括使用库函数翻转电平和使用寄存器翻转电平的代码执行效率的差距while(1)和 for(;;)的执行效率的对比二、原理讲解DMA是什么?——帮 CPU 跑腿的 DMA详细介绍在另外一链接:WS2812B 说明详细介绍在另外一
    发表于 12-28 19:14 112次下载
    PWM+DMA 驱动 <b class='flag-5'>WS2812</b>

    超小60位WS2812

    电子发烧友网站提供《超小60位WS2812环.zip》资料免费下载
    发表于 08-12 09:58 20次下载
    超小60位<b class='flag-5'>WS2812</b><b class='flag-5'>灯</b>环

    最简WS2812类似RGB条驱动方法

    最简WS2812类似RGB条驱动方法
    的头像 发表于 06-19 17:51 3402次阅读
    最简<b class='flag-5'>WS2812</b>类似RGB<b class='flag-5'>灯</b>条驱动方法

    多个WS2812珠的点亮实验

    今天看到一位同学在群里面的留言,要我写一个长串WS2812亮的程序
    的头像 发表于 10-24 14:51 1712次阅读
    多个<b class='flag-5'>WS2812</b><b class='flag-5'>灯</b>珠的点亮实验

    迪文屏控制WS2812氛围

    ——来自迪文开发者论坛本期为大家推送迪文开发者论坛获奖开源案例——迪文屏控制WS2812氛围。工程师通过COF智能屏的OS核精准控制WS2812幻彩灯带每一颗珠颜色,实现炫酷的
    的头像 发表于 01-26 08:12 945次阅读
    迪文屏控制<b class='flag-5'>WS2812</b>氛围<b class='flag-5'>灯</b>

    论如何使用WS2812以及类似

    ​  WS2812 LED珠,这是一种非常流行的可寻址RGB LED。每个WS2812 LED内部集成了控制电路,因此可以通过一个数据输入线来单独控制每一个LED的颜色和亮度。这种特性使得
    的头像 发表于 09-30 15:11 296次阅读
    论如何使用<b class='flag-5'>WS2812</b>以及类似<b class='flag-5'>灯</b>珠