社区导航

 

搜索
查看: 9120|回复: 20

[设计过程分享] 单片机软件设计1-使用SPI+DMA驱动WS2812B型LED

[复制链接]

587

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-4-15 19:47 | 显示全部楼层 |阅读模式
本帖最后由 dql2016 于 2017-4-15 19:57 编辑

最近太忙了,实在事不好意思,今天抽空分享一下如何使用STM32CubeMX快速配置SensorTile的SPI接口,用来驱动WS2812B型全彩LED。参考了网友zoomdy的帖子http://www.stmcu.org/module/forum/thread-610279-1-1.html,在此对zoomdy无私的分享精神表示感谢。
灯珠大图.png
产品概述.png

应用领域.png

灯珠引脚.png

引脚功能.png

时序.png

数据传输时间.png

级联.png

时序图.png

电平逻辑.png

电气参数.png

下面事它的时序图,十分特殊,相当于是用不同脉宽的PWM信号来表示它的一个位,虽然灯珠电气参数要求的电压比SenSorTile的3.3V要大一点点,但实测还是能完全驱动的,只需三根线(电源需用5V,地线,信号线)即可驱动,理论上可“无限”级联,实际上级联过多时,信号会产生畸变,且功率还是非常大的,每颗灯珠最多60mA电流,因此要选用合适的电源才行。
使用SensorTile的SPI来模拟它的时序,SPI配置为8位数据模式,假设其传输速率为b Mbit/s,即b/8 MB/s=b/8 Byte/us,传输一个字节需要8/b us,用1字节的SPI数据来表示WS2812B的一位数据。假设SPI发送的1字节数据中连续“1”的个数为n,按照时序要求,对于1码:那么n需要满足如下关系:n/8 * 8/b~(0.85us+/-150ns);对于0码:那么n需要满足如下关系:n/8 * 8/b~(0.4us+/-150ns);考虑到信号的上升沿等因素,SPI发送的1字节数据其最高位均取“0”。这里我配置SPI速率为1Mbit/s时,SPI发送的1字节数据0x70(0111 0000)表示WS2812B的0码,SPI数据0x7C(0111 1100)表示WS2812B的1码。一颗WS2812B需要24位数据(按照绿-红-蓝顺序,高位在前)。
STM32CubeMX对SPI的关键配置如下:
搜狗截图20170415193450.png

SPI速度配置.png

DMA配置.png

如下图Adafruit_NeoPixel.c文件,先编写一个发送8个位的函数,使用了DMA:
驱动1.png
然后是发送24个位的:
驱动2.png


我在底层驱动的基础上移植了Arduino平台的Adafruit_NeoPixel库函数,提供丰富的应用函数,如彩虹、呼吸等效果。
这是Adafruit_NeoPixel.h文件内容:
头文件.png
使用时只需配置好SPI后把下面2个文件添加进工程即可:
搜狗截图20170415193010.png
在main函数调用初始化后,即可愉快的玩耍了:
搜狗截图20170415193747.png

效果图见此帖:http://bbs.eeworld.com.cn/thread-525615-1-1.html

附上工程文件:
SensorTileProject.rar (6.19 MB, 下载次数: 6839, 售价: 1 枚芯币)


回复

使用道具 举报

1

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2017-6-7 14:14 | 显示全部楼层
谢谢分享!!!


回复

使用道具 举报

13

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2018-1-8 20:38 | 显示全部楼层
好想法,学习一下


回复

使用道具 举报

18

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2018-1-29 16:47 | 显示全部楼层

谢谢分享!!!正想找这个。


回复

使用道具 举报

2

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2018-6-24 14:18 | 显示全部楼层
谢谢楼主分享


回复

使用道具 举报

16

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2018-8-14 17:37 | 显示全部楼层
谢谢楼主分享


回复

使用道具 举报

1

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2018-8-15 23:05 来自手机 | 显示全部楼层
借鉴下


回复

使用道具 举报

1

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2018-9-17 21:03 | 显示全部楼层
谢谢啦, 移植看下效果


回复

使用道具 举报

33

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2018-9-18 14:51 | 显示全部楼层
谢谢分享


回复

使用道具 举报

2

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2018-10-29 10:15 | 显示全部楼层
来学习下这个


回复

使用道具 举报

1

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2018-11-20 11:09 | 显示全部楼层
学习学习,谢谢分享


回复

使用道具 举报

2

TA的帖子

2

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2018-11-20 21:28 来自手机 | 显示全部楼层
SPI传输  每传输8位中间有间歇哈?这个弄?


回复

使用道具 举报

1

TA的帖子

1

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2018-12-19 11:47 | 显示全部楼层
感谢分享


回复

使用道具 举报

3

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2019-1-9 14:55 | 显示全部楼层
哇感谢大佬!一只萌新路过


回复

使用道具 举报

3

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2019-1-10 16:55 | 显示全部楼层
昨天看了大佬的教程,今天把东西弄出来了,过来补充一些。首先一开始不太理解大佬说的0码跟1码,后来抓了波形才懂,其实1码最左边的0,作为是上一个数据的补充,0码同理。大佬这一招很妙!另外大佬spi的速率应该是不对的吧?1Mbit/s的话8位数据的时间就是8us远超一个ws2812数据码的周期。所以一开始移植的时候(一开始为了节约时间没有仔细研究大佬说的话)死活调不通,后来25us发现spi速率配错了。emmm我自己配的速率8位数据1.25us直接跟他对应起来,每一位就是的时间1.25/8,速率就是8/1.25=6.4M。为了这6.4M我还专门去调了stm32f4的总线时钟频率,结果当然是降频了,感觉有点得不偿失。总之还是为了提醒大家学习要多专研啊!也给大家提提醒,顺便谢谢大佬的指教了!

点评

楼主的这种方式有些浪费内存资源 使用SPI最节省内存的方法是用3bit来实现ws2812的一位 SPI时钟在2.5Mbps左右时可以用100=0,110=1 这样ws2812b的24位数据可以使用9个字节实现 具体可以看一下我的贴子  详情 回复 发表于 2019-1-10 19:37


回复

使用道具 举报

5706

TA的帖子

9

TA的资源

版主

Rank: 6Rank: 6

发表于 2019-1-10 19:37 | 显示全部楼层
风狼 发表于 2019-1-10 16:55
昨天看了大佬的教程,今天把东西弄出来了,过来补充一些。首先一开始不太理解大佬说的0码跟1码,后来抓了波 ...

楼主的这种方式有些浪费内存资源
使用SPI最节省内存的方法是用3bit来实现ws2812的一位
SPI时钟在2.5Mbps左右时可以用100=0,110=1
这样ws2812b的24位数据可以使用9个字节实现
具体可以看一下我的贴子
虾扯蛋


回复

使用道具 举报

3

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2019-1-11 16:26 | 显示全部楼层
littleshrimp 发表于 2019-1-10 19:37
楼主的这种方式有些浪费内存资源
使用SPI最节省内存的方法是用3bit来实现ws2812的一位
SPI时钟在2.5Mbp ...

嗯嗯确实,谢谢指教。


回复

使用道具 举报

2

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2019-1-15 15:41 | 显示全部楼层
好东西啊,经典


回复

使用道具 举报

2

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2019-1-15 15:45 | 显示全部楼层
这个历程比较巧妙的用多位SPI的数据来达到高电平长短的标识,来实现WS2812的时序要求,最有意思的是能够移植arduino的库,我用过那个库确实很炫,厉害厉害,哈哈哈哈


回复

使用道具 举报

582

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2019-1-15 17:42 | 显示全部楼层
楼主威武,强烈支持……


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2019-3-25 09:40 , Processed in 0.546906 second(s), 20 queries , Gzip On, MemCache On.

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