每个七段 LED 后面都有一个 PADAUK PFS154-S16 微控制器,Tim“cpldcpu”的数字显示非常智能。
是时候进行另一个具有超低成本微控制器的项目了。 但要设计什么呢?
逐高电子技术开发部整理分享: 自从看到一个 0.03 美元的 MCU 控制价值 40 美元的智能 RGB LED 的项目以来,我一直想知道这是否是使用这些设备的正确场所。 在这个价位上,将一个 MCU 专用于一个 LED 并用它来实现一个精美的节点控制器似乎不是更有意义吗? 设计自己的协议一直吸引着我。 然而,仅仅复制 WS2812 RGB LED 或类似的东西似乎有点毫无意义……
看到这个(以及这个和这个)可链接和可寻址的 7 段显示器后,很清楚该怎么做:当单个微控制器可以以更低的成本更好地控制单个 7 段显示器时,为什么要使用三个 WS2811 IC 来控制单个 7 段显示器 成本?
上图显示了一般概念:每个段都有一个串行数据输入和一个串行数据输出,可以控制显示的内容。 来自每个段输入的数据被转发到下一个段,以便可以将下一个数字直接连接到前一个数字的输出。 电源将穿过所有设备。
一个重要的问题是使用哪种协议:为了简化控制,我将自己的目标设置为允许通过 8N1 配置中的标准 UART 进行控制。 这与例如相反 WS2812 采用非标准协议进行控制,时序具有挑战性。
硬件
我选择使用 PADAUK PFS154-S16 作为每个部分的微控制器。 该器件具有闪存和足够的 I/O,无需多路复用即可控制 7 段显示器。 成本仅为 0.07 美元,因此比使用多个 WS2811 等替代方案更便宜。 数据输入引脚连接到 PA0,允许使用引脚更改中断来检测传入传输。 数据输出为PA6,而PB0-PB7用于控制显示。 示意图如下所示。
为了避免为每个段添加一个电阻器,我决定仅使用单个限流器件并以多路复用模式运行显示器,以便一次仅打开一个段。 最初我计划使用 NSI50010,它是一个两端电流源。 不幸的是,事实证明,7 段显示器上的电压降太大,无法为电流源提供足够的电压。 因此,我用电阻器替换了它,并放弃了多路复用。
PCB设计如上所示。 7 段显示器安装在背面。 成角度的连接器用于连接显示器的各个部分。 最初我计划使用正确的连接器进行编程,但事实证明使用 SOIC8 夹子直接连接到微控制器要容易得多。
后侧
前面
上面显示了两个组装好的显示器。 正如您所看到的,它们整齐地对齐。
固件
该固件是使用 SDCC 开发的。 我使用 Easy PDK 编程器对微控制器进行编程。
协议
事实上,这个项目最有趣的部分是设计通信协议。 为了让事情变得简单,我定义了以下要求:
该链应可通过标准 UART 接口进行控制。 例如 USB 转 RS232 适配器。
该接口由单个输入引脚和输出引脚组成。 仅允许使用数字级别。
仅允许单向通信。 从链条到控制器没有返回通道。
链上的所有元素都会在同一交易中接收更新的信息。 不需要对各个单元进行寻址。
链上各段的显示内容应同步更新。
段应按其在链中的序号来寻址。
不需要错误检测或纠正。
第 2-7 项大大简化了事情,并且与众所周知的 WS2812 协议非常相似。 我们先解决1。
数据框
WS2812使用的“1N1”串行协议 在单线异步协议中,每次传输通常由一个起始条件和 1…n 位的有效负载组成。 上图展示了查看 WS2812 协议的一种方式:传输以低-高转换作为起始位开始,随后是单个数据位和一个停止位。 当使用标准 UART 符号时,这对应于正逻辑中的“1N1”协议。 Ts 表示一位的持续时间,它是波特率的倒数。 对于 WS2812,Ts 约为 450 ns,相当于 2.2 Mbaud。 无法直接将 WS2812 连接到标准 UART 输出的主要原因是信号反转。 很明显,1N1 协议在开销上浪费了大量带宽。 只有三分之一的传输用于实际数据。
标准8N1异步串口协议
串行传输通常依赖于 8N1 协议,如上所示。 这里,起始位后面跟着 8 个数据位,因此 80% 的传输实际上用于数据。
挑战在于,起始位后面的位数越多,计时精度要求就越严格。 假设我们在一位的中心进行采样,则最大时钟偏差需要小于一位时序的 50%。 当最大相对时钟偏差小于 delta<1/(2*(n+0.5)) 时,可以证明这一点得到满足,其中 n 是位数。 (推导稍微复杂一些)。
每帧位数与最大允许时钟偏差之间的关系如上所示。 人们必须考虑到发射器和接收器之间共享容差。 例如,对于 1N1 协议,发送器可能会出现 -17% 的偏差,接收器可能会出现 +17% 的偏差。
很明显为什么 WS2812 基于 1N1 协议:当时钟未调整时,需要 +-17% 来考虑制造工艺和操作温度变化。
对于 8 位数据帧,允许总误差小于 5%。 这对应于每个设备上时钟的 +-2.5% 容差。
由于可以调整 PFS154 微控制器上的时钟,因此可以获得比 WS2812 更好的容差。 数据表建议,如果器件在 5V 和 25°C 下运行,则为 +-1%,但在所有电压和温度条件下为 +-5%。 如果 VDD 保持在 4-6V 之间,容差应明显低于 +-5%(参见数据表中的图 4.5)。
最后我注意到每个 7 段显示器只需要 5 位有效负载。 因此我选择采用 8N1 协议,但仅使用 5 位。 这允许高达 4% 的时钟偏差。
状态机
现在我们已经决定了数据帧的样子,让我们来解决整个传输的工作原理。 要求是所有设备都可以按顺序寻址。 为了简单起见,没有实现特定的寻址机制,而是传输中数据的顺序与链中的顺序相对应。
这可以通过上面所示的状态机轻松实现,状态机可能看起来比实际情况复杂得多。
重置后,每个设备处于称为“接收”的第一状态。 当设备处于接收模式时,它将接受传输,但不会在其输出上发送任何内容。 第一个接收到的数据帧将被解释为显示更新信息并存储在内部。 完成接收有效数据帧后,设备将切换到“Forward”状态。
在转发状态下,所有接收到的数据帧都直接转发到输出,延迟为0.5 Ts。 收到有效数据帧后,设备将检查是否收到 EOT 代码。 如果是,设备将恢复到“接收”状态并等待新传输的开始。 EOT 符号定义为 0x00。
最后需要澄清的一件事:何时应该更新显示? 为了允许整个链同时更新,显示内容在接收到EOT符号后更新。
上图显示了 5 个正在运行的显示器链。 输入通过 USB 转 RS232 接口直接由 shell 脚本控制。