收藏官网首页
查看: 213205|回复: 301

Gokit STM32驱动WS2812B型RGB LED

 

321

主题

1054

帖子

4513

积分

论坛元老

Rank: 8Rank: 8

积分
4513
QQ
跳转到指定楼层
楼主
发表于 2017-3-31 12:27:37 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
免费使用STM32、APP自动代码生成工具
先来造轮子吧,使用gokit上的STM32F103C8T6驱动ws2812b型rgb led;

一、ws2812b rgb led介绍:
主要特点
● IC控制电路与LED点光源公用一个电源。 ● 控制电路与RGB芯片集成在一个5050封装的元器件中,构成一个完整的外控像素点。 ● 内置信号整形电路,任何一个像素点收到信号后经过波形整形再输出,保证线路波形畸变不会累加。 ● 内置上电复位和掉电复位电路。 ● 每个像素点的三基色颜色可实现256级亮度显示,完成16777216种颜色的全真色彩显示,扫描频率不低于 400Hz/s。 ● 串行级联接口,能通过一根信号线完成数据的接收与解码。 ● 任意两点传传输距离在不超过3米时无需增加任何电路。 ● 当刷新速率30帧/秒时,级联数不小于1024点。 ● 数据发送速度可达800Kbps。 ● 光的颜色高度一致,性价比高。
主要应用领域
● LED全彩发光字灯串,LED全彩软灯条硬灯条,LED护栏管。 ● LED点光源,LED像素屏,LED异形屏,各种电子产品,电器设备跑马灯。
产品概述
WS2812B是一个集控制电路与发光电路于一体的智能外控LED光源。其外型与一个5050LED灯珠相同,每 个元件即为一个像素点。像素点内部包含了智能数字接口数据锁存信号整形放大驱动电路,还包含有高精度的内 部振荡器和12V高压可编程定电流控制部分,有效保证了像素点光的颜色高度一致。 数据协议采用单线归零码的通讯方式,像素点在上电复位以后,DIN端接受从控制器传输过来的数据,首先 送过来的24bit数据被第一个像素点提取后,送到像素点内部的数据锁存器,剩余的数据经过内部整形处理电路 整形放大后通过DO端口开始转发输出给下一个级联的像素点,每经过一个像素点的传输,信号减少24bit。像素 点采用自动整形转发技术,使得该像素点的级联个数不受信号传送的限制,仅仅受限信号传输速度要求。 LED具有低电压驱动,环保节能,亮度高,散射角度大,一致性好,超低功率,超长寿命等优点。将控制电 路集成于LED上面,电路变得更加简单,体积小,安装更加简便。
二、造轮子
根据下图WS2812的时序,采用SPI+DMA的方式驱动,用一个字节的SPI数据来表示WS2812的一位数据,一个灯珠需要24位数据,多个灯珠可级联,数据依次转发。



SPI采用8位数据(1个字节),高位在前模式,频率为f Mbit/s,即f bit/us。则1个字节t=8/fus,T0H=n/8*t=n/f,其中n为SPI发送数据连续的“1”个数;WS2812B的一个数据“位”为0.95~1.55us,对于0码,高电平时间应为0.25us~0.55us,n/f应满足0.25<n/f<0.55;


时钟配置如下,需保证SPI的速度满足上面的计算要求:

开启DMA:

底层驱动写好了,就可以移植下应用了,我这里简单的移植了部分Adafruit_NeoPixel的函数库;

  1. void WS2812B_Init(void)//should >50us
  2. {
  3.   uint8_t ResCode[50]={0};
  4.   HAL_SPI_Transmit_DMA(&hspi1, ResCode, 50);
  5. }
  6. void PixelUpdate(void)//should >24us
  7. {
  8.   uint8_t rst[25]={0};
  9.   HAL_SPI_Transmit_DMA(&hspi1, rst, 25);
  10. }
  11. void Send_8bits(uint8_t dat)
  12. {
  13.   uint8_t i=0;
  14.   uint8_t CodeOne=0x7c;//3e
  15.   uint8_t CodeZero=0x70;//38

  16.   for (i=0;i<8;i++)
  17.   {
  18.     if(dat&0x80==0x80)
  19.     {
  20.       HAL_SPI_Transmit_DMA(&hspi1, &CodeOne, 1);
  21.     }
  22.     else
  23.     {
  24.       HAL_SPI_Transmit_DMA(&hspi1, &CodeZero, 1);
  25.     }
  26.     dat=dat<<1;
  27.   }
  28. }
  29. //G--R--B
  30. //MSB first        
  31. void Send_2811_24bits(uint8_t RData,uint8_t GData,uint8_t BData)
  32. {   
  33.   Send_8bits(GData);  
  34.   Send_8bits(RData);
  35.   Send_8bits(BData);
  36. }

  37. uint8_t rBuffer[PIXEL_MAX]={0};
  38. uint8_t gBuffer[PIXEL_MAX]={0};
  39. uint8_t bBuffer[PIXEL_MAX]={0};

  40. void SetPixelColor(uint16_t n, uint32_t c)
  41. {         
  42.   uint8_t i=0;

  43.   rBuffer[n]=(uint8_t)(c>>16);
  44.   gBuffer[n]=(uint8_t)(c>>8);
  45.   bBuffer[n]=(uint8_t)c;

  46.   for(i=0;i<;PIXEL_MAX;i++)
  47.   {                                                         
  48.     Send_2811_24bits(rBuffer,gBuffer,bBuffer);
  49.   }
  50.    PixelUpdate();
  51. }
复制代码

提供以下几个函数供调用:

只需把下图2个文件添加到自己的工程即可:

WS2812B LED模块一般由3个引脚,VCC要接5V,且要根据灯的个数选好电源,每个灯珠最大60mA,IN脚连接Gokit STM32底板的D11脚即MOSI(同样可以使用其他型号的STM32):

最后可以看到如下效果:
工程文件下载(包含STM32CubeMX生成的PDF版报告):
游客,如果您要查看本帖隐藏内容请回复


1、机智云QQ群:G1群:104975951 G2群:491509598 G3群:287087942
机智云爱好者-APP开发群: 599735135
QQ群目前非常活跃,欢迎大家参与进来,交流,讨论,答疑,解惑~~
2、机智云微信公众号: 机智云 gizwits、 机智云智能宠物屋go-iot
关注机智云Gizwits官方公众号随时掌握最新资讯和活动信息

0

主题

5

帖子

36

积分

新手上路

Rank: 1

积分
36
推荐
发表于 2017-5-12 15:27:37 | 只看该作者
bigfanofloT 发表于 2017-5-10 15:58
提供的函数库rgb值就是的

谢谢解答,我调试了一下您的代码,在发送RGB值的时候,发现如果值为奇数,如:
setPixelColor(1, 101, 101, 101);是可以正确设置的,如果发送的是偶数值,如setPixelColor(1, 100, 101, 101);
则无法生效(R数据100没有生效)

点评

修改Send_8bits函数 将if(dat&0x80 == 0x80)修改位if(dat&0x80)  详情 回复 发表于 2017-12-1 18:33
你找找原因,颜色值101和100无区别  详情 回复 发表于 2017-5-12 17:58

0

主题

1

帖子

9

积分

新手上路

Rank: 1

积分
9
推荐
发表于 2017-9-15 15:29:45 | 只看该作者
最近也在调这个,160个,四排,给车前做的呼吸流水灯,一直是GPIO翻转的思路,结果STM32指令周期不确定,老是出现局部乱闪,看了这篇文章,豁然开朗,用硬件SPI做时序,应该稳定很多。另外看了PWM + DMA的方式,也可以实现,但资源占用应该比SPI + DMA多。

点评

楼主可以分享下你的作品吗?  详情 回复 发表于 2017-9-20 19:07

0

主题

4

帖子

343

积分

中级会员

Rank: 3Rank: 3

积分
343
QQ
推荐
发表于 2017-12-1 18:33:51 | 只看该作者
alexacc 发表于 2017-5-12 15:27
谢谢解答,我调试了一下您的代码,在发送RGB值的时候,发现如果值为奇数,如:
setPixelColor(1, 101, 10 ...

修改Send_8bits函数
将if(dat&0x80 == 0x80)修改位if(dat&0x80)

10

主题

112

帖子

1545

积分

金牌会员

Rank: 6Rank: 6

积分
1545
6#
发表于 2017-4-5 23:29:38 | 只看该作者
辛苦辛苦,跟随您的脚步

0

主题

8

帖子

176

积分

注册会员

Rank: 2

积分
176
7#
发表于 2017-4-6 13:53:01 | 只看该作者
Thanks for your share.It's convenient for study stm32.

2

主题

12

帖子

92

积分

注册会员

Rank: 2

积分
92
9#
发表于 2017-4-6 22:38:05 | 只看该作者
谢谢你拉,辛苦了。

0

主题

9

帖子

176

积分

注册会员

Rank: 2

积分
176
10#
发表于 2017-4-10 23:54:06 | 只看该作者
免费使用STM32、APP自动代码生成工具
谢谢,辛苦了

0

主题

10

帖子

368

积分

中级会员

Rank: 3Rank: 3

积分
368
12#
发表于 2017-4-17 16:42:32 | 只看该作者
而我却二无群切

0

主题

10

帖子

409

积分

中级会员

Rank: 3Rank: 3

积分
409
14#
发表于 2017-4-20 17:41:56 | 只看该作者
撒哈哈工行卡号轧空韩国进口干

0

主题

1

帖子

9

积分

新手上路

Rank: 1

积分
9
15#
发表于 2017-5-4 09:51:30 | 只看该作者
汉枫LPB120模块
66666666666

0

主题

5

帖子

36

积分

新手上路

Rank: 1

积分
36
17#
发表于 2017-5-9 18:12:01 | 只看该作者
真需要这个,谢谢!

0

主题

5

帖子

36

积分

新手上路

Rank: 1

积分
36
18#
发表于 2017-5-10 15:35:40 | 只看该作者
请教一下楼主,亮度的等级0~~255怎么控制呢?

点评

提供的函数库rgb值就是的  详情 回复 发表于 2017-5-10 15:58

321

主题

1054

帖子

4513

积分

论坛元老

Rank: 8Rank: 8

积分
4513
QQ
19#
 楼主| 发表于 2017-5-10 15:58:40 | 只看该作者
alexacc 发表于 2017-5-10 15:35
请教一下楼主,亮度的等级0~~255怎么控制呢?

提供的函数库rgb值就是的
1、机智云QQ群:G1群:104975951 G2群:491509598 G3群:287087942
机智云爱好者-APP开发群: 599735135
QQ群目前非常活跃,欢迎大家参与进来,交流,讨论,答疑,解惑~~
2、机智云微信公众号: 机智云 gizwits、 机智云智能宠物屋go-iot
关注机智云Gizwits官方公众号随时掌握最新资讯和活动信息

321

主题

1054

帖子

4513

积分

论坛元老

Rank: 8Rank: 8

积分
4513
QQ
20#
 楼主| 发表于 2017-5-12 17:58:08 | 只看该作者
校园创客福利
alexacc 发表于 2017-5-12 15:27
谢谢解答,我调试了一下您的代码,在发送RGB值的时候,发现如果值为奇数,如:
setPixelColor(1, 101, 10 ...

你找找原因,颜色值101和100无区别
1、机智云QQ群:G1群:104975951 G2群:491509598 G3群:287087942
机智云爱好者-APP开发群: 599735135
QQ群目前非常活跃,欢迎大家参与进来,交流,讨论,答疑,解惑~~
2、机智云微信公众号: 机智云 gizwits、 机智云智能宠物屋go-iot
关注机智云Gizwits官方公众号随时掌握最新资讯和活动信息

0

主题

1

帖子

13

积分

新手上路

Rank: 1

积分
13
21#
发表于 2017-5-15 17:51:52 | 只看该作者
感謝分享@@@

3

主题

14

帖子

276

积分

中级会员

Rank: 3Rank: 3

积分
276
22#
发表于 2017-5-19 16:22:21 来自手机 | 只看该作者
感谢楼主分享!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

加入Q群 返回顶部

版权与免责声明 © 2006-2024 Gizwits IoT Technology Co., Ltd. ( 粤ICP备11090211号 )

快速回复 返回顶部 返回列表