收藏官网首页
查看: 324072|回复: 586

首发,分享一个STM32使用HAL库驱动WS2812B RGB5050方案

 

5

主题

29

帖子

98

积分

社区运营

Rank: 8Rank: 8

积分
98
QQ
跳转到指定楼层
楼主
发表于 2016-8-31 16:18:01 | 显示全部楼层 |只看大图 回帖奖励 |倒序浏览 |阅读模式
汉枫LPB120模块
本帖最后由 bigfanofloT 于 2016-11-28 15:25 编辑

一:WS2812B简介



  新一代的RGB5050将控制电路与RGB芯片集成在一个5050封装的元器件中,构成一个完整的外控像素点。
● 内置信号整形电路,任何一个像素点收到信号后经过波形整形再输出,保证线路波形畸变不会累加。
● 内置上电复位和掉电复位电路。
● 每个像素点的三基色颜色可实现256级亮度显示,完成16777216种颜色的全真色彩显示,扫描频率不低于400Hz/s。
● 串行级联接口,能通过一根信号线完成数据的接收与解码。
● 任意两点传传输距离在不超过5米时无需增加任何电路。
● 当刷新速率30帧/秒时,低速模式级联数不小于512点,高速模式不小于1024点。
● 数据发送速度可达800Kbps。
● 光的颜色高度一致,性价比高。

应用:
● LED全彩发光字灯串,LED全彩模组, LED全彩软灯条硬灯条,LED护栏管。
● LED点光源,LED像素屏,LED异形屏,各种电子产品,电器设备跑马灯。

以下是时序图,




WS2812Bdatasheet: WS2812B规格书.zip (103.33 KB, 下载次数: 323)
从图中可以看出,数字“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。
bit周期需要稍微大于1.25us为佳!
二.使用cubemx配置方法
首先根据选择的芯片(我这里是STM32L011D4P6),配置好外设时钟(我这里是32MHz),确定定时器参数(我这里是1分频,脉冲计数频率为32MHz,理论上计数到1.25us,需要的重载寄存器数值为1.25/1/32=40,这里写41(这里应根据实际调整),则bit周期为1/32us*42=1.3125us,因从0计数,故乘以41+1=42)。
1.外设分配


2.时钟配置



3.定时器PWM输出配置
定时器2配置为:
向上计数模式,重载值为41(实际周期为1/T2CLK*(41+1)),不分频,pulse值决定脉宽,比如我现在ARR值为41,则脉宽=Pulse值/(41+1)


三、STM32L011XX驱动WS2812B参考设计
详情参考PCB工程:http://pan.baidu.com/s/1qXBkzyk,使用Altium Designer14及以上版本打开;
工程采用CubeMX生成,使用的是ST最新的HAL库,需要使用keil5及以上版本打开,CubeMX版本需要16.0及以上,下载地址http://www.st.com/content/st_com ... -long-promo_feb2014程序移植了Adafruit NeoPixel库函数,可实现多种绚丽效果,例如流水灯、呼吸灯、彩虹等。



两点说明:WS2812B为5V供电,5V逻辑器件,因此需要电平转换IC;RGB5050 最大60mA电流,单色时为20mA.因此应根据灯珠的多少设计合适的电源,本设计采用TI开关电源芯片TPS563200,最大3A电流输出能力。
1.电路图

2.PCB

3.实物



4.测试效果






5.视频:http://player.youku.com/player.php/sid/XMTc0ODA0NDYwMA==/v.swf

9颗LED的:http://v.youku.com/v_show/id_XMTcwNzM2MDQ1Mg==.html?beta&

36颗LED的:http://v.youku.com/v_show/id_XMTcwNzM2MzI4OA==.html?beta&

附程序源码:
游客,如果您要查看本帖隐藏内容请回复

四.参考资源(英文的)
https://learn.adafruit.com/adafruit-neopixel-uberguide/arduino-library-installation
http://www.lxway.com/442451961.htm
http://www.pjrc.com/teensy/td_libs_OctoWS2811.html
https://github.com/PaulStoffregen/OctoWS2811/blob/master/OctoWS2811.h
https://github.com/g4lvanix/0xWS2812
https://cpldcpu.wordpress.com/2014/01/19/light_ws2812-library-v2-0/
https://github.com/cpldcpu/light_ws2812/
https://cpldcpu.wordpress.com/2014/01/14/light_ws2812-library-v2-0-part-i-understanding-the-ws2812/
https://www.embeddedrelated.com/showarticle/528.php

PS:由于时间有限,未做深入研究,有兴趣的可以加上DMA,或者采用SPI+DMA的方式。
补充:有的网友遇到STM32L011系列,首次无法烧录程序的问题,这里给出ST的官方解决方案: STM32L011x和STM32L021x启动模式注意事项.pdf (708.08 KB, 下载次数: 118)














5

主题

29

帖子

98

积分

社区运营

Rank: 8Rank: 8

积分
98
QQ
沙发
 楼主| 发表于 2016-9-1 07:03:21 来自手机 | 显示全部楼层
林光光1号 发表于 2016-9-1 00:55
可以每个灯都显示不同颜色吗

可以,每个灯有红绿蓝0-255级颜色混合,可以调出255*255*255种颜色。

5

主题

29

帖子

98

积分

社区运营

Rank: 8Rank: 8

积分
98
QQ
板凳
 楼主| 发表于 2016-9-1 14:25:58 | 显示全部楼层
林光光1号 发表于 2016-9-1 13:20
但是每个灯都不一样那就要很多数据线控制了

串行连接,建议你先了解下WS2812B型LED原理,只需一根信号线
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

加入Q群 返回顶部

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

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