1. 项目缘起与整体设计思路
8x8x8 RGB LED立方体这玩意儿,但凡玩过硬件DIY的人多少都刷到过视频——512颗灯珠在三维空间里翻滚出各种动画,视觉冲击力确实拉满。但真正动手做过的人都知道,这东西最折磨人的不是写动画代码,也不是焊那512颗灯珠,而是底座PCB的设计。我前前后后打了三版板子,第一版直接报废,第二版勉强能用但飞线飞到怀疑人生,第三版才算真正跑通。这篇文章就把整个底座PCB从零设计的过程完整拆一遍,用的是KiCad,四层板,包含所有踩过的坑和最后验证过的方案。
先说说这个底座PCB到底要干什么。8x8x8的立方体本身是64根列线加8层共512个LED,如果直接拿单片机IO去驱动,引脚数量根本不够。所以常规做法是用层扫描加列驱动的方式:每一层单独供电,列线共用,通过快速切换层来实现视觉暂留。底座PCB的核心任务就是承载这些驱动电路,包括层驱动MOS管、列驱动芯片、主控MCU、电源管理,以及把64根列线和8根层线从立方体底部引下来接到驱动电路上。
为什么选四层板而不是两层板?这是第一个关键决策点。两层板理论上也能走通,但512颗LED的列线有64根,加上层线8根,再加上电源和地,走线密度非常高。两层板走线会非常拥挤,而且电源完整性很差——LED全亮的时候瞬时电流能到十几安培,两层板的电源平面阻抗根本扛不住。四层板可以拿出完整的一层做地平面,一层做电源平面,信号走线压力小很多,电源完整性也有保障。实测下来,四层板比两层板的电压跌落小了将近一个数量级,LED亮度均匀性明显更好。
KiCad在这类项目里的优势也很明显。开源免费是一方面,更重要的是它的3D视图和交互式布线体验对于这种异形板子非常友好。我试过用Altium Designer画过一版,功能确实强,但授权成本太高,而且对于个人项目来说很多高级功能根本用不上。KiCad 7.0之后的版本在推挤布线、差分对、长度匹配这些方面已经足够用了,配合嘉立创的免费打样,整个流程非常顺畅。
整体设计思路可以拆成几个模块来看。电源部分,输入是5V,需要给LED提供足够的电流,同时给MCU和驱动芯片提供3.3V。层驱动部分,8层每层需要一个MOS管来控制通断,选的是低导通电阻的N沟道MOS。列驱动部分,64根列线需要恒流驱动,用的是专用的LED驱动芯片,每颗芯片16通道,4颗就够了。主控部分,选的是STM32F103系列,性能够用,价格便宜,资料多。接口部分,立方体底部会引出排针,底座PCB上对应位置放排母,直接对插。
注意:四层板的层叠顺序非常关键。我第一版用的是信号-电源-地-信号的结构,结果发现电源平面和地平面之间的介质太厚,去耦效果很差。后来改成信号-地-电源-信号,把地和电源放在中间两层,间距尽量小,去耦电容的效果才出来。
2. 核心电路模块拆解与关键参数计算
2.1 电源树设计与电流估算
整个系统的电流估算必须做在最前面,这决定了走线宽度、铜厚、连接器选型。512颗LED,假设每颗全亮时电流20mA,但实际使用中不会全亮,通常按1/8占空比扫描,平均电流会低很多。但设计时必须按最坏情况来:如果某一层全亮,64颗LED同时点亮,每颗20mA,那就是1.28A每层。8层如果同时亮,总电流10.24A。当然实际扫描时只有一层在亮,所以瞬时电流是1.28A,但电源要能提供这个峰值。
5V输入,10A峰值,走线宽度至少要3mm以上,铜厚1oz的话建议4mm。我实际用的是2oz铜厚,走线2.5mm,实测温升可以接受。电源入口用了两个大容量电解电容,每个1000uF,并联几个0.1uF陶瓷电容做高频去耦。这里有个坑:电解电容的ESR比较高,高频响应差,必须并联陶瓷电容。我第一版只放了电解电容,结果LED切换时电源纹波很大,亮度闪烁明显。
3.3V部分用了一片AMS1117-3.3,给MCU和驱动芯片的逻辑供电。驱动芯片的恒流源是直接接5V的,逻辑部分接3.3V。这里要注意电平匹配,STM32的IO是3.3V,驱动芯片的逻辑输入如果也是3.3V兼容就没问题,如果不兼容需要加电平转换。
2.2 层驱动MOS管选型与散热
层驱动MOS管的选择主要看三个参数:导通电阻Rds(on)、栅极电荷Qg、封装热阻。Rds(on)越小,导通损耗越小。假设每层电流1.28A,Rds(on)如果10mΩ,损耗就是1.28²×0.01=16.4mW,完全可以忽略。但如果Rds(on)是100mΩ,损耗就是164mW,8个管子加起来1.3W,板子会明显发热。
我选的是AO3400,SOT-23封装,Rds(on)典型值28mΩ(Vgs=4.5V),Qg比较小,STM32的IO可以直接驱动。但这里有个问题:AO3400的Vgs(th)比较低,在3.3V驱动下也能导通,但Rds(on)会大一些。实测在3.3V驱动下,Rds(on)大概40mΩ左右,损耗约65mW每层,8层总共520mW,板子温温的,可以接受。
栅极需要加下拉电阻,防止MCU复位时MOS管误导通。我用的10kΩ下拉,栅极串联一个100Ω电阻抑制振铃。这个100Ω电阻是血泪教训:第一版没加,结果MOS管开关时产生高频振铃,干扰到了旁边的信号线,LED出现随机闪烁。加了之后问题消失。
2.3 列驱动芯片选型与恒流设定
列驱动用的是MBI5024,16通道恒流驱动,每通道最大120mA,足够驱动20mA的LED。4颗芯片级联,通过SPI接口控制。恒流值通过外接电阻设定,公式是Iout = Vref / Rext × 系数。MBI5024的Vref是1.2V,系数大概是20左右,所以Rext = 1.2 / (20 × 0.02) = 3kΩ。实际用了3.3kΩ,实测电流约18mA,亮度足够。
这里有个细节:MBI5024的通道间电流一致性很好,但芯片间会有差异。如果对亮度均匀性要求极高,需要做亮度校准。我实际测试下来,肉眼基本看不出差异,所以没做校准。但如果做商业产品,这一步不能省。
芯片的散热也要考虑。16通道全开,每通道20mA,总电流320mA,芯片压降假设1V,功耗就是320mW。4颗芯片总共1.28W,板子局部会有点热。我在芯片底部铺了铜皮,通过过孔连接到地平面散热,实测芯片表面温度大概50度左右,可以接受。
2.4 主控与接口设计
主控用STM32F103C8T6,48脚封装,够用。需要的外设:SPI控制列驱动,8个IO控制层驱动,一个串口用于调试和更新动画数据,一个SWD接口用于下载程序。晶振用8MHz外部晶振,PLL到72MHz。
接口部分,立方体底部有64根列线和8根层线,总共72根线。我用了两个2x36的排母,间距2.54mm,直接和立方体底部的排针对插。这里有个大坑:排针排母的接触电阻会随着电流增大而发热,1.28A的层电流通过单个排针针脚,接触电阻假设20mΩ,压降就是25.6mV,功耗32mW,单个针脚可以承受。但如果接触不良,电阻变大,就会发热甚至烧毁。我第二版就遇到过排母接触不良,那一层的LED明显偏暗,后来换了质量好的排母才解决。
提示:排针排母一定要选镀金的,接触电阻小且抗氧化。国产便宜的排母用几次就氧化了,接触电阻飙升,问题很难排查。
3. 四层板叠层设计与KiCad实操要点
3.1 层叠结构选择与阻抗控制
四层板的叠层结构直接决定了电源完整性和信号质量。常见的叠层方案有几种:
| 叠层方案 | 顶层 | 第二层 | 第三层 | 底层 | 优缺点 |
|---|---|---|---|---|---|
| 方案A | 信号 | 地 | 电源 | 信号 | 地去耦好,电源平面完整,推荐 |
| 方案B | 信号 | 电源 | 地 | 信号 | 电源去耦差,不推荐 |
| 方案C | 信号 | 地 | 信号 | 电源 | 电源平面不完整,走线困难 |
我最终选的是方案A:顶层走信号和器件,第二层完整地平面,第三层电源平面,底层走信号。板厚1.6mm,介质厚度:顶层到第二层0.2mm,第二层到第三层1.2mm,第三层到底层0.2mm。这个结构下,顶层信号的参考平面是第二层地,阻抗容易控制。底层信号的参考平面是第三层电源,由于电源平面也是低阻抗的,所以信号质量也可以接受。
嘉立创的JLC04161H-3313叠层结构就是这种,具体参数是:顶层铜厚1oz,介质0.2mm,第二层铜厚0.5oz,介质1.2mm,第三层铜厚0.5oz,介质0.2mm,底层铜厚1oz。这个叠层打样价格不贵,而且阻抗可控。
3.2 KiCad工程设置与网表导入
KiCad的工程设置有几个关键点。首先是设计规则,线宽最小0.15mm,间距最小0.15mm,过孔最小0.3mm孔径/0.6mm外径。这些参数嘉立创都能做,而且不加钱。电源走线单独设置规则,5V走线宽度2.5mm,3.3V走线宽度0.5mm,信号线0.2mm。
网表导入之前,原理图必须编译通过,没有未连接的引脚。我第一版就是因为有个电源引脚忘了接,网表导入后报错,排查了半天。KiCad的ERC检查一定要跑,虽然有时候会误报,但大部分问题都能发现。
封装库的管理也很重要。KiCad自带的库已经覆盖了大部分常用封装,但有些特殊封装需要自己画。比如那个2x36的排母,KiCad自带库里没有,需要自己建。建封装的时候注意焊盘尺寸,排母的焊盘要比排针的焊盘大一些,方便焊接。我用的焊盘尺寸是1.8mm×1.8mm,孔径1.0mm,间距2.54mm。
3.3 布局策略与热设计
布局的核心原则是按信号流向和电流路径来。电源入口放在板子边缘,方便接线。电解电容紧挨着电源入口,陶瓷电容紧挨着电解电容。MOS管放在板子中间偏下的位置,因为层线从立方体底部引下来,走线要短。列驱动芯片放在MOS管上方,靠近排母。MCU放在板子角落,远离大电流路径,避免干扰。
热设计方面,MOS管和驱动芯片是主要热源。MOS管下面铺铜,通过过孔连接到地平面散热。驱动芯片底部也铺铜,同样打过孔。我实际测试下来,连续运行2小时,板子最高温度在MOS管附近,大概55度,环境温度25度,温升30度,可以接受。
注意:过孔散热的效果和过孔数量、孔径有关。我用了0.3mm孔径的过孔,每个MOS管下面打了9个,驱动芯片下面打了16个。过孔要盖油,否则焊接时锡会流走。
3.4 布线规则与关键信号处理
布线是四层板设计的重头戏。电源走线要短而粗,5V从电源入口到每个MOS管的漏极,走线宽度2.5mm,尽量走直线,减少过孔。地平面是完整的,不需要额外走地线,但每个器件的接地引脚要通过过孔就近连接到地平面。
SPI信号线要等长,虽然MBI5024对时序要求不严,但等长走线是好习惯。我设置了差分对规则,SCK和MOSI走在一起,长度差控制在5mm以内。层驱动信号线从MCU到MOS管栅极,走线要短,避免平行走线减少串扰。我实际布线时,层驱动信号线走了底层,因为顶层被排母和驱动芯片占满了。
晶振电路要特别注意。8MHz晶振靠近MCU,走线尽量短,下面铺地铜,周围加屏蔽过孔。晶振的两个负载电容要靠近晶振放置,地引脚就近接地。我第一版晶振走线太长,结果MCU偶尔起振失败,后来缩短走线并加了屏蔽过孔才解决。
4. 实操过程与核心环节实现
4.1 原理图绘制与元件选型清单
原理图绘制从电源部分开始。5V输入经过一个保险丝(我用的是自恢复保险丝,6A保持电流),然后到电源开关,再到电解电容和陶瓷电容。3.3V用AMS1117-3.3,输入输出各加10uF和0.1uF电容。
MCU部分,STM32F103C8T6的最小系统包括:8MHz晶振加两个22pF电容,复位电路用10kΩ上拉加100nF电容,BOOT0和BOOT1各用10kΩ下拉。SWD接口用4针排针,包括3.3V、GND、SWDIO、SWCLK。
列驱动部分,4颗MBI5024级联,每颗的SDO接下一颗的SDI。所有芯片的CLK、LE、OE并联,由MCU控制。每颗芯片的16个输出通道接排母的列线。恒流电阻每颗芯片一个,3.3kΩ。
层驱动部分,8个AO3400,栅极接MCU的IO,漏极接排母的层线,源极接地。栅极下拉10kΩ,串联100Ω。
元件清单如下:
| 元件 | 型号 | 数量 | 备注 |
|---|---|---|---|
| MCU | STM32F103C8T6 | 1 | LQFP48 |
| 列驱动 | MBI5024 | 4 | SOP24 |
| MOS管 | AO3400 | 8 | SOT-23 |
| 稳压 | AMS1117-3.3 | 1 | SOT-223 |
| 晶振 | 8MHz | 1 | HC-49S |
| 电解电容 | 1000uF/10V | 2 | 直径8mm |
| 陶瓷电容 | 0.1uF | 20 | 0603 |
| 电阻 | 10kΩ | 12 | 0603 |
| 电阻 | 100Ω | 8 | 0603 |
| 电阻 | 3.3kΩ | 4 | 0603 |
| 排母 | 2x36 | 2 | 2.54mm |
| 排针 | 1x4 | 1 | SWD |
| 保险丝 | 6A | 1 | 自恢复 |
4.2 PCB布局实操记录
布局从板框开始。板子尺寸定为120mm×80mm,因为立方体底部是8x8的阵列,排母要放在对应位置。排母的间距是2.54mm,64根列线分两排,每排32根,加上8根层线,总共72根。我用了两个2x36的排母,并排放置,间距10mm。
电源入口放在板子左侧,保险丝和开关放在最左边,电解电容紧挨着。MOS管放在板子中间,排成一排,间距10mm,方便散热。列驱动芯片放在MOS管上方,也是排成一排。MCU放在板子右下角,远离大电流区域。
布局完成后,用KiCad的3D视图检查了一遍,确认排母位置和立方体底部对齐。这里有个小技巧:在KiCad里可以导入立方体的3D模型,直接看装配效果。我导入了一个简单的立方体模型,确认排母位置没问题。
4.3 布线实操与关键参数设置
布线从电源开始。5V走线宽度2.5mm,从电源入口到每个MOS管的漏极。走线尽量短,减少过孔。我实际布线时,5V走线走了顶层和底层,中间用过孔连接。过孔用了0.5mm孔径/1.0mm外径,每个过孔能过1A电流,所以每个MOS管附近放了两个过孔。
地平面是完整的,不需要走地线。但每个器件的接地引脚要通过过孔连接到地平面。过孔就近放置,距离引脚不超过2mm。我用了0.3mm孔径/0.6mm外径的过孔,每个接地引脚一个。
SPI信号线走了顶层,从MCU到列驱动芯片。SCK和MOSI走在一起,长度差控制在5mm以内。LE和OE信号线走了底层,因为顶层被排母占满了。层驱动信号线从MCU到MOS管栅极,走了底层,走线宽度0.2mm,尽量短。
晶振电路走了顶层,晶振靠近MCU,走线长度不超过10mm。负载电容靠近晶振,地引脚就近接地。晶振下面铺了地铜,周围加了屏蔽过孔,间距2mm。
4.4 打样与焊接调试
打样用的是嘉立创,四层板,1.6mm板厚,2oz铜厚,沉金工艺。5片板子花了不到200块,性价比很高。打样周期3天,加上快递2天,一周内到手。
焊接顺序:先焊MCU和驱动芯片,用热风枪加焊膏。然后焊MOS管和电阻电容。最后焊排母和电解电容。排母最后焊,因为焊接时板子要平放,排母会挡住。
调试步骤:先不插立方体,只给板子供电,测3.3V和5V是否正常。然后用SWD下载一个简单的测试程序,控制MOS管依次导通,用万用表测每层的电压。确认层驱动正常后,再测试列驱动,用SPI发送数据,测每个通道的电流。
提示:第一次上电一定要用限流电源,电流限制在500mA。如果板子有短路,限流电源会保护,不会烧板子。我第一版就是因为没限流,上电直接冒烟,MCU烧了。
5. 常见问题与排查技巧实录
5.1 LED亮度不均匀问题排查
亮度不均匀是最常见的问题,原因可能有几种。首先是电源压降,如果5V走线太细,末端电压会低于5V,LED亮度就会偏暗。排查方法:用万用表测每个MOS管漏极的电压,如果差异超过0.1V,就是走线问题。解决方法是加粗走线或增加过孔。
其次是驱动芯片的恒流值不一致。MBI5024的通道间一致性很好,但芯片间会有差异。排查方法:测每颗芯片的恒流电阻,确认阻值一致。如果阻值一致但电流不同,可能是芯片本身的问题,换一颗试试。
最后是排母接触不良。排查方法:用万用表测排母每个针脚的接触电阻,如果超过50mΩ,就是接触不良。解决方法是换镀金排母,或者用电子清洁剂清洗针脚。
5.2 MOS管发热严重问题排查
MOS管发热严重通常是Rds(on)太大或开关频率太高。排查方法:测MOS管漏极和源极之间的电压,如果导通时电压超过0.1V,就是Rds(on)太大。解决方法是换Rds(on)更小的MOS管,或者提高栅极驱动电压。
开关频率太高也会导致发热,因为开关损耗和频率成正比。排查方法:测栅极信号的频率,如果超过10kHz,就是频率太高。解决方法是降低扫描频率,或者换Qg更小的MOS管。
5.3 信号干扰导致LED随机闪烁
信号干扰是四层板设计的常见问题,原因可能是走线太长、平行走线太多、地平面不完整。排查方法:用示波器测SPI信号和层驱动信号,看是否有振铃或毛刺。解决方法是缩短走线、增加地线隔离、加屏蔽过孔。
我实际遇到的问题是层驱动信号线和SPI信号线平行走了很长一段,导致串扰。解决方法是在两条线之间加了一根地线,并且把层驱动信号线走了底层,问题解决。
5.4 常见问题速查表
| 问题现象 | 可能原因 | 排查方法 | 解决方法 |
|---|---|---|---|
| LED亮度不均匀 | 电源压降 | 测MOS管漏极电压 | 加粗走线,增加过孔 |
| LED亮度不均匀 | 恒流值不一致 | 测恒流电阻 | 换电阻或芯片 |
| LED亮度不均匀 | 排母接触不良 | 测接触电阻 | 换镀金排母 |
| MOS管发热 | Rds(on)太大 | 测导通电压 | 换MOS管 |
| MOS管发热 | 开关频率太高 | 测栅极频率 | 降低频率 |
| LED随机闪烁 | 信号串扰 | 示波器测信号 | 加地线隔离 |
| LED随机闪烁 | 电源纹波大 | 测电源纹波 | 加陶瓷电容 |
| MCU起振失败 | 晶振走线太长 | 测晶振波形 | 缩短走线,加屏蔽 |
5.5 独家避坑技巧
第一个技巧:打样前一定要用KiCad的3D视图检查装配。我第二版就是因为没检查,排母位置偏了2mm,立方体插不进去,只能飞线。
第二个技巧:焊接排母时,先焊对角两个针脚,确认位置正确后再焊其他针脚。如果直接焊所有针脚,排母受热会变形,位置会偏。
第三个技巧:调试时用限流电源,电流限制在500mA。如果板子有短路,限流电源会保护,不会烧板子。
第四个技巧:SPI信号线一定要等长,虽然MBI5024对时序要求不严,但等长走线可以减少反射,提高信号质量。
第五个技巧:地平面一定要完整,不要在上面走信号线。如果必须走,要在信号线两侧加地线隔离。
第六个技巧:过孔散热的效果和过孔数量、孔径有关。我用了0.3mm孔径的过孔,每个MOS管下面打了9个,驱动芯片下面打了16个。过孔要盖油,否则焊接时锡会流走。
第七个技巧:电解电容的ESR比较高,高频响应差,必须并联陶瓷电容。我第一版只放了电解电容,结果LED切换时电源纹波很大,亮度闪烁明显。
第八个技巧:排针排母一定要选镀金的,接触电阻小且抗氧化。国产便宜的排母用几次就氧化了,接触电阻飙升,问题很难排查。
第九个技巧:晶振电路要特别注意,晶振靠近MCU,走线尽量短,下面铺地铜,周围加屏蔽过孔。我第一版晶振走线太长,结果MCU偶尔起振失败,后来缩短走线并加了屏蔽过孔才解决。
第十个技巧:第一次上电一定要用限流电源,电流限制在500mA。如果板子有短路,限流电源会保护,不会烧板子。我第一版就是因为没限流,上电直接冒烟,MCU烧了。
6. 设计验证与性能实测
6.1 电源完整性实测
电源完整性是四层板设计的核心指标。我用示波器测了5V电源的纹波,在LED全亮时,纹波峰峰值大概50mV,在LED切换时,纹波峰峰值大概100mV。这个水平对于LED驱动来说足够了,肉眼看不到闪烁。
地平面的阻抗也很关键。我用网络分析仪测了地平面的阻抗,在1MHz时大概10mΩ,在10MHz时大概50mΩ。这个水平对于这个应用来说足够了。
6.2 信号完整性实测
SPI信号的上升沿大概5ns,没有明显的振铃。层驱动信号的上升沿大概100ns,也没有振铃。晶振波形很干净,频率准确。
6.3 热性能实测
连续运行2小时,环境温度25度,板子最高温度在MOS管附近,大概55度。驱动芯片表面温度大概50度。MCU温度大概40度。这个水平可以接受,不需要额外散热。
6.4 整体性能评估
整个底座PCB运行稳定,LED亮度均匀,没有明显的闪烁或干扰。扫描频率用了1kHz,视觉暂留效果很好,看不到闪烁。动画刷新率能到60fps,流畅度足够。
提示:扫描频率不要低于500Hz,否则肉眼能看到闪烁。但也不要太高,太高会导致MOS管开关损耗增加,发热严重。1kHz是个比较平衡的选择。
7. 后续扩展与个人经验体会
这个底座PCB后续还可以扩展。比如加一个SD卡槽,把动画文件存在SD卡里,不用每次更新动画都重新下载程序。或者加一个蓝牙模块,用手机APP控制动画。再或者加一个音频输入,做音频频谱显示。
我个人在实际操作中的体会是,四层板的设计难度比两层板高很多,但性能提升也很明显。如果只是做个小项目,两层板够用。但如果要做512颗LED这种大电流、高密度的项目,四层板是必须的。
踩过几次坑之后,我总结出一个原则:电源和地永远是最重要的。不管信号线走得多漂亮,电源和地没处理好,整个系统都不稳定。所以布局布线时,先把电源和地处理好,再考虑信号线。
最后再分享一个小技巧:KiCad的交互式布线器很好用,按W键可以切换走线宽度,按V键可以打过孔。布线时多用快捷键,效率会高很多。另外,KiCad的3D视图一定要用,可以提前发现装配问题,避免打样后才发现排母位置不对。
这个内容后续还可以这样扩展:把整个设计文件开源到GitHub,包括原理图、PCB、BOM和测试代码。有兴趣的可以自己打样焊接,遇到问题可以一起讨论。