打印
[STM32U5]

【NUCLEO-U5A5ZJ-Q测评】4.DMA与SPI驱动WS2812B灯带LED

[复制链接]
1551|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Tristan_C|  楼主 | 2023-11-25 01:58 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Tristan_C 于 2023-11-27 08:35 编辑

#申请原创# DMA与SPI驱动WS2812B灯带LED
前面已经点过LED,手上正好有一条WS2812B的灯带,上面有16颗灯珠,想着用STM32U5的SPI来驱动以下吧,将点灯进行到底。灯条的控制只需要接5V的电源以及SPI主机的MOSI引脚。5V就接到板子上的5V电源引脚即可。其中5V从如下引脚取得

而MOSI则试用如下的SPA_A的MOSI,也就是PA7引脚

WS2812B是一个集控制电路与发光电路于一体的智能外控LED光源。其外型与一个050LED灯珠相同,每个元件即为一个像素点。像素点内部包含了智能数字接口数据锁存信号整形放大驱动电路,还包含有高精度的内部振荡器和可编程定电流控制部分,有效保证了像素点光的颜色高度一致。数据协议采用单线归零码的通讯方式,像素点在上电复位以后,DIN端接受从控制器传输过来的数据,首先送过来的24bit数据被第一个像素点提取后,送到像素点内部的数据锁存器,剩余的数据经过内部整形处理电路整形放大后通过DO端口开始转发输出给下一个级联的像素点,每经过一个像素点的传输,信号减少24bit。像素点采用自动整形转发技术,使得该像素点的级联个数不受信号传送的限制,仅受限信号传输速度要求。这个灯现在应用非常广泛,其尺寸如下和引脚。



芯片的供电电压还是有一些要求的,最低要3.7V,为了能更好地驱动它,还得需要用板子上的5V电源。

而数据通信则用3.3V的电平,根据其电器参数表的描述,3.3V的高电平也足够其识别了。

电路设计上,只需要按照如下的串联即可

WS2812B的数据传输采用单线方式,如下为其数据传输时间、时序波形和数据传输方法,可以看到,其数据1和0,分别采用不同的高电平时间来决定。根据时间值,可以估算,数据1和0的总时间可以相同,而高电平时间分别为总时间的2/3和1/3即可,总时间可以设定为1.25uS,相当于是一个约800KHz的方波,只是占空比分别是2/3和1/3来分别待变1和0。但我们采用的是SPI的方式驱动,该方式驱动需要控制每个字节的8位中连续置1的位的个数来实现占空比的调节,根据下面的时间,可以分别采用5bit位和2bie位来表示数值1和数值0,也就是5/8和2/8,相当于781nS和313nS,正好能符合时序所要求的T1H和T0H的时间。

在数据传输的方法中,前面已经提到,首先送过来的24bit数据被第一个像素点提取后,送到像素点内部的数据锁存器,剩余的数据经过内部整形处理电路整形放大后通过DO端口开始转发输出给下一个级联的像素点,每经过一个像素点的传输,信号减少24bit。也就是每个灯,只保留自己收到的第一个24bit数据,剩下的都传给下一个灯。
同时,在传输完一次所有数据之后,需要产生一个RESET信号,该信号时间大于280uS,设计中采用320uS,以满足改时序。
数据在发送时,按照下面的顺序传输,即高位线发送,GRB的顺序发送.

下面就开始想办法让STM32U5的板子驱动起来这根灯条吧
首先是试用CubeMX打开工程Examples\SPI\SPI_FullDuplex_ComDMA_Master
确保进行如下时钟配置,让SPI处能得到12.8MHz的频率(SPI自身再进行2分频得到6.4MHz)


然后配置SPI参数时,要特别注意其分频选项,让SPI的时钟满足前面提到的6.4MHz的要求

因脚上默认试用demo的即可,因为已经时PA7作为MOSI了。

生成代码,这里注意因为选择的是Keil开发的因此生成的代码工具需要将默认的iar改掉

在打开的keil工程中,选择打开main文件,接下来的改动主要在这个文件中

这里可以先将demo程序的发送测试代码去掉,免得干扰。
而SPI因为只需要发送因此发送完成的回调函数需要改成HAL_SPI_TxCpltCallback

然后定义前文中所属需要用到的一些常亮,包括SPI的时钟,LED的数量、RESET的时间及其所需发送字节数及其字节值,数值1和0的字节值等

然后定义WS2812B用到的结构体和显示内容的缓存空间,其中结构体内容即为GBR三种颜色的三个字节

接下来定义ws2812b的缓存刷新函数,该函数将所需刷新的灯珠的颜色数据转换为SPI需要发送的缓存。

接着就来到主循环,主循环中主要做的就是每2秒钟更新ws2812b_color这个决定灯珠显示的结构体,更新显示缓存,并刷新灯珠显示。

编译下载运行

就可以看到灯条在更新三种颜色显示了



用逻辑分析仪,可以看到SPI数据输出之后,对应到WS2812B的DI引脚上的频率,约800K,以及数据1和0的占空比情况



演示视频如下


使用特权

评论回复
沙发
单片小菜| | 2023-12-11 18:39 | 只看该作者
三色灯是可以同时进行调节亮度的吗?

使用特权

评论回复
板凳
lajfda003| | 2023-12-11 18:53 | 只看该作者
感觉使用这个单片机控制灯带,大材小用了。

使用特权

评论回复
地板
sasdfji001| | 2023-12-11 18:57 | 只看该作者
灯带的操作用一个8位单片机就可以搞定吧?

使用特权

评论回复
5
kjkujkj22| | 2023-12-11 19:06 | 只看该作者
这个三色灯带很漂亮,可以跑马灯。

使用特权

评论回复
6
udaidfa002| | 2023-12-11 19:14 | 只看该作者
感谢楼主的分享,三色灯带,确实很炫酷。

使用特权

评论回复
7
Tristan_C|  楼主 | 2023-12-11 21:00 | 只看该作者
单片小菜 发表于 2023-12-11 18:39
三色灯是可以同时进行调节亮度的吗?

它是一次性将所有灯的所有颜色数据传送完,再更新颜色亮度,也是串行传送的,但统一更新,也就可以理解为同时调节

使用特权

评论回复
8
Tristan_C|  楼主 | 2023-12-11 21:01 | 只看该作者
本帖最后由 Tristan_C 于 2023-12-12 12:15 编辑
lajfda003 发表于 2023-12-11 18:53
感觉使用这个单片机控制灯带,大材小用了。

哈哈,你说得对……就看怎么理解大材小用

使用特权

评论回复
9
Tristan_C|  楼主 | 2023-12-11 21:02 | 只看该作者
sasdfji001 发表于 2023-12-11 18:57
灯带的操作用一个8位单片机就可以搞定吧?

哈哈,确实是,你说得对,很对

使用特权

评论回复
10
Tristan_C|  楼主 | 2023-12-11 21:03 | 只看该作者
udaidfa002 发表于 2023-12-11 19:14
感谢楼主的分享,三色灯带,确实很炫酷。

用SPI或者PWM驱动起来还是挺方便的

使用特权

评论回复
11
Tristan_C|  楼主 | 2023-12-11 21:04 | 只看该作者
kjkujkj22 发表于 2023-12-11 19:06
这个三色灯带很漂亮,可以跑马灯。

还能做点阵

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

113

帖子

1

粉丝