前言:
由于原理图设计和PCB打板出现些许问题,预定准备的字库存储芯片和蓝牙模块没有用上,在该背景下,我将仅使用最小系统板,2个独立按键以及2块8*32的ws2812灯带,实现的效果仅是内置好汉字和英文效果。有需要的自行优化。
一、项目背景
本项目使用 STM32F103C8T6 最小系统板作为控制器,驱动两块8×32 WS2812B点阵屏。两块灯板左右级联后,共有512颗LED,逻辑显示区域为16列×32行。
项目最终需要实现:
- 显示16×16汉字;
- 预设中文内容向上滚动;
- 显示英文“hello world”;
- PA11切换中英文内容;
- PA12切换滚动、静止和闪烁模式;
- 使用USB-TTL完成程序下载和串口调试;
从功能上看,这只是一个文字滚动灯牌,但实现过程中同时涉及WS2812B时序、定时器PWM、DMA、坐标映射、字模、供电、信号完整性和硬件装配等问题。
二、项目需求
面包板(用于后续+5v和GND共地)
外部电源(8*32的ws2812灯带在满负载的情况下,电流可以达到15.36A,而灯带需要的电压至少+5V,最小系统板一般只能提供+3.3V)
stm32f103c8t6最小系统板
直插式独立按键2个
三、项目效果
由于学校发的只是2个8*32的灯带,如果是8*8取字模的话,基本看不清,所以用2个灯带拼接在一起。
四、项目难点
1.WS2812B并不适合只依赖Proteus验证
Proteus比较适合验证普通GPIO、按键、串口、定时器和LCD等常规外围电路,但WS2812B属于对波形时间要求比较严格的数字器件。
它的每个数据位周期大约只有1.25 μs,逻辑0和逻辑1并不是通过普通高低电平区分,而是通过高电平持续时间区分。因此,仿真模型必须准确处理:
- 800 kbit/s单总线数据;
- T0H和T1H高电平时间;
- 24位GRB颜色顺序;
- 多颗灯珠的数据截取和转发;
- 帧末尾的复位低电平;
- 数百颗灯珠的连续级联。
2.WS2812B不是普通LED
普通LED只需要输出高低电平,而WS2812B内部带有控制芯片,每颗灯珠需要接收24位颜色数据,顺序通常为:
G7...G0 → R7...R0 → B7...B0第一颗灯珠保留前24位,再把后面的数据转发给下一颗。发送完全部数据后,数据线需要保持足够长的低电平,让所有灯珠同时锁存颜色。
因此,驱动程序必须同时保证:
- 位周期正确;
- 0码和1码高电平宽度正确;
- GRB顺序正确;
- 灯珠数量正确;
- 发送数据不能中断;
- 帧尾复位时间足够。
任何一项错误都可能表现为随机颜色、局部点亮或整板爆闪。
3. PWM与DMA方案
系统时钟为64 MHz,一个时钟计数约为:
1 ÷ 64 MHz = 15.625 nsWS2812B每个数据位周期约为1.25 μs,因此设置80个定时器计数:
80 × 15.625 ns = 1.25 μs项目采用的PWM比较值为:
逻辑0:CCR = 22,高电平约0.344 μs 逻辑1:CCR = 45,高电平约0.703 μs程序先把每个数据位转换为22或45,再由DMA连续写入TIM1的CCR1寄存器。这样每一个脉冲都由硬件产生,稳定性高于软件延时。
4.灯板级联与坐标映射
1. 物理连接方式容易理解错误
最初对灯板内部级联方向的理解有误,以为灯珠按照逐列方式连接。实际灯板采用逐行蛇形连接:
第0行:从左到右 第1行:从右到左 第2行:从左到右 第3行:从右到左 ……如果仍然按照普通二维数组计算序号,显示出来的文字就会左右翻转、笔画断裂,甚至出现左右亮、中间不亮的固定图案。
2. 两块灯板级联后的映射
两块8×32灯板左右放置:
左侧灯板:物理序号0~255 右侧灯板:物理序号256~511逻辑屏幕尺寸为16×32。坐标转换可以写成:
panel = x / 8; local_x = x % 8; base = panel * 256; if ((y % 2) == 0) index = base + y * 8 + local_x; else index = base + y * 8 + (7 - local_x);这样,字模程序只处理普通的x、y坐标,底层映射函数负责处理左右灯板和蛇形方向。
5.WS2812B的电源电流不能忽略
理论上,一颗WS2812B全白高亮时电流可能达到约60 mA。512颗全部全白的理论电流可能非常大:
512 × 60 mA = 30.72 A实际项目使用低亮度单色显示,电流远低于这个数值,但PCB和接线仍不能按照普通小信号电路处理。
打板时应考虑:
- 5V电源使用较宽铜线或大面积铺铜;
- 两块灯板分别注入电源;
- 避免让全部电流经过最小系统板;
- 灯板入口增加大容量电解电容;
- 每个模块附近增加0.1 μF去耦;
- 数据地和电源地可靠连接;
- 电源接口需要留有足够电流余量。
6. 下载接口必须提前考虑
因为项目只有USB-TTL,没有ST-Link,所以需要使用STM32内部Bootloader下载:
USB-TTL TX → PA10 USB-TTL RX → PA9 USB-TTL GND → STM32 GND打板时应预留:
- PA9;
- PA10;
- GND;
- BOOT0跳帽或按键;
- RESET按键。
五、项目总结
在初期准备上没有准备好原理图,PA9和PA10引脚没有引出来,导致下载插拔困难。在遇到ws2812的各种问题并解决,在有限的情况下,尽量做出来的半成品。