第30讲 WS2812炫彩灯控魔术师

【STM32】WS2812炫彩灯控魔术师_哔哩哔哩_bilibili

WS2812的典型应用就是彩色灯带的控制,可以发出3路PWM信号调节灯珠的亮度,我们需要做的就是用单片机“告诉“每颗灯珠需要的亮度。

电子\计算机领域表示不同颜色通常都采用RGB(三原色)表示法。

每个颜色的强度一般从弱到强用0~255表示,即16进制的0~FF,正好是一个字节,因此一种颜色我们可以用三个字节进行表示。

如上图所示WS2812有四个引脚,除了供电回路VDD、GND之外,还有数据输入引脚DI与数据输出引脚DO。DI接受到的三个字节数据分别代表R\G\B小灯的亮度,最后还需要加上一个RESET信号表示指令结束。 WS2812支持级联,前级的DO可以连接在后级的DI上。每一级的芯片都可以留下自己所需要的数据然后将剩下的发给后级芯片。最后的RESET信号会被链路上每一枚芯片收到。

WS2812采取的通信方式被称为归零码,也就是每位数据之间电平必须归为低电平,通过零电平来隔开每位数据,通过每位数据中高电平时间的长短来表示0与1。

由于失去时钟信号的约束,WS2812的单总线通信速率被约束在了800khz左右。同时0码的高电平时间约为1/3周期,低电平时间则为2/3周期,1码则与0码相反。复位码的低电平持续时间则为125us。

多组数据传递的宏观效果则如下图所示:

在输出比较PWM1模式下,一个周期首先输出高电平,当计数器值与输出比较寄存器值相等时,切换为低电平,完成整个周期的时间。定时器中有一个可以触发DMA的事件叫做输出比较,也就是当计数器的值与输出比较寄存器的值相等时,便会触发DMA搬运,将下一个周期的占空比所用数据搬运到输出比较寄存器,此时本周期的电平已经完成切换不再受影响,也提前为下一个周期准备好了输出比较值。因此这个需求我们需要做的事就是提前准备数组存储亮度信息。

开始配置:

①选择TIM3的时钟源为内部时钟,也就是挂载它的APB1时钟总线;

②通道1选择为PWM输出通道;

③计数周期设置为90-1,此时PWM的输出频率为72M/(0+1)*(89+1)=800k。

④PB4为了实现逻辑线与,需要配置为开漏输出。

⑤配置DMA通道搬运数据,TIM3通道1的触发事件,数据传输的方向需要改为内存到外设。内存中的数据地址需要自增来实现数据的一个个搬运,同时因为输出比较寄存器大小为16位置,所以选项卡中默认的数据宽度为半个字节。

代码示例(最好在循环前使用,芯片存在RDB\GRB两种规格):

void WS2812_Update()
{
  static uint16_t data[]={//静态数组,生命周期不会因为函数结束调用而被销毁
    Code1,Code1,Code1,Code1,Code1,Code1,Code1,Code1,//8个1码 红色
	Code0,Code0,Code0,Code0,Code0,Code0,Code0,Code0,
	Code0,Code0,Code0,Code0,Code0,Code0,Code0,Code0,
	CodeReset
  };

	HAL_TIM_PWM_Start_DMA(&htim3,TIM_CHANNEL_1,(uint32_t *)data,sizeof(data)/sizeof(uint16_t));
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值