要想驱动WS2812灯带,必须弄明白其工作原理。这点我们从厂家提供的规格书中很容易整明白。

需要注意的是,不同的厂家,这些参数会有较大的差异,很可能导致无法点亮灯珠,所以我们需要根据不同厂家的产品,调整相应的参数。但数据传输方式是相同的,也就是说我们的代码应该是不用修改的,只是有必要的时候,需要调整相应的参数,比如0码、1码,RES时间等。
WS2812灯珠对时序要求还是比较严格的,虽然原则上可以通过直接写IO口,并用冗余代码的方式来控制时间从而达到控制WS2812灯带的目的,但这种方式几乎没有任何实用性,不同的主频需要修改代码,甚至只是简单的代码优化都需要修改代码,否则就没办法点亮灯珠。
正是因为上述原因,我们采用PWM+DMA的方式来驱动WS2812灯珠,先上代码。
ws2812.h
#ifndef _WS2812_H
#define _WS2812_H
#include "stm32f10x.h"
#ifndef _USE_TIMER_CLK
#define _USE_TIMER_CLK
#endif
#define WS2812_GPIO_PORT GPIOB
#define WS2812_GPIO_CLK RCC_APB2Periph_GPIOB
#define WS2812_GPIO_PIN GPIO_Pin_0
#define WS2812_TIM TIM3
#define WS2812_Freq 800
#define WS2812_RESET_TIME 240
#define LED_NUMS 60
#define WS2812_LED_BIT 24
#define WS2812_LED_DATA_0 30
#define WS2812_LED_DATA_1 45
#define WS2812_RST_NUM 50
#define WS2812_LED_DATA_LEN (WS2812_LED_BIT * LED_NUMS + WS2812_RST_NUM )
#define WS2812_LED_HIGH() GPIO_SetBits(WS2812_GPIO_PORT,WS2812_GPIO_PIN)
#define WS2812_LED_LOW() GPIO_ResetBits(WS2812_GPIO_PORT,WS2812_GPIO_PIN)
enum {
POWER_OFF = 0,
POWER_ON
};
enum {
GREEN_DATA_POS = 0,
RED_DATA_POS,
BLUE_DATA_POS
};
enum {
WS2812_LED_LEVEL_0 = 0,
WS2812_LED_LEVEL_1,
WS2812_LED_LEVEL_2,
WS2812_LED_LEVEL_3,
WS2812_LED_LEVEL_4,
WS2812_LED_LEVEL_5,
WS2812_LED_LEVEL_6,
WS2812_LED_LEVEL_7,
WS2812_LED_LEVEL_8,
WS2812_LED_LEVEL_9,
WS2812_LED_LEVEL_10,
WS2812_LED_LEVEL_11,
WS2812_LED_LEVEL_12,
WS2812_LED_LEVEL_13,
WS2812_LED_LEVEL_14,
WS2812_LED

最低0.47元/天 解锁文章
1292

被折叠的 条评论
为什么被折叠?



