【TOLIN】第四章|驱动WS2812B彩灯

2024-04-13 00:32

本文主要是介绍【TOLIN】第四章|驱动WS2812B彩灯,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【TOLIN】第四章|驱动WS2812B彩灯

                                                 

作者:Tkwer

公众号:Tkwer望远镜

 

WS2812B彩灯介绍

    WS2812是一个集控制电路和发光电路于一体的智能外控LED光源,其型号与一个5050LED灯珠相同,每个元件为一个像素点,像素点的内部包含了智能数字接口数据锁存信号整形放大驱动电路。为了保证像素点的颜色高度一致,数据协议采用单线归零码的通讯方式,像素点在上电复位以后DIN 接收从控制器传输过来的数据,首先送过来的是24bit数据被第一个像素点提取后,送到像素点的内部数据锁存器,剩余的数据经过内部整形处理电路整形放大后通过DO端口开始转发输出给下一级联的像素点,每经过一个像素点的传输,信号减少24bit。每个像素点的三基色颜色可实现256级亮度显示,完成16777216种颜色的全真色彩显示。串行级联接口,能通过一根信号线完成数据的接收与解码。像素点采用自动整形转发技术,使得该像素点的级联个数不受信号传送的限制,仅仅受限信号传输速度要求。 数据发送速度可达800Kbps。

    本次实验使用到的WS2812B模块如上图所示,一共是8盏灯珠级联。首先我们简单来介绍驱动WS2812B的时序波形图:

    从图中可以看出,数字“1”使用长脉宽来编码(占空比为64%),“0”使用短脉宽来编码(占空比为32%)。数据线低电平保持时间大于50us时,为复位信号。复位后,每个LED读取“DIN”线上开始的24bit(绿:红:蓝为8:8:8)数据到驱动芯片内部缓存。除了开始的24bit数据,后面的数据都通过“DOUT”脚传递到下一个LED,即每经过一个像素点的传输,信号减少24bit。内部缓存数据在下一个复位脉冲后被写入PWM控制器。一个bit为1.25us,一个LED有3*8bits=24bits,传输完  需要24*1.25us=30us。

    本例程将使用PWM+DMA驱动WS2812B。

 

使用STM32CubeMX生成工程模板

   

    本例程我们需要用到TIM和DMA,所以我们在CuBeMX中添加配置一下。

生成MDK工程

 

移植WS2812B程序

    移植WS2812B和Adafruit_NeoPixel库,在BSP文件夹中,将文件添加到工程中。

    在ws2812.c文件中值得关注的关键函数是WS2812_show()

 1void WS2812_show(void)2{3    int8_t i, j;45    for(i = 0; i < PIXEL_MAX; i++)6    {7        for(j = 0; j < 8; j++)8        {9            frame.data[24 * i + j]     = (rBuffer[i] & (0x80 >> j)) ? BIT_1 : BIT_0;
10            frame.data[24 * i + j + 8]   = (gBuffer[i] & (0x80 >> j)) ? BIT_1 : BIT_0;
11            frame.data[24 * i + j + 16]  = (bBuffer[i] & (0x80 >> j)) ? BIT_1 : BIT_0;
12        }
13    }
14    HAL_TIM_PWM_Start_DMA(&htim4, TIM_CHANNEL_3, (uint32_t *)&frame, 3 + 24 * PIXEL_MAX + 1);
15}

    在main.c中包含ws2812b.h头文件,调用WS2812应用函数

1/* USER CODE BEGIN Includes */
2#include "usart.h"
3#include "sys.h"
4#include "delay.h"
5#include "SSD1306_IIC.h"
6#include "ws2812b.h"
7#include "mpu6050.h"
8/* USER CODE END Includes */

 

 1 /* USER CODE BEGIN WHILE */2  __HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_3, 30);3  HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_3);4    WS2812B_Init();5  delay_ms(1000);6  while (1)7  {8    /* USER CODE END WHILE */9
10    /* USER CODE BEGIN 3 */
11        for(int j = 1; j<12; j++){
12            for(int i = 0; i<800; i++){
13                WS2812_Process(j);
14            }
15    }
16  }
17  /* USER CODE END 3 */

 

显示效果

 

 

参考链接:http://club.gizwits.com/thread-3407-1-1.html

https://blog.csdn.net/ben392797097/article/details/78075699

END

 

公众号ID:Tkwer望远镜

提供TOLIN核心板软件工程,公众号内回复即可获取:TOLIN_Template2

这篇关于【TOLIN】第四章|驱动WS2812B彩灯的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/898662

相关文章

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

【CSS in Depth 2 精译_023】第四章概述 + 4.1 Flexbox 布局的基本原理

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第一章 层叠、优先级与继承(已完结) 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位(已完结) 2.1 相对单位的威力2.2 em 与 rem2.3 告别像素思维2.4 视口的相对单位2.5 无单位的数值与行高2.6 自定义属性2.7 本章小结 第三章 文档流与盒模型(已

驱动(RK3588S)第七课时:单节点设备树

目录 需求一、设备树的概念1、设备树的后缀名:2、设备树的语法格式3、设备树的属性(重要)4、设备树格式举例 二、设备树所用函数1、如何在内核层种获取设备树节点:2、从设备树上获取 gpio 口的属性3、获取节点上的属性只针对于字符串属性的4、函数读取 np 结点中的 propname 属性的值,并将读取到的 u32 类型的值保存在 out_value 指向的内存中,函数的返回值表示读取到的

驱动安装注册表指令

HKCR: HKEY_CLASSES_ROOT HKCU: HKEY_CURRENT_USER HKLM: HKEY_LOCAL_MACHINE HKU: HEKY_USER HER: 相对根键

UMDF驱动安装

VS2013 + WDF8.1,UMDF驱动选择User Mode Driver,不要选User Mode Driver 2.0,否则Win7安装有问题,如图 另外,在驱动安装时不要忘记WUDFUpdate_<主版本号><次版本号>.dll文件,具体文件名在INF中查找。此文件可在WDF的安装目录中找到。注意:在WDF的安装目录中会有3个WUDFUpdate_xxx.dll文件,x86,x6

电脑驱动分类

电脑驱动程序(驱动程序)是操作系统与硬件设备之间的桥梁,用于使操作系统能够识别并与硬件设备进行通信。以下是常见的驱动分类: 1. 设备驱动程序 显示驱动程序:控制显卡和显示器的显示功能,负责图形渲染和屏幕显示。 示例:NVIDIA、AMD 显示驱动程序。打印机驱动程序:允许操作系统与打印机通信,控制打印任务。 示例:HP、Canon 打印机驱动程序。声卡驱动程序:管理音频输入和输出,与声卡硬件

麒麟系统安装GPU驱动

1.nvidia 1.1显卡驱动 本机显卡型号:nvidia rtx 3090 1.1.1下载驱动 打开 https://www.nvidia.cn/geforce/drivers/ 也可以直接使用下面这个地址下载 https://www.nvidia.com/download/driverResults.aspx/205464/en-us/ 1.1.3安装驱动 右击,

windows10 卸载网络驱动以及重新安装

右键桌面此电脑的图标,点击管理,设备管理器—网络适配器,找到下图中的驱动(不同的系统或者显卡会导致网卡驱动名称与下图不一样,多为Realtek开头),右键选择卸载设备,然后重启电脑,系统会自动重新安装驱动 新电脑首次安装驱动: 根据主板厂家,比如华硕,进入华硕官网,点击服务支持,点击下载中心,选择型号,点击右侧驱动程序和工具软件,选择windows版本,下载相应的驱动,下载完之后在对应文件中找

笔记整理—内核!启动!—kernel部分(1)驱动与内核的关系

首先,恭喜完成了uboot部分的内容整理,其次补充一点,uboot第一部分和第二部分的工作不是一定的,在不同的版本中,可能这个初始化早一点,那个的又放在了第二部分,版本不同,造成的工作顺序不同,但终归是要完成基本内容初始化并传参给kernel的。         那么至于驱动与内核的关系,用一张图来说明最适合不过:         驱动位于OS层的中下层与硬件相接。驱动是内

第四章 类和对象(2)

4.2 类         类是封装对象的属性和行为的载体,Java中定义类使用class关键字,其语法如下: class 类名称{// 成员变量// 成员方法()}         在Java语言中对象的属性以成员变量的形式存在,对象的方法以成员方法的形式存在。本节将对类与对象进行详细讲解。          4.2.1 成员变量         在Java中对象的属性也称为成员变量,