STM32驱动WS2812B-2020 RGB彩灯(一)

STM32驱动WS2812B-2020RGB彩灯(一)

最近搞飞控,看到有些飞控上都使用的RGB彩灯,够酷炫,所以尝试着自己搞一个。
手上的硬件有一块自制的STM32F103最小系统板,一个同事焊好的WS2812B-2020灯板,正好。
首先需要搞清楚,RGB灯不是给电就能亮的,而是需要特定的高低电平时序,以下贴出具体参数:
首先,给我们看的是,RGB传输颜色信息,到底传的是什么?
在这里插入图片描述

上图表示的是4个灯珠串联,X1的DIN接MCU的一个IO口(注意,这里的IO口最好是能输出PWM的定时器通道口,具体原因后面解释),即D1,然后DO连接下一个灯珠的输入,即X2的DIN,以此类推,就将4个灯珠串联起来。具体电路连接如下图:
在这里插入图片描述

这里需要注意,该灯珠工作电压5V.
好了,基本连接我们搞清楚了,然后来看看具体数据怎么传输的。直接上图,如下:
在这里插入图片描述
数据自然是从我们连接的MCU的那个IO口出来的,如果我只连接了一个RGB灯,那么我需要从这个IO口输出一个24位的数据,即一个3字节的数据,这个24位的数据就是用来表示一个灯需要显示的颜色。因为光的三原色就是RGB(RED GREEN BLUE),有了三原色就可以组合成各种各样的颜色。每个颜色占8个位,需要注意的是,通常我们都是直接说RGB色,但是这里灯珠传输的颜色数值,顺序是GRB.当我需要让灯亮绿色,我就要发送0xff0000,当需要亮红色,就发送0x00ff00,蓝色0x0000ff.如果你想要其他颜色,就改变这里的值自己尝试。
好,上面我们说了亮一个灯,如果我需要亮两个,怎么搞?就是让我们的IO口输出两个24bit数据就可以了。当IO口输出了两个24bit数据后,第一个24bit数被第一个灯留下了,这个灯会自动的将剩下的24bit的数转发到后面去,当然,这里只剩下一个24bit了,就只有后面的第二个灯可以接收到了,如果你有第三个灯,没办法,没有数据了,就亮不了了。
同理,如果有4个灯,我就要发送4个24bit数据,这个应该可以理解了。有几个灯,就发送几个24bit数据。
ok!接下来要做的就是,怎么让每个灯珠识别我发送的24bit数据,所谓的数据,无非就是“0”和“1”的组合嘛!正常我发送一个数据,mcu内部会通过一系列的逻辑电路来识别是发送的是0还是1。但是灯珠没有那么多的电路,它是怎么识别的呢?我们来看下图:
在这里插入图片描述
上图就是RGB灯识别0 1码的具体表现形式。分析一下什么意思,在一个周期内,当我们接收到的信号高电平占T0H时间,低电平占T0L时间,那么就表示我接收到一个0数据。当一个周期内接收到的高电平占T1H时间,低电平占T1L时间,就表示我接收到一个1数据。所以说,我们在分析RGB驱动的时候,不是说我IO口给我一高电平,我就认为是1,给我一个低电平我就认为是0.这个是在理解初期常常会有误解的地方。我们使用一个周期内的占空比来确定接收到的是1值还是0值。
具体的周期和占空比,参数手册也有给到,参考如下:
在这里插入图片描述
好,这里就可以看到具体的时间了。比如,我要传输0值,高电平持续时间在220ns-380ns之间,低电平持续时间在580ns-1us之间,这个时间还是比较短的,在数据手册中有一句在这里插入图片描述
800k的传输速率,我们计算一下1.25us,这个大约就是传输一个1值或者0值的周期。可见,需要MCU的主频足够高这个传输才比较靠谱。之前我用了一款合泰的单片机,最高主频12M,执行一条指令的周期就已经来不及灯的电平翻转了。这里使用32的主频72MHz,足够了。
好,到这里就可以解释前面为什么要用带PWM的IO口了,就是为了这里的周期和占空比考虑的,如果我用简单的IO翻转,要能精确控制这个时间,是很难的。PWM输出能够比较精确的输出我们想要的波形,从而方便驱动灯珠。
最后还有个RESET要说一下,这个RESET是非常重要的,当我们将24bit数据发送出去后,此时灯是不会亮的,它需要有一个大于280us的低电平过来,然后才会将刚刚发送过来的24bit数据应用到灯上,而这个低电平就是我们这里需要的RESET信号,这个问题我也遇到过,在下一篇分析代码部分我会贴出。

  • 18
    点赞
  • 134
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值