描述

这篇文章将介绍,如何利用CubeMX工具进行芯片设置,最终达到控制WS2812型LED灯带的任务目标。

之所以要学习这种led灯的控制,是因为我们的机器人需要由灯光来返回一些机器人的状态,这样的显示状态方式比只通过屏幕显示是更优雅的。

  • 研发平台:淘宝上购买的野火店铺的一款单片机,名字叫骄阳开发板,核心芯片是
    stm32F407IGT6
  • 灯带:WS2812型号的灯带

由于LED灯带并不是我们工程的主要,我们尽量用通俗的语言讲懂它(说人话),控制好它,就够了。因此以下的主体内容可能出现术语不规范的情况。

灯带介绍

1.1 基本介绍

WS2812型灯带呢,简单来说就是串联在一起的、可编程的LED灯的组合。以我使用的LED灯带为例,就是一个30个灯组成的灯带。灯带上面的每一个灯都是可以发出不同的光的,也就是可编程的,我们可以令这30个灯同时发出30种不同的颜色,而每一个灯可以发出的颜色也是遵循RGB规则的(256_256_256)的。

观察你手里的灯,你会发现这个WS2812灯带的两端都是有管脚的。其中一端是:+5V、Din、GND;另外一端是+5V、Do、GND。5V和GND不解释,Din代表的就是管脚输入端,Do代表的就是管脚输出端。使用时,我们需要将Din接到你的单片机上,Do接到你接下来可能会需要的其他WS2812灯带上。

1.2 控制规则

手册上有这样一段话:XGB-2812协议采用的是单极性归零码,每一个码元都必须有低电平。本协议的每个码元起始为高电平, 高电平的时间宽度决定“0”码或者“1”。截图如下:

这是什么意思呢,我们来解释一下。

  1. 每一组数据最开始,需要发送一段时间的低电平。利用这段低电平来表示,这是一组新数据了。
  2. 每一位的数据,就是0和1呗。只不过在这里,0和1的区分,是靠在一个码元周期内高电平时间决定的。高电平时间长的是1,高电平时间短的是0。

控制一个灯的数据是24位的0/1数据。上面说过了,每一个灯的颜色都是用RGB来表示的,以R为例,是可以从0~255进行取值的。这样就是一个二进制的八位数据,RGB三个颜色通道就是24位数据了。只不过在WS2812灯带的数据输入顺序有所不同,是GRB且高位在前的数据格式,如下图:

那么如果我有n个灯,应该发送怎么样的数据呢。手册给出的数据格式是这样的,如下图:

图上的含义是,我们先来发送一段全部由低电平构成的trst码(用于表示这是一段新的数据),随后依次发送从第0个灯到第n-1个灯的24位数据。这样总的数据长度应该是(trst码数据长度+24*n)位数据。很好理解。

数据是怎么样分配到这n个灯上的呢,我们来看如下手册截图。这么长的数据被发送到n个灯上,每一个灯只接收(简单来说,打劫了)属于自己的24位数据命令,然后把剩下的数据原封不动的传递到下一个序号的灯上,这样完成了数据的传送。

1.3 参数设置

好了,上面两节相信我们已经完全的讲清楚了WS2812灯带的基本知识了。这里来对它,进行最后的参数设置的学习。我们现在需要解决的问题依次就是:

  1. 5V和GND我会接,那么Din我接到哪里呢?
  2. 那个管脚我又该如何设置呢?
  3. 颜色我都懂,我该怎么把255,0,0(红色)代表的24位数据让管脚发出去呢?
  4. 我怎么让指定序号的灯,亮起我想要的颜色呢?

我们来依次回答一下这些问题

  1. Din接到单片机的一个管脚上,我们会对这个管脚进行设置,让它发出我们想发出的PWM波形
  2. 这个管脚的参数设置我们下一节会介绍,设置的案例我们放到下一篇文章进行截图讲解,很简单
  3. 具体颜色的数据先要转变成24位的WS2812协议的数据顺序,然后需要根据每一个位上的0/1,让管脚发出高电平时间占比时间不同的PWM波,这就是一个灯的控制信号了
  4. 为了完成指定序号的灯的颜色控制,你需要发送完整灯带的颜色数据,由低电平+n个灯带的数据,这是完成学习的最后一步

参数的计算与确定

上面一节我说过了,Din需要接到一个管脚上,这个管脚需要设置成PWM波的生成管脚。那么第一个问题来了:PWM波的频率是多少?这个预分频系数和重装载值我们怎么设置?

手册上有着非常重要的一句话:写程序时,码元周期最低要求为 1.2us

我们可以设置一个码元周期为1.25us的定时器。我们用1秒来除一下这个1.25us,可以得到一个800KHz的时间频率。因此我们设置PWM的频率为800KHz,这是满足手册要求的。

总结

本篇介绍了WS2812灯带的一些知识,讲解了控制原理。这篇和接下来的一篇是连贯的。
预分频系数和重装载值的设置规则,我们放到接下来的一篇文章讲解