社区导航

 
查看: 5287|回复: 18

[原创] WS2812灯珠的STM32驱动方式(一)——了解对手

[复制链接]

1178

TA的帖子

2

TA的资源

版主

Rank: 6Rank: 6

发表于 2018-5-6 21:27:03 | 显示全部楼层 |阅读模式
本帖最后由 通宵敲代码 于 2018-5-6 22:19 编辑


在这之前用5050的灯珠都是三色自己控制的,
还从未用过这种内部集成驱动芯片的灯珠,尽管知道。
这次手上来了case,恰巧方案中提出了这种灯珠,
就决定尝试一下。

深入了解自己的对手,才能有把握打胜仗,
先让我们看一下WS2812灯珠的相关资料吧。
TIM截图20180506212616.png

以上照片来自某厂家官网的截图,可以看到同系列的LED型号还是不少的。尽管都是常见的5050封装,却由四脚与六脚之分,设计的时候一定要注意,
我们这次使用的是WS2812B,下面是有关这可灯珠的介绍。

TIM截图20180506212255.png

这张图是对这狂灯珠的一些基本介绍,例如电源可以串联共用,
每个灯珠都自带信号整形电路,上电掉电复位电路,
每颗灯珠都可以实现RGB256级控制,扫描频率400KHz,
任意两点间通信距离不低于3米,至少可以级联1024颗,
看起来这款灯珠就是专为LED灯带设计的。

TIM截图20180506213035.png

上面是关于这款灯带的一下电气参数,
供电电压可以使最常用的5V电源,限号传输延迟很小,
不错参数里有一点没提及,这款芯片内置了恒流驱动电路,
不但能保证灯珠颜色的良好一致,而且连限流电阻都可以省了。

TIM截图20180506214113.png
这是关于W2812B单总线驱动的内容,
控制器可以连续发送24位GRB控制信号,
第一个灯珠截取前24位后,会显示到自己的LED上,
并会将其余的数据进行整形后发送给第二颗灯珠,
第二颗灯珠会截取第二组24位数据进行显示,
并继续转发剩下的,知道最后一组数据被显示为止。

TIM截图20180506214123.png
这是对魅族24位GRB数据中信号0与信号1的介绍,
可以看到信号的周期为1.25us,
与前面的800kbps的通信频率正好对应。
信号0与1通过不同的占空比拉进行区分。

然而此处也报漏了一个问题,
我们都知道,常用的STM32F1系列单片机,内核速率只有72MHz,
对于主打高性能的STMF4系列也不过200MHz左右,
也就是说,STM32F1的一个指令周期需要大约14ns,
而正常情况下用HAL库控制单片机I/O翻转,
至少需要30个指令周期,将近500ns才能实现一次高低电平变化,
这就不用说还要形成严格的驱动信号,来控制LED显示颜色了,

其实不光HAL库不行,用最新的LL库也一样,最大也不超过5MHz,
即使是直接用寄存器驱动I/O,也不过只能达到12MHz的翻转速度,
就是F4系列直接用寄存器驱动,虽然可以超频到240MHz,
让I/O翻转速率达到80MHz,然而并没有什么卵用,
先不说稳定性咋样,就但是30多块钱一片的F4就吃消不起。

所以这里希望的大家如果用到WS2812系列的LED灯珠的话,
希望大家能记住这条结论,免得在原理问题上浪费时间,
STM32以及所有比他性能还低的单片机,用I/O翻转的方式,
是很难驱动WS2812系列灯珠的,除非你是土豪直接上400M的F7,
或者你的片子啥事都不干就驱动一串LED。

那难道STM32就没法驱动WS2812这种灯珠了吗,答案当然是能了。
具体怎们驱动我留到下节再说,这里就不啰嗦了。

下面是WS2812的串联驱动电路,
到了WS2813系列,连那颗电容都可以省掉不焊,
是不是很简单呢
TIM截图20180506214132.png





回复

使用道具 举报

1178

TA的帖子

2

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2018-5-6 22:20:49 | 显示全部楼层
本帖最后由 通宵敲代码 于 2018-5-6 22:23 编辑


WS2812B规格书.pdf (433.51 KB, 下载次数: 40)


回复

使用道具 举报

369

TA的帖子

0

TA的资源

纯净的硅(初级)

Rank: 4

发表于 2018-5-7 07:52:21 | 显示全部楼层
謝謝分享。


回复

使用道具 举报

15

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2018-5-9 11:24:58 | 显示全部楼层


回复

使用道具 举报

157

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2018-8-20 17:31:38 | 显示全部楼层
72m怎么不行啊,不是太懂

点评

什么72m??  详情 回复 发表于 2018-8-20 17:37


回复

使用道具 举报

1178

TA的帖子

2

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2018-8-20 17:37:25 | 显示全部楼层
huihuihaha 发表于 2018-8-20 17:31
72m怎么不行啊,不是太懂

什么72m??


回复

使用道具 举报

157

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2018-8-20 17:43:04 | 显示全部楼层
103的主频72M啊,驱动这个速率不行吗,看的不是太懂


回复

使用道具 举报

18

TA的帖子

1

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2018-8-20 21:20:13 | 显示全部楼层

就是72Mhz的主频嘛

点评

对啊,F103不都是72M主频吗。 没事干嘛降频使用呢。  详情 回复 发表于 2018-8-21 08:57


回复

使用道具 举报

18

TA的帖子

1

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2018-8-20 21:25:48 | 显示全部楼层
楼主是不是理解错了啊,51单片机大把够用啊。1位==1.25us,一帧才:24*1.25us==30us.   20ms==20000us,约等于666帧,即600多的LED灯啦。

点评

1位是1.25us,但一位数据要通过占空比来表示0或1, 也就是说这1.25us的时间还要细分数份。 再者现在的1T增强型51单片机时钟频率确实够用, PWM控制也完全没问题,但没有DMA通道, 数据通信会占用太多的系统时  详情 回复 发表于 2018-8-21 08:56


回复

使用道具 举报

1178

TA的帖子

2

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2018-8-21 08:56:05 | 显示全部楼层
天地摩登恒 发表于 2018-8-20 21:25
楼主是不是理解错了啊,51单片机大把够用啊。1位==1.25us,一帧才:24*1.25us==30us.   20ms==20000us,约等 ...

1位是1.25us,但一位数据要通过占空比来表示0或1,
也就是说这1.25us的时间还要细分数份。

再者现在的1T增强型51单片机时钟频率确实够用,
PWM控制也完全没问题,但没有DMA通道,
数据通信会占用太多的系统时间,不划算。

这颗灯有用Arduino实现控制的方案,
具体效果未做测试,不做评价,但方案可用


回复

使用道具 举报

1178

TA的帖子

2

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2018-8-21 08:57:05 | 显示全部楼层

对啊,F103不都是72M主频吗。
没事干嘛降频使用呢。


回复

使用道具 举报

157

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2018-8-22 16:51:25 | 显示全部楼层
我们都知道,常用的STM32F1系列单片机,内核速率只有72MHz,
对于主打高性能的STMF4系列也不过200MHz左右,
也就是说,STM32F1的一个指令周期需要大约14ns,
而正常情况下用HAL库控制单片机I/O翻转,
至少需要30个指令周期,将近500ns才能实现一次高低电平变化,
这就不用说还要形成严格的驱动信号,来控制LED显示颜色了,

我的疑问就在这,这也是个问题,103驱动这个绰绰有余,但是楼主说的主频好像不够,甚至F4的主频还不够,

点评

注意理解,我说的是用I/O翻转方式驱动频率不够, 整篇文章(见二、三系列)都是用STM32F1实现的驱动, 怎么会是STM32的主频频率不够呢。  详情 回复 发表于 2018-8-22 16:56


回复

使用道具 举报

1178

TA的帖子

2

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2018-8-22 16:56:26 | 显示全部楼层
huihuihaha 发表于 2018-8-22 16:51
我们都知道,常用的STM32F1系列单片机,内核速率只有72MHz,
对于主打高性能的STMF4系列也不过200MHz左右 ...

注意理解,我说的是用I/O翻转方式驱动频率不够,
整篇文章(见二、三系列)都是用STM32F1实现的驱动,
怎么会是STM32的主频频率不够呢。

点评

使用IO翻转方式  详情 回复 发表于 2018-9-7 16:44


回复

使用道具 举报

1593

TA的帖子

4

TA的资源

纯净的硅(高级)

Rank: 6Rank: 6

荣誉会员勋章

发表于 2018-8-24 13:10:19 | 显示全部楼层
很不错的文章,我有段时间玩了很久,用STM8怎么也模拟不出这个时序,速度跟不上。

点评

芯片速度是硬伤啊  详情 回复 发表于 2018-8-27 11:26


回复

使用道具 举报

1178

TA的帖子

2

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2018-8-27 11:26:40 | 显示全部楼层
眼大5子 发表于 2018-8-24 13:10
很不错的文章,我有段时间玩了很久,用STM8怎么也模拟不出这个时序,速度跟不上。

芯片速度是硬伤啊


回复

使用道具 举报

157

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2018-9-7 16:44:52 | 显示全部楼层
通宵敲代码 发表于 2018-8-22 16:56
注意理解,我说的是用I/O翻转方式驱动频率不够,
整篇文章(见二、三系列)都是用STM32F1实现的驱动,
怎 ...

使用IO翻转方式


回复

使用道具 举报

3

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2018-9-12 18:23:29 | 显示全部楼层
这里应该有两个坑,一个,时比特速率高,另一个,就是内存容量的问题,如果你只是跑马灯那样按照固定样式跑,就没关系,如果要根据图案来的话,就有存储问题了。存储容量限制了最大灯串数。
比特速率高,有两个方案可以解决,PWM+DMA  或 SPI+DMA都行。

点评

嗯,数据量大,需要外挂存储才行, F103那点容量,存不了几个数组。  详情 回复 发表于 2018-9-14 09:18


回复

使用道具 举报

318

TA的帖子

4

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2018-9-13 22:50:20 | 显示全部楼层
之前一直都不知道,还可以利用定时器控制DMA的单个数据传输,看了版主的代码,瞬间茅塞顿开醍醐灌顶啊


回复

使用道具 举报

1178

TA的帖子

2

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2018-9-14 09:18:32 | 显示全部楼层
spritez 发表于 2018-9-12 18:23
这里应该有两个坑,一个,时比特速率高,另一个,就是内存容量的问题,如果你只是跑马灯那样按照固定样式跑 ...

嗯,数据量大,需要外挂存储才行,
F103那点容量,存不了几个数组。


回复

使用道具 举报

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

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

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

GMT+8, 2018-10-23 03:43 , Processed in 0.504149 second(s), 17 queries , Gzip On, MemCache On.

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