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

[复制链接]
5606|38
 楼主| Tristan_C 发表于 2023-10-28 00:33 | 显示全部楼层 |阅读模式
使用AT32F423的定时器PWM及DMA驱动WS2812B灯
做完一些基本的测试之后,本次就来做一个更酷炫的LED灯——WS2812B灯
WS2812B是一个集控制电路与发光电路于一体的智能外控LED光源。其外型与一个050LED灯珠相同,每个元件即为一个像素点。像素点内部包含了智能数字接口数据锁存信号整形放大驱动电路,还包含有高精度的内部振荡器和可编程定电流控制部分,有效保证了像素点光的颜色高度一致。数据协议采用单线归零码的通讯方式,像素点在上电复位以后,DIN端接受从控制器传输过来的数据,首先送过来的24bit数据被第一个像素点提取后,送到像素点内部的数据锁存器,剩余的数据经过内部整形处理电路整形放大后通过DO端口开始转发输出给下一个级联的像素点,每经过一个像素点的传输,信号减少24bit。像素点采用自动整形转发技术,使得该像素点的级联个数不受信号传送的限制,仅受限信号传输速度要求。这个灯现在应用非常广泛,其尺寸如下和引脚。
ac11483be2c344015d8a83c00d6f1d93
c6b62238bef849bf7bd493ede62ce910
aa6ab23d6653f82e3b919a4d0cb8de35
芯片的供电电压还是有一些要求的,最低要3.7V,为了能更好地驱动它,还得需要用板子上的5V电源。
f6b390b7435633b3c59ba09823bf6fbb
而数据通信则用3.3V的电平,根据其电器参数表的描述,3.3V的高电平也足够其识别了。
757431783ad1af32c455c8243b90f17e
电路设计上,只需要按照如下的串联即可
394a0fe2c088f1b2d86bfb298de40391
WS2812B的数据传输采用单线方式,如下为其数据传输时间、时序波形和数据传输方法,可以看到,其数据1和0,分别采用不同的高电平时间来决定。根据时间值,可以估算,数据1和0的总时间可以相同,而高电平时间分别为总时间的2/3和1/3即可,总时间可以设定为1.25uS,相当于是一个800KHz的方波,只是占空比分别是2/3和1/3来分别待变1和0.
4eb7ae1fef73606275d6c369a2151e7b
在数据传输的方法中,前面已经提到,首先送过来的24bit数据被第一个像素点提取后,送到像素点内部的数据锁存器,剩余的数据经过内部整形处理电路整形放大后通过DO端口开始转发输出给下一个级联的像素点,每经过一个像素点的传输,信号减少24bit。也就是每个灯,只保留自己收到的第一个24bit数据,剩下的都传给下一个灯。
同时,在传输完一次所有数据之后,需要产生一个RESET信号,该信号时间大于280uS,设计中采用320uS,以满足改时序。
数据在发送时,按照下面的顺序传输,即高位线发送,GRB的顺序发送.
f2520a7f1cf9ecbd1013db47d8858501
下面就可以考虑如何驱动具体的灯带或者灯条了
手上正好有一个16颗灯珠的灯条可以用来做测试
a0985c082d4b1b6872f2980636fd1cf3
首先按照前述使用pwm方波的反式驱动的话,可以使用定时器的通道产生具体的方波型号。
这里采用TIMER1的Channel 3,并在PA10引脚上输出具体的方波信号,且将该引脚接到WS2812B的DI引脚上。电源使用板载的5V。
df2178e60857dac0dd5c63f40546b9a7
2343b59bbd1ad94e50c3dd09aa82604b
2eaeaa1b569aab16aaeb56353214de2c
实物连接如下
23209a1963924a5cfd493fd6ad00d438
同时为了查看产生的波形情况,私用逻辑分析仪查看PA10引脚的波形,该引脚正好也是J8引脚上的USART1_RX
f036ea12a09077419aea15184c182283
实物连接如下。
5da795681d25738bc0a165d2ad4cd6e3
接下去进行程序设计。
首先进行参数定义,如PWM所需的频率,WS2812B的LED灯珠个数,等等,其中还有RESET的时间,以及换算成800KHz的PWM所需的脉冲数,输出时,这段时间占空比为0,即可实现低电平时间输出的精确控制了。
4c61dfa7598c34033ae3cd42623bdedb
然后设计定义颜色结构体,以及相应的一些变量。其中ws2812b_bit_buffer就保存所有的WS2812B的位数据,以及RESET的所需位数据
2308bcd3d06245c701510e0396459340
接下来设计定时器的初始化,这部分主要配置GPIO,以及定时器的工作参数,包括定时计数值,数据1和0所需占空比的计数,PWM输出模式等。
54b8e6ad10316ad42e31879eedda0f8a
再配置DMA,其工作方式位内存到外设。
a2c10ee20a62b102e86d3e74c82565c9
这样就初始化好所需要的硬件及外设了。
然后定义WS2812B的数据缓存填充和显示更新函数,其中填充函数中,根据颜色的值,取相应字节的位转换为PWM缓存的占空比计数值,供DMA触发输出。而显示更新函数则控制定时器以及DMA的启停动作
1f6263c471a14522e577f91a0f8c2c89
最后在main主函数中,循环显示几种不同颜色。
58796509251a89f6625a272992c7b68a
编译下载运行
e54e9e46f18d7e8b2f63fbde600c7d66
1f5733a1e9edcab10cd40d290f6884ef
就可以看到灯条在Green、Red和Blue三种颜色之间切换了
8d2f51195a54e680523ee833c04f165a
d56bb0b9b3454c037dd66a2a877f7108
d7fc5f84c8fd91faf1f33d68c0dbfd50
打开逻辑分析仪上位机软件,可以看到根据程序设计每2000mS更新颜色发出的PWM波信息。
b24ecfaddd9a6de0df860ed5c122ede1
将某一个波形放大,首先可以看到一次完整的数据传输如下,后面有一个接近320uS的RESET信号(下图中的319.25uS)
cdee807935a1ac4d76e9352e3b8c8ac5
继续放大,可以看到波形的周期就为800KHz
3bfea6c9b151a3355bf7da4415b7da92
再继续放大,可以找到数值1的波形占空比
056d6efcf57ef3e0ab7a7b150f0eb5a6
以及数值为0的波形占空比
d77f91769fd92cbe2626cb9dd73eb185
使用起来,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控制器的速率不匹配,可能会导致数据丢失或显示异常。
pentruman 发表于 2023-12-4 09:59 | 显示全部楼层
WS2812的通信协议对信号的时间有着严格的要求,因此传输过程需要精确的定时和控制。
bestwell 发表于 2023-12-4 10:17 | 显示全部楼层
可以通过调整PWM输出频率、优化数据传输算法等方法,提高WS2812B灯的显示效果和稳定性。
 楼主| Tristan_C 发表于 2023-12-4 10:24 | 显示全部楼层
sdlls 发表于 2023-12-3 22:28
可以设置预分频因子为0,自动重装载初值为90-1,则频率为72M/90 = 800K。这样可以满足WS2812B灯的时间要求 ...

嗯嗯,多谢提点
 楼主| Tristan_C 发表于 2023-12-4 10:27 | 显示全部楼层
hilahope 发表于 2023-12-4 09:21
在使用PWM及DMA驱动WS2812B灯时,需要注意单片机的IO口和DMA通道的配置和驱动能力,避免IO口和DMA通道的负 ...

好的,多谢提点
pmp 发表于 2023-12-4 10:34 | 显示全部楼层
WS2812B灯带的数据长度为24位,每个LED需要24个字节。因此,在编写驱动程序时,需要注意数据长度是否符合要求。
iyoum 发表于 2023-12-4 11:07 | 显示全部楼层
需要按照WS2812B灯的数据时序要求,生成相应的数据序列。同时,使用DMA通道将数据传输到WS2812B灯。
yeates333 发表于 2023-12-4 15:14 | 显示全部楼层
WS2812B灯具有较高的数据传输速率和时序要求,因此需要确保单片机的处理速度和DMA通道的传输效率满足WS2812B灯的显示要求。
 楼主| Tristan_C 发表于 2023-12-4 15:24 | 显示全部楼层
本帖最后由 Tristan_C 于 2023-12-25 09:59 编辑

感谢各位……

评论

才发现?一直有了  发表于 2023-12-23 09:22
averyleigh 发表于 2023-12-4 15:45 | 显示全部楼层
需要在配置PWM和DMA时设置恰当的时钟和计时参数。
usysm 发表于 2023-12-4 15:53 | 显示全部楼层
配置单片机的PWM输出引脚和DMA通道的工作参数。PWM输出需要设置合适的频率、占空比等参数,以满足WS2812B灯的显示要求。DMA通道需要设置合适的传输方式、数据长度、缓存大小等参数,以确保数据传输的效率和稳定性。
febgxu 发表于 2023-12-4 16:20 | 显示全部楼层
根据WS2812B的数据手册来设定PWM波形的频率和占空比。
fengm 发表于 2023-12-5 10:49 | 显示全部楼层
实际使用中,可以采取一些抗干扰措施,例如增加校验位、使用屏蔽线等,以提高通信的稳定性。
backlugin 发表于 2023-12-5 11:11 | 显示全部楼层
需要做好防干扰措施,如使用屏蔽线、接地等。
hudi008 发表于 2023-12-5 11:34 | 显示全部楼层
正确设置DMA的地址通道可以优化数据传输的效率。
maqianqu 发表于 2023-12-5 13:11 | 显示全部楼层
WS2812B灯带的时钟频率为100kHz,因此需要确保主控MCU的时钟频率大于等于100kHz。同时,还需要正确设置PWM脉宽和频率,以保证灯带的亮度和颜色正常。
lihuami 发表于 2023-12-5 15:51 | 显示全部楼层
在编写驱动程序时,需要正确设置DMA通道和传输方向,以保证数据传输的高效性和稳定性。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

117

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部