DengQilong 发表于 2016-8-31 16:18:01

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

本帖最后由 bigfanofloT 于 2016-11-28 15:25 编辑

一:WS2812B简介


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

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




WS2812Bdatasheet:
从图中可以看出,数字“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&

附程序源码:
**** Hidden Message *****
四.参考资源(英文的)
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的官方解决方案:














土豆十三 发表于 2016-11-22 15:48:48

您好我下载了您的程序测试,、不过灯带显示的很乱,没有调出您测试的效果。您这边有没有示波器读取的时序图呢,我这边示波器读到的要不都是0码,要不都是1码,读不到reset码。:L:Q

林光光1号 发表于 2016-9-1 13:20:33

DengQilong 发表于 2016-9-1 07:03
可以,每个灯有红绿蓝0-255级颜色混合,可以调出255*255*255种颜色。

但是每个灯都不一样那就要很多数据线控制了

bigfanofloT 发表于 2017-2-20 10:47:58

heyongbo236 发表于 2016-11-23 14:10
初次使用stm的L系列,值得好好学习学习!打算用L2的应该跟L1很相近吧!!?
...

是的,用STM32CubeMX的话,API都差不多

林光光1号 发表于 2016-9-1 00:55:19

可以每个灯都显示不同颜色吗:lol:lol

DengQilong 发表于 2016-9-1 07:03:21

林光光1号 发表于 2016-9-1 00:55
可以每个灯都显示不同颜色吗

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

Shanshanlee 发表于 2016-9-1 08:41:22

学习学习,赞一个先:lol

chaoran 发表于 2016-9-1 10:49:32

我也来看一下

DengQilong 发表于 2016-9-1 14:25:58

林光光1号 发表于 2016-9-1 13:20
但是每个灯都不一样那就要很多数据线控制了

串行连接,建议你先了解下WS2812B型LED原理,只需一根信号线

林光光1号 发表于 2016-9-1 16:45:41

DengQilong 发表于 2016-9-1 14:25
串行连接,建议你先了解下WS2812B型LED原理,只需一根信号线

哦哦好的,谢谢

小徐 发表于 2016-9-5 12:01:23

不错,,,,,.............

fantasylht 发表于 2016-10-11 17:15:47

点赞!!!

马文 发表于 2016-11-17 12:27:34

学习学习

adiar 发表于 2016-11-19 22:12:24

不错!!!!!!!!!!

土豆十三 发表于 2016-11-22 15:49:45

我的qq是3313548247 ,欢迎同样调试ws2812B的朋友交流讨论

猫小生 发表于 2016-11-23 10:19:12

我来凑凑热闹~

heyongbo236 发表于 2016-11-23 14:10:21

初次使用stm的L系列,值得好好学习学习!打算用L2的应该跟L1很相近吧!!?

殇雪寒 发表于 2016-11-28 20:44:09

楼主你做的太棒了!!!!赞赞赞

CC3200_初学者 发表于 2016-12-1 07:33:55

学习学习

sbjs 发表于 2016-12-1 10:17:27

谢谢!!!!!!!!!!

木_谷 发表于 2016-12-3 21:02:56

参考参考,谢谢
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 首发,分享一个STM32使用HAL库驱动WS2812B RGB5050方案