打印
[活动专区]

【AT-START-F423测评】+ 04_使用AT32F423的定时器PWM及DMA驱动WS2812B灯

[复制链接]
3225|38
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Tristan_C|  楼主 | 2023-10-28 00:33 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
使用AT32F423的定时器PWM及DMA驱动WS2812B灯
做完一些基本的测试之后,本次就来做一个更酷炫的LED灯——WS2812B灯
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.

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

下面就可以考虑如何驱动具体的灯带或者灯条了
手上正好有一个16颗灯珠的灯条可以用来做测试

首先按照前述使用pwm方波的反式驱动的话,可以使用定时器的通道产生具体的方波型号。
这里采用TIMER1的Channel 3,并在PA10引脚上输出具体的方波信号,且将该引脚接到WS2812B的DI引脚上。电源使用板载的5V。



实物连接如下

同时为了查看产生的波形情况,私用逻辑分析仪查看PA10引脚的波形,该引脚正好也是J8引脚上的USART1_RX

实物连接如下。

接下去进行程序设计。
首先进行参数定义,如PWM所需的频率,WS2812B的LED灯珠个数,等等,其中还有RESET的时间,以及换算成800KHz的PWM所需的脉冲数,输出时,这段时间占空比为0,即可实现低电平时间输出的精确控制了。

然后设计定义颜色结构体,以及相应的一些变量。其中ws2812b_bit_buffer就保存所有的WS2812B的位数据,以及RESET的所需位数据

接下来设计定时器的初始化,这部分主要配置GPIO,以及定时器的工作参数,包括定时计数值,数据1和0所需占空比的计数,PWM输出模式等。

再配置DMA,其工作方式位内存到外设。

这样就初始化好所需要的硬件及外设了。
然后定义WS2812B的数据缓存填充和显示更新函数,其中填充函数中,根据颜色的值,取相应字节的位转换为PWM缓存的占空比计数值,供DMA触发输出。而显示更新函数则控制定时器以及DMA的启停动作

最后在main主函数中,循环显示几种不同颜色。

编译下载运行


就可以看到灯条在Green、Red和Blue三种颜色之间切换了



打开逻辑分析仪上位机软件,可以看到根据程序设计每2000mS更新颜色发出的PWM波信息。

将某一个波形放大,首先可以看到一次完整的数据传输如下,后面有一个接近320uS的RESET信号(下图中的319.25uS)

继续放大,可以看到波形的周期就为800KHz

再继续放大,可以找到数值1的波形占空比

以及数值为0的波形占空比

使用起来,AT32F423的PWM驱动WS2812B还是非常方便的,后续只需要关心显示的颜色,即可输出幻彩内容。



使用特权

评论回复
沙发
sdlls| | 2023-12-3 22:28 | 只看该作者
可以设置预分频因子为0,自动重装载初值为90-1,则频率为72M/90 = 800K。这样可以满足WS2812B灯的时间要求。

使用特权

评论回复
板凳
hilahope| | 2023-12-4 09:21 | 只看该作者
在使用PWM及DMA驱动WS2812B灯时,需要注意单片机的IO口和DMA通道的配置和驱动能力,避免IO口和DMA通道的负载过大。

使用特权

评论回复
地板
jkl21| | 2023-12-4 09:45 | 只看该作者
如果DMA数据传输速率与WS2812B控制器的速率不匹配,可能会导致数据丢失或显示异常。

使用特权

评论回复
5
pentruman| | 2023-12-4 09:59 | 只看该作者
WS2812的通信协议对信号的时间有着严格的要求,因此传输过程需要精确的定时和控制。

使用特权

评论回复
6
bestwell| | 2023-12-4 10:17 | 只看该作者
可以通过调整PWM输出频率、优化数据传输算法等方法,提高WS2812B灯的显示效果和稳定性。

使用特权

评论回复
7
Tristan_C|  楼主 | 2023-12-4 10:24 | 只看该作者
sdlls 发表于 2023-12-3 22:28
可以设置预分频因子为0,自动重装载初值为90-1,则频率为72M/90 = 800K。这样可以满足WS2812B灯的时间要求 ...

嗯嗯,多谢提点

使用特权

评论回复
8
Tristan_C|  楼主 | 2023-12-4 10:27 | 只看该作者
hilahope 发表于 2023-12-4 09:21
在使用PWM及DMA驱动WS2812B灯时,需要注意单片机的IO口和DMA通道的配置和驱动能力,避免IO口和DMA通道的负 ...

好的,多谢提点

使用特权

评论回复
9
pmp| | 2023-12-4 10:34 | 只看该作者
WS2812B灯带的数据长度为24位,每个LED需要24个字节。因此,在编写驱动程序时,需要注意数据长度是否符合要求。

使用特权

评论回复
10
iyoum| | 2023-12-4 11:07 | 只看该作者
需要按照WS2812B灯的数据时序要求,生成相应的数据序列。同时,使用DMA通道将数据传输到WS2812B灯。

使用特权

评论回复
11
yeates333| | 2023-12-4 15:14 | 只看该作者
WS2812B灯具有较高的数据传输速率和时序要求,因此需要确保单片机的处理速度和DMA通道的传输效率满足WS2812B灯的显示要求。

使用特权

评论回复
12
Tristan_C|  楼主 | 2023-12-4 15:24 | 只看该作者
本帖最后由 Tristan_C 于 2023-12-25 09:59 编辑

感谢各位……

使用特权

评论回复
评论
xiaoqi976633690 2023-12-23 09:22 回复TA
才发现?一直有了 
13
averyleigh| | 2023-12-4 15:45 | 只看该作者
需要在配置PWM和DMA时设置恰当的时钟和计时参数。

使用特权

评论回复
14
usysm| | 2023-12-4 15:53 | 只看该作者
配置单片机的PWM输出引脚和DMA通道的工作参数。PWM输出需要设置合适的频率、占空比等参数,以满足WS2812B灯的显示要求。DMA通道需要设置合适的传输方式、数据长度、缓存大小等参数,以确保数据传输的效率和稳定性。

使用特权

评论回复
15
febgxu| | 2023-12-4 16:20 | 只看该作者
根据WS2812B的数据手册来设定PWM波形的频率和占空比。

使用特权

评论回复
16
fengm| | 2023-12-5 10:49 | 只看该作者
实际使用中,可以采取一些抗干扰措施,例如增加校验位、使用屏蔽线等,以提高通信的稳定性。

使用特权

评论回复
17
backlugin| | 2023-12-5 11:11 | 只看该作者
需要做好防干扰措施,如使用屏蔽线、接地等。

使用特权

评论回复
18
hudi008| | 2023-12-5 11:34 | 只看该作者
正确设置DMA的地址通道可以优化数据传输的效率。

使用特权

评论回复
19
maqianqu| | 2023-12-5 13:11 | 只看该作者
WS2812B灯带的时钟频率为100kHz,因此需要确保主控MCU的时钟频率大于等于100kHz。同时,还需要正确设置PWM脉宽和频率,以保证灯带的亮度和颜色正常。

使用特权

评论回复
20
lihuami| | 2023-12-5 15:51 | 只看该作者
在编写驱动程序时,需要正确设置DMA通道和传输方向,以保证数据传输的高效性和稳定性。

使用特权

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

本版积分规则

15

主题

114

帖子

1

粉丝