本文主要是介绍STM32 cubemx驱动ws2812b灯条,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
参考链接
ws2812 程序设计与应用(1)DMA 控制 PWM 占空比原理及实现(STM32)
ws2812b原理
- WS2812 内部集成了处理芯片和3颗不同颜色的led灯(红,绿,蓝),通过单总线协议分别控制三个灯的亮度强弱,达到全彩的效果,每一个灯需要 8 bits(1 byte) 的数据,所以一颗 ws2812 共需要24 bits(3 bytes) 的数据。
- ws2812 采用 PWM方式来编码,即每个PWM的周期固定为1.25us(800k),占空比为 1/3 时为 0 码,占空比为 2/3 为 1 码。另外,ws2812 复位信号为一个 不低于50us的低电平:
- 时序
ws2812传输原理
ws2812 的特点是可以多个灯珠串联起来,这样就可以通过一个总线控制多个灯珠:
ws2812 可以将第一个24字节的时序留下,余下的往下一位传递:
可以结合波逻辑分析仪捕获的波形来理解:
上图是4个led的驱动时序,首先是一个100us的低电平复位来ws2812,接着是第一个led灯的数据,它有24个周期,分为3个部分,每一个部分是8个周期分别对应不同颜色的灯,可以看到,第一个部分都是宽占空比,所以全是1,第二个部分都是窄占空比,所以全是0,第三个部分和第一个部分同。所以第一颗led灯,是绿色和蓝色一起亮,视觉效果为青色,其它同理。
时序的数据结构是,高位到低位:
基本信息
芯片型号 | 系统时钟 | 定时器 | 高速总线 | 引脚 |
---|---|---|---|---|
STM32F427IIH | 180Mhz | TIM8_CH2 | APB2 | PI6 |
CubeMx配置
时钟
TIM8_CH2
周期计算:
ws2812b需要800kb的周期,系统时钟是180Mhz,TIM8是挂在APB2总线上的,它的时钟也是180Mhz,
因此,有:180 * 1000 / 800 = 225 (224+1),因此自动装载值设为 224 ;
cubemx的配置到此结束。
代码部分
在tim.c
里添加
void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
{HAL_TIM_PWM_Stop_DMA(&htim8,TIM_CHANNEL_2);
}
在ws2812.c里添加
参数说明:
ONE_PULSE | ZERO_PULSE | WS2812_DATA_LEN |
---|---|---|
149 | 74 | 334 |
149 =(224+1)* 2/3 | 74 = (224+1)* 2/3 | 80 + led_nums * 24 |
#include "ws2812b.h"
#include "tim.h"#define ONE_PULSE (149) //1 码
#define ZERO_PULSE (74) //0 码
#define RESET_PULSE (80) //80 ,复位信号
#define LED_NUMS
这篇关于STM32 cubemx驱动ws2812b灯条的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!