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

news2024/10/7 20:36:47

驱动 WS2812 流水灯

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

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

在这里插入图片描述

LEDC 模块简介

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

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

设置 LEDC 驱动

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

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

找到 LEDC Devices

在这里插入图片描述

勾选如下选项

在这里插入图片描述

配置 LEDC 参数

参考电路图可知,LEDC 模块连接的是 R128 的 PA13 引脚。参考手册可知 MUX 为 7

在这里插入图片描述

前往 lichee/rtos/drivers/rtos-hal/hal/source/ledc/platform/ledc_sun20iw2.h 并编辑 LEDC 的引脚和MUX

#define LEDC_PIN	GPIOA(13)
#define LEDC_PINMUXSEL	7

在这里插入图片描述

然后编辑 lichee/rtos/drivers/rtos-hal/hal/source/ledc/hal_ledc.c 配置 WS2812 的时序参数:

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",
};

在这里插入图片描述

编译测试

编译后烧录开发板

在这里插入图片描述

可以用命令 hal_ledc 来测试

hal_ledc <LED号> <R|G|B> <亮度>

点亮红色 LED

运行命令

hal_ledc 1 R 100

在这里插入图片描述

即可点亮第一颗 LED

在这里插入图片描述

点亮绿色 LED

运行命令

hal_ledc 2 G 100

在这里插入图片描述

第二颗 LED 即可点亮绿色

在这里插入图片描述

实现七彩流水灯

前往项目文件夹编辑 main.c,这里我选择在 M33 核心上编写程序,所以选用的是 lichee/rtos/projects/r128s2/module_m33/src/main.c ,如果是编写 C906 核心的程序,请修改 lichee/rtos/projects/r128s2/module_c906/src/main.c

#include <sunxi_hal_ledc.h>
#include <hal_cmd.h>
#include <hal_timer.h>

// 使用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\n");
    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 中。

在这里插入图片描述

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

在这里插入图片描述

原贴链接:https://bbs.aw-ol.com/topic/4368/
资源获取、问题讨论可以到全志在线开发者社区进行:https://www.aw-ol.com
全志及开发者最新动态可以关注全志在线微信公众号

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1076036.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用“Apple 诊断”测试你的 Mac(查看电池是否到达更换标准)

使用“Apple 诊断”测试你的 Mac “Apple 诊断”&#xff08;以前称为“Apple Hardware Test”&#xff09;可以检查你的 Mac 是不是存在硬件问题。 如果你认为你的 Mac 可能存在硬件问题&#xff0c;可以使用“Apple 诊断”来帮助确定可能存在故障的硬件组件。“Apple 诊断”…

2023P企业管理系统提供商,助力大中型企业一体化管理,免费更新

大中型企业通常业务流程更为复杂&#xff0c;工作数据更庞大&#xff0c;数据迁移的过程中可能会遇到数据不一致、数据丢失等问题。因此大中型企业实施ERP系统是一项复杂的任务&#xff0c;需要企业投入大量的资源和精力&#xff0c;克服各种困难和挑战。 在过往为广西省大中型…

淘宝API官方商品、交易、订单、物流、插旗接口如下:

以下是一些淘宝官方商品、交易、订单、物流、插旗接口的参考&#xff1a; 获取一个产品的信息(taobao.product.get)&#xff1a;该接口可以获取一个产品的信息&#xff0c;包括商品ID、标题、价格、销量等。搜索产品信息(taobao.products.search)&#xff1a;该接口可以搜索产…

“UTONMOS”掀起元宇宙游戏热潮,全球发展前景广阔

我们都知道&#xff0c;市面上无论是PC端的网游还是移动端手游&#xff0c;它如果要做到源源不断的内容输出&#xff0c;不仅取决于游戏公司产品质量和业绩&#xff0c;也与公司的决策和市场沟通密不可分。 元宇宙游戏市场受到关注 近年来&#xff0c;元宇宙游戏市场逐渐升温…

算法题:柠檬水找零(典型的贪心算法问题)

这道题就是纯贪心算法题&#xff0c;遍历每个顾客&#xff0c;先把钱收了&#xff0c;如果是10块钱就判断手里头有没有5元用于找零&#xff1b;如果是20块钱&#xff0c;先判断是不是有10元5元&#xff0c;如果没有就再判断是否有3个5元。没有的话就直接返回 False。(完整题目附…

保研经历分享(一)

这个系列的文章主要是想记录一下自己大学期间最重要的一件事&#xff08;保研!!&#xff09;的经历、过程&#xff0c;外加一些保研流程介绍、面试经验、院校投递、踩坑经历&#xff0c;主要给学弟学妹们避雷&#xff0c;也做一些借鉴吧~ 这一篇主要是对保研过程的一些介绍&…

如何在虚幻引擎中渲染动画?

大家好&#xff0c;今天我将展示如何在虚幻引擎中渲染动画&#xff0c;以及虚幻引擎渲染动画怎么设置的方法步骤。 需要提前了解&#xff1a; 虚幻引擎本地运行慢、渲染慢、本地配置不够&#xff0c;如何解决&#xff1f; 渲云云渲染支持虚幻引擎离线渲染&#xff0c;可批量…

【UE5】Pixel Streaming 配置https协议

【UE5】Pixel Streaming 配置https协议 Pixel Streaming 传输视频流插件&#xff0c;使用任何现代Web浏览器进行连接&#xff0c;并从虚幻引擎应用程序中流式传输渲染的帧像素和音频。 用户无需安装或下载任何内容。 HTTPS &#xff08;全称&#xff1a;Hypertext Transfer Pro…

大模型部署手记(12)LLaMa2+Chinese-LLaMA-Plus-2-7B+Windows+text-gen+中文对话

1.简介&#xff1a; 组织机构&#xff1a;Meta&#xff08;Facebook&#xff09; 代码仓&#xff1a;https://github.com/facebookresearch/llama 模型&#xff1a;chinese-alpaca-2-7b-hf 下载&#xff1a;使用百度网盘下载 硬件环境&#xff1a;暗影精灵7Plus Windows版…

“套壳”OpenAI,注定消亡!全球首个 20 万字大模型发布丨 RTE 开发者日报 Vol.63

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE &#xff08;Real Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有…

见微知著:从企业售后技术支持看云计算发展

作者&#xff1a;余凯 售后业务中的细微变化 作为阿里云企业容器技术支持的一员&#xff0c;每天会面对全球各地企业级客户提出的关于容器的各种问题&#xff0c;通过这几年的技术支持的经历&#xff0c;逐步发现容器问题客户的一些惯性&#xff0c;哪些是重度用户&#xff0…

Unity设计模式——外观模式

子系统的几个类&#xff1a; class SubSystemOne {public void MethodOne(){Debug.Log("方法一");} } class SubSystemTwo {public void MethodTwo(){Debug.Log("方法2");} } class SubSystemThrre {public void MethodThree(){Debug.Log("方法三&qu…

企业视频直播画面时移看点的用法

企业视频直播画面时移时移功能&#xff0c;可以让客户在观看直播的时&#xff0c;实时回看直播内容&#xff1b;看点功能&#xff0c;可以将视频内容分段标记&#xff0c;能让客户明确内容结构&#xff0c;快速定位目标信息&#xff0c;提升观看体验&#xff0c;跟我一起来体验…

cad由于找不到mfc140u.dll怎么回事?mfc140u.dll丢失的解决方法

当你在使用 CAD&#xff08;计算机辅助设计&#xff09;软件时&#xff0c;如果出现“找不到 mfc140u.dll”的错误提示&#xff0c;这通常意味着你的计算机上缺少这个重要的动态链接库文件。Mfc140u.dll 是 Microsoft Foundation Class&#xff08;MFC&#xff09;库的一部分&a…

[CISCN2019 总决赛 Day2 Web1]Easyweb 盲注 \\0绕过 文件上传文件名木马

首先开局登入 我们开始目录扫描 扫除 robots.txt 现在只有三个文件 最后发现 只有 image.php.bak存在 这里主要的地方是 \\0 因为第一个\会被转义 这里就会变为 \0 表示空白 那我们sql语句就会变为了 select * from images where id\0 但是这里我们不可以使用 \\ 因为…

数据结构题型16-线索二叉树

文章目录 1 参考博客&#xff1a;2 线索二叉树的节点结构3、分析他人博客 1 参考博客&#xff1a; 1、【图解】数据结构代码领背-中序建立线索二叉树 2、【数据结构】中序线索二叉树的实现(源代码以及讲解) 2 线索二叉树的节点结构 3、分析他人博客 具体博客地址请参考&…

使用docker搭建kafka集群、可视化操作台

单机搭建 1 拉取zookeeper镜像 docker pull wurstmeister/zookeeper 2 启动zookeeper容器 docker run -d --name zookeeper -p 2181:2181 -v /etc/localtime:/etc/localtime wurstmeister/zookeeper 3 拉取kafka镜像 docker pull wurstmeister/kafka 4 启动kafka镜像 docker…

【配置vscode编写c或c++程序,并在外部控制台输出程序和解决中文乱码问题!!!】

配置vscode编写c或c程序&#xff0c;并在外部控制台输出程序和解决中文乱码问题&#xff01;&#xff01;&#xff01; 1、点击扩展&#xff0c;添加C语言所需的插件&#xff08;点击安装&#xff0c;安装完成后点击设置标志安装另一个版本&#xff0c;注意一定要安装1.8.4版本…

赋能智能制造产业发展,开源网安入选广东省智能制造生态合作伙伴

​为贯彻《“十四五”智能制造发展规划》&#xff0c;加快构建广东省智能制造发展生态&#xff0c;广东省工业和信息化厅组织开展了第三批广东省智能制造生态合作伙伴筛选工作。经专家评审和公示&#xff0c;开源网安成功入选第三批广东省智能制造生态合作伙伴。 一直以来&…