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

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

                                                 【TOLIN】第四章|驱动WS2812B彩灯_第1张图片

作者:Tkwer

公众号:Tkwer望远镜

 

WS2812B彩灯介绍

【TOLIN】第四章|驱动WS2812B彩灯_第2张图片

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

【TOLIN】第四章|驱动WS2812B彩灯_第3张图片

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

【TOLIN】第四章|驱动WS2812B彩灯_第4张图片

【TOLIN】第四章|驱动WS2812B彩灯_第5张图片

    从图中可以看出,数字“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生成工程模板

   

【TOLIN】第四章|驱动WS2812B彩灯_第6张图片

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

【TOLIN】第四章|驱动WS2812B彩灯_第7张图片

【TOLIN】第四章|驱动WS2812B彩灯_第8张图片

生成MDK工程

【TOLIN】第四章|驱动WS2812B彩灯_第9张图片

 

移植WS2812B程序

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

【TOLIN】第四章|驱动WS2812B彩灯_第10张图片

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

 1void WS2812_show(void)
 2{
 3    int8_t i, j;
 4
 5    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)