手把手教你玩转WS2812B灯

您所在的位置:网站首页 led彩灯怎么接 手把手教你玩转WS2812B灯

手把手教你玩转WS2812B灯

2024-07-06 11:30| 来源: 网络整理| 查看: 265

手把手教你玩转WS2812B灯 效果展示WS2812B简介CubeMX配置代码实现

这是一起关于WS2812B灯带的驱动教学,带你玩转WS2812B灯带,下面我们先来看看效果吧

效果展示

WS2812B测试

WS2812B简介

在这里插入图片描述

WS2812B是一种数字可编程LED灯条,也被称为NeoPixel。它由RGB(红、绿、蓝)三种颜色的LED组成,并集成了控制电路和信号处理功能。每个WS2812B LED都有一个唯一的地址,并可以通过单个数据线进行串联连接。

WS2812B具有以下特点:

高度可编程性:每个LED可以独立地设置颜色和亮度,因此可以实现各种动态效果和彩色变化。简单的控制接口:WS2812B使用单个数据线进行通信,通过发送特定的序列来控制每个LED的颜色和亮度。低功耗:WS2812B采用高效的LED驱动技术,具有较低的功耗,适合电池供电的应用。灵活的应用:WS2812B可广泛应用于室内装饰、灯光艺术、电子产品原型设计等领域,具有丰富的创意空间和应用场景。需要注意的是,WS2812B是商业产品,如果你有任何具体的问题或需求,请提供更多细节,我将尽力为您提供帮助。

具体参数如下(了解5V供电即可):

在这里插入图片描述

引脚图:

在这里插入图片描述

当然,在使用的过程中,我们往往会使用不止一个LED灯,会将多个灯级联成灯带或者灯板,我们这次使用的就是灯板。

具体级联方式如下:

在这里插入图片描述

其中DIN作为数据的输入端,每个LED需要24位数据控制,多出的数据会通过DOUT引脚传递给下一个LED,以此类推,当WS2812接收到280us以上的低电平时,数据被写入LED,灯的颜色改变。 在这里插入图片描述

以下是数据的表示方法:

在这里插入图片描述

通常使用PWM波的方式驱动WS2812B,PWM的信号频率为800KHz,即一个数据表示的周期为1.25us

数据0由一个TOH和TOL表示数据1由一个T1H和T1L表示0码和1码的差别就是在一个周期内高电平持续时间不同,我们粗略的认为0码高电平时间为周期的1/3,1码高电平时间为周期的2/3这样的话,只需要设置PWM信号频率为800KHz,当占空比为33%时,数据为0;当占空比为66%时,数据为1.RSSET时间为280us以上的低电平,但我在其他的资料里面看到好像不需要那么久,24us即可,这个我们这里不管,当作24us即可。

在这里插入图片描述

在有多个led级联的情况下,先发送第一个led的数据,后第二个、第三个、以此类推。

CubeMX配置

其他部分的配置,我们这里不做介绍,重点展示tim1的PWM输出配置

在这里插入图片描述

使用定时器内部时钟,通道1PWM输出模式

在这里插入图片描述

设置时钟不分频,自动重装载值为125,则PWM波频率 = 100MHz / 125 = 800KHz,刚好符合WS2812B的数据写入频率。

在这里插入图片描述

开启定时器DMA请求,数据传输方向为内存到外设,内存地址递增模式。字长为32位。

代码实现 RGB.c #include "RGB.h" #include "tim.h" #include "stdlib.h" /*Some Static Colors------------------------------*/ const RGB_Color_TypeDef RED = {255,0,0}; //红色 const RGB_Color_TypeDef GREEN = {0,255,0}; //绿色 const RGB_Color_TypeDef BLUE = {0,0,255}; //深蓝色 const RGB_Color_TypeDef SKY = {0,255,255}; //天蓝色 const RGB_Color_TypeDef MAGENTA = {255,0,220}; //粉色 const RGB_Color_TypeDef YELLOW = {128,216,0}; //黄色 const RGB_Color_TypeDef OEANGE = {127,106,0}; //橘色 const RGB_Color_TypeDef BLACK = {0,0,0}; //无颜色 const RGB_Color_TypeDef WHITE = {255,255,255}; //白色 //将好看的颜色封装成数组,便于集中管理和访问 RGB_Color_TypeDef table[16] = { {254,67,101}, {76,0,10}, {249,15,173}, {128,0,32}, {158,46,36}, {184,206,142}, {227,23,13}, {178,34,34}, {255,99,71}, {99,38,18}, {255,97,0}, {21,161,201}, {56,94,15}, {50,205,50}, {160,32,240}, {218,60,90} }; //这些是好看的颜色 const RGB_Color_TypeDef color1 = {254,67,101}; //const RGB_Color_TypeDef color2 = {76,0,10}; //const RGB_Color_TypeDef color3 = {249,15,173}; //const RGB_Color_TypeDef color4 = {128,0,32}; //const RGB_Color_TypeDef color5 = {158,46,36}; //const RGB_Color_TypeDef color6 = {184,206,142}; //const RGB_Color_TypeDef color7 = {227,23,13}; //const RGB_Color_TypeDef color8 = {178,34,34}; //const RGB_Color_TypeDef color9 = {255,99,71}; //const RGB_Color_TypeDef color10 ={99,38,18}; //const RGB_Color_TypeDef color11= {255,97,0}; //const RGB_Color_TypeDef color12= {21,161,201}; //const RGB_Color_TypeDef color13= {56,94,15}; //const RGB_Color_TypeDef color14= {50,205,50}; //const RGB_Color_TypeDef color15= {160,32,240}; //const RGB_Color_TypeDef color16= {218,60,90}; /*二维数组存放最终PWM输出数组,每一行24个数据代表一个LED,最后一行24个0用于复位*/ uint32_t Pixel_Buf[Pixel_NUM+1][24]; /* 功能:最后一行装在24个0,输出24个周期占空比为0的PWM波,作为最后reset延时,这里总时长为24*1.25=37.5us > 24us(要求大于24us) //如果出现无法复位的情况,只需要在增加数组Pixel_Buf[Pixel_NUM+1][24]的行数,并改写Reset_Load即可,这里不做演示了, */ static void Reset_Load(void) { uint8_t i; for(i=0;i Pixel_NUM)return; //avoid overflow 防止写入ID大于LED总数 //这里是对 Pixel_Buf[LedId][i]写入一个周期内高电平的持续时间(或者说时PWM的占空比寄存器CCR1), for(i=0;i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3