BlueNRG-1驱动WS2812B全采灯条模拟奥迪流水效果转向灯
本帖最后由 littleshrimp 于 2018-12-7 23:23 编辑觉得“宝马”车的转向效果太LOW,用8颗WS2812B灯珠实现奥迪的转向效果
WS2812B的灯条网上有很多,驱动也随处可见
这种灯条用带DMA的SPI驱动起来很方便
WS2812B一颗灯珠的数据是24位,G、R、B分别占8位
是如果能把SPI的时钟设置成2.5MHz左右,那么发送100三个位可以表示WS2812B的一个0位,110可以表示一个1位
这样一颗灯珠可以使用24*3共9个字节控制
在代码里spi的频率可以像下边这样随便填
不过实际上和STM32类似,它只允许在SPI主时钟的基础上做固定的分频,即2的整数倍
SPI的时钟是16M,如果这样设置SPI_InitStructure.SPI_BaudRate = 2500000;得到的CPSR是2,,SCR是2,
根据公式16MHz / (CPSDVR * (1+SCR))得到2.66MHz,再降一档把把SCR设置成3的SPI频率又变成2M
虽然是2.66MHz对比数据手册也能满足要求找到2个同一家的数据手册,电平时间上居然也会有差别
还好都在范围内
附上WS2812B的驱动代码
#include <stdint.h>
#define WS2812B_BIT0 0x04 /*100*/
#define WS2812B_BIT1 0x06 /*110*/
#define WS2812B_RESET 0x00 /*000*/
#define WS2812B_BIT(b,x) (((b & 1ul<<x) == 1ul<<x)?WS2812B_BIT1:WS2812B_BIT0)
typedef struct
{
uint8_t g;
uint8_t r;
uint8_t b;
}Color_t;
typedef union
{
Color_t color;
uint8_t bytes;
}Color_Bytes_t;
extern void RGBColorsToWS2812BBytes(uint8_t *buf,Color_Bytes_t *colors,uint16_t colorsLength);
#include "ws2812b.h"
//buf的长度=colorsLength*9;
void RGBColorsToWS2812BBytes(uint8_t *buf,Color_Bytes_t *colors,uint16_t colorsLength)
{
int32_t i;
uint32_t bytes;
uint16_t j,k;
uint16_t buf_index = 0;
//读取数据超过原数组长度后退出
for(i=0;i<colorsLength;i++)
{
for(j=0;j<3;j++)
{
bytes = 0;
for(k=0;k<8;k++)
{
bytes <<= 3;
bytes |= WS2812B_BIT(colors.bytes,7-k);
}
for(k=0;k<3;k++)
{
buf = bytes >> (8 * (3 - k -1));
}
}
}
}
BlueNRG-1使用SPI DMA的方式驱动WS2812B灯条的工程文件
**** Hidden Message *****
此内容由EEWORLD论坛网友littleshrimp原创,如需转载或用于商业用途需征得作者同意并注明出处
回复看看了 很多好东西啊 学习学习 看看效果 瞻仰瞻仰。 参考看看 自己DIY乐趣无限哈哈哈 <p>好东西</p>
<p>学习学习 DIY乐趣无限</p>
学习学习 <p>mark 新的驱动方式学到了 ,我用GPIO模拟的 驱动过</p>
<p>学习学习</p>
<p>学习学习</p>
<p>学习了,感谢分享</p>
<p>学习学习</p>
<p>学习学习 DIY乐趣无限</p>
<p>学习学习</p>
谢谢分享 <p>想看看 </p>
页:
[1]
2