使用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还是非常方便的,后续只需要关心显示的颜色,即可输出幻彩内容。
|