写VK1620这块点阵LED显示驱动芯片,还是因为前段时间在做一批仪表显示面板。客户现场环境比较恶劣,电机一启动,数码管和LED点阵就开始闪、跳数字,甚至乱码。试过用595加三极管扫,加了一大堆滤波电容也不理想,后来换成VK1620这类带抗干扰设计的数显驱动IC,问题才算是从根上解决。这篇文章就把这次选型、设计和调试的过程拆开讲讲,尤其是抗干扰这块的思路和实际操作,给准备做点阵LED显示、数显面板的朋友一个参考。
1. 整体设计与方案选型:为什么最终定下VK1620
1.1 点阵LED驱动方案的痛点
做过点阵显示的人都有体会,驱动方案无非就那几种:74HC595级联、TM系列专用驱动、或者是直接用MCU的IO口扫描。简单场景下,595配合三极管阵列确实便宜,但一旦环境里有电机、继电器、开关电源这类干扰源,麻烦就来了。
我这次做的产品要求显示8×8点阵,外加4位8字数码管,功能并不复杂。头疼的是现场有变频器和接触器,客户说之前的板子一开机显示就乱跳,有时候甚至会出现不该亮的段位半亮、微亮。这类问题本质上是驱动芯片的输入信号被干扰抬高了电平,或者说扫描时序被破坏,导致数据锁存错误。
选择VK1620,核心原因是它本身就是针对数显、点阵类应用设计的专用驱动芯片,内置了段驱动和位驱动,还有比较强的抗干扰设计。相比595方案,VK1620只用几根信号线就能控制几十路LED输出,MCU的负担小很多,稳定性也明显更好。
1.2 VK1620的核心定位与典型应用
VK1620是一颗串行接口的LED显示驱动芯片,常见封装是SOP20或者SSOP24,支持点阵和数码管两种接法。工作电压范围大概在2.4V到5.5V之间,单片机3.3V或5V供电都能直接配合。
芯片内部集成了移位寄存器和锁存器,通过DIN、CLK、STB三根线就能把显示数据送进去。输出端有段驱动口和位驱动口,可以接共阴数码管,也可以接点阵LED。市面上有些驱动芯片要外部加大功率三极管,VK1620的位驱动输出能力相对较强,直连小尺寸点阵是够用的。
抗干扰是这颗芯片的一个重点设计方向。实测下来,它对电源纹波的容忍度、对输入信号毛刺的抑制,都要比普通595方案好一截,这在工业控制面板、智能家电、充电桩显示屏这些场景里非常实用。
1.3 与常见方案的对比
这里把我用过的几种方案放一起对比一下,大家可以根据自己产品的环境来选择。
| 方案 | 成本 | 驱动能力 | 抗干扰能力 | 软件复杂度 | 适用场景 |
|---|---|---|---|---|---|
| MCU IO直扫 | 最低 | 弱 | 弱,易受干扰 | 高,占用CPU | 实验板、小尺寸、环境干净 |
| 74HC595+三极管 | 中低 | 中 | 一般,需额外处理 | 中 | 消费类、室内产品 |
| TM1638/TM1640 | 中 | 中 | 中等 | 低 | 家电面板、数码管 |
| VK1620 | 中 | 中强 | 强 | 低 | 工业仪表、点阵数显、有干扰环境 |
从成本和外围器件来看,VK1620并不算最便宜的方案,但如果把PCB上那些滤波电容、光耦隔离、软件消抖的功夫算进去,它反而更省。尤其是产品要过EMC测试的时候,专用驱动芯片的优势会非常明显。
2. 芯片特性与接口时序解析
2.1 引脚功能与内部结构
以我的使用经验来看,VK1620的引脚功能很容易理解。DIN是串行数据输入,CLK是移位时钟,STB是片选/锁存信号,这三个是主要的控制引脚。DOUT用于级联,可以把多颗芯片串起来控制更多LED,这在做大屏点阵时很有用。
内部结构上,VK1620相当于把一串移位寄存器、一个锁存器、以及一组大电流输出驱动集成在了一起。数据在CLK的上升沿或下降沿被采样进入移位寄存器,STB有效的时候把数据锁存到输出端。具体是上升沿还是下降沿采样,不同批次可能有差异,设计程序之前一定要看清数据手册,最好用示波器实测波形确认。
我这次的电路是5V供电,MCU用3.3V,信号线之间加了串联电阻做电平匹配和限流。这里提醒一下,VK1620的输出端虽然是驱动口,但也不能直接无限灌电流,要根据LED规格和亮度要求计算限流电阻,不能图省事把段口直接接地或者接电源。
2.2 串行通信时序注意事项
VK1620的数据手册上通常会给出时序图,看起来很简单,但实际操作中有几个细节需要注意。
首先是CLK的频率上限。我习惯把SPI或软件模拟的时钟控制在1MHz以下,不要太激进。频率太高了不仅MCU那边容易出现时序余量不足,走线长的时候还会因为反射导致数据错误。我在实验板上测过,如果CLK频率超过2MHz,再加上20厘米的杜邦线连接,显示就开始出乱码了。
其次是STB的时序。STB必须等整帧数据发送完成之后才拉高,不能在发送中途变化。有的朋友程序写得快,数据还没送完就操作STB,显示就会错位。正确的流程是:拉低STB,然后逐位发送数据,全部发完,拉高STB,这时候锁存器才更新输出。
还有一个容易被忽略的点:VK1620内部有格雷码计数或者类似的扫描机制,如果发送的数据位数和芯片要求的位数不匹配,会有诡异现象,比如某一行暗、某些段常亮。发送之前最好数清楚该芯片支持多少位,不要想当然。
2.3 级联与扩展
当点阵规模超过一颗芯片的能力时,级联是最常用的扩展方式。把前一颗芯片的DOUT接到下一颗的DIN,然后所有芯片的CLK和STB都并联,这样MCU只需要三个IO口就能控制多颗芯片。
级联的坑在于数据发送顺序。数据会先从第一颗的DOUT流到第二颗的DIN,所以发送数据时要先发最后一级的数据,再发倒数第二级,依次类推,最后发第一级的数据。我刚开始做双芯片级联的时候就在这上面吃过亏,显示内容左右或者上下颠倒,当时还以为是接线错了。
级联数量也要控制,一般不超过4颗比较稳妥。CLK走线长了之后信号质量会下降,驱动能力不够时要加缓冲器,不能硬拉。另外级联芯片之间的距离不要太远,PCB布局时尽量让信号线短而直。
3. 硬件设计实操:从原理图到PCB布线
3.1 电源设计与去耦电容布置
VK1620这类驱动芯片对电源的要求说高不高,说低也不低。5V供电时,建议在芯片电源引脚旁边放一个10uF电解电容和一个0.1uF陶瓷电容,两者并联。电解电容负责低频纹波的吸收,陶瓷电容负责高频噪声的滤除。这个组合几乎是我做任何数字板子都会用的标准配置。
更讲究一点的做法是,在电源入口加一个磁珠或者小阻值的电阻,把MCU的数字电源和LED驱动的电源隔离开。LED瞬间点亮时电流变化很大,如果和MCU共用电源,很容易把MCU那边的地弹噪声带起来。磁珠的作用就是让两边的地和电源在高频下“软连接”,减少相互干扰。
我之前有块板子,刚开始VK1620和STM32共用一个5V电源,没加磁珠,屏幕在按键操作时会轻微闪烁。后来在VK1620的供电端单独串了一个600欧的磁珠,闪烁问题就没了。这种细节在原理图阶段就要考虑进去,等PCB做好了再改很麻烦。
3.2 点阵LED的连接与限流电阻计算
点阵LED通常有8行8列共16个引脚,我用的8×8共阴点阵,公共端是行。VK1620的段口接LED的列,位口接LED的行。这样接的好处是,位口只需要承担8路LED的电流,段口的电流也控制在芯片允许范围内。
限流电阻的计算不复杂。比如工作电压5V,LED正向压降约2V,想要每路电流5mA,那么限流电阻就是(5-2)/0.005=600欧。我实际用的是560欧,亮度稍高一点,点阵整体看起来更清晰。这里要注意的是,VK1620的段口和位口的驱动能力有上限,不能无限调大电流,否则芯片会过热甚至烧毁。
多路LED同时点亮时,总电流是各路之和。比如8路同时亮,每路5mA就是40mA。这个电流对芯片来说不算大,但如果是16×16的点阵,就要考虑用三极管或者专用的PMOS做位驱动扩展,不要让芯片的位口电流超标。
3.3 抗干扰布线的几个实操要点
PCB布线是抗干扰设计里最有技术含量的部分,这里说几个我总结的要点。
第一,VK1620的CLK和STB信号线尽量短,不要和大电流的LED走线平行。LED的电流是突变的,会产生较强的电磁辐射,如果时钟线在旁边平行走很长一段,很容易耦合噪声进去。我在布板时把信号线放在一层,LED走线放在另一层,中间用地层隔开,效果好很多。
第二,MCU到VK1620的信号线要加串阻。一般加33欧到100欧的电阻,放在靠近MCU的一端。这个电阻有两个作用:限制信号反射,同时衰减高频噪声。实测加与不加,在EMC测试中差异明显。
第三,VK1620下方不要走其他敏感信号线,尤其是模拟信号。这类芯片工作时内部会有较高的开关频率,对下方的信号线产生干扰。另外芯片的散热焊盘如果有,尽量接大片的铜箔,既散热又起到一定的屏蔽作用。
第四,电源和地要大面积敷铜。表层走线的回路面积越小,天线效应越弱。我在很多新手板子上看到,地线走得又细又长,这是干扰问题的重灾区。记得用地线把点阵区域围一圈,相当于做了一个法拉第笼的简化版。
4. 软件驱动设计:扫描方式与显示数据流
4.1 软件模拟SPI的驱动函数
VK1620的信号接口其实就是简化的SPI,三根线分别是DIN数据线、CLK时钟线、STB片选线。如果MCU有硬件的SPI,可以直接复用来发数据,但要注意时钟极性和相位要和芯片匹配。我用的是软件模拟,因为IO口灵活,也方便在不同MCU之间移植。
写驱动函数的时候,最基本的发送流程就是:准备一段显示数据,拉低STB,然后在CLK的边沿逐位把数据送进去,最后拉高STB完成锁存。下面是我写的示例代码,用的是标准C语言,稍微改一下IO定义就能用在大多数单片机上。
#define VK1620_DIN P1_0 #define VK1620_CLK P1_1 #define VK1620_STB P1_2 void vk1620_send_byte(unsigned char dat) { unsigned char i; for (i = 0; i < 8; i++) { VK1620_CLK = 0; if (dat & 0x01) { VK1620_DIN = 1; } else { VK1620_DIN = 0; } dat >>= 1; // 低位在前 VK1620_CLK = 1; // 上升沿,芯片采样数据 } } void vk1620_send_data(unsigned char len, unsigned char* buf) { unsigned char i; VK1620_STB = 0; for (i = 0; i < len; i++) { vk1620_send_byte(buf[i]); } VK1620_STB = 1; // 锁存数据到输出 }这段代码的思路很简单:先把时钟拉低,数据电平准备好,再把时钟拉高让芯片采样数据。数据是低位先发还是高位先发,要和芯片手册确认,不同厂商的芯片习惯不一样。VK1620这一系列,我实测是低位在前,具体还是要看自己手里的规格书。
4.2 点阵扫描刷新流程
点阵显示本质上是一个动态扫描的过程。假设是8×8点阵,那么任意时刻只点亮一行的LED,通过VP1到VP8循环选通行,同时在这一行的8个段口上给出对应列的亮灭信息。只要刷新率足够快,人眼看到的就是完整的画面。
刷新率的计算很简单:如果每一行的驻留时间是1ms,那么8行扫完需要8ms,也就是刷新率125Hz。这个刷新率足够高,肉眼看不到闪烁。再低一点到60Hz也勉强能用,但移动的显示内容会有拖影。
VK1620内部有扫描逻辑,有些型号支持自动扫描,MCU只需要刷新显示缓冲区的数据,芯片自己完成行选通过程。有些型号则需要MCU按照特定时序来发送位选信息。用VK1620时,我习惯是MCU定时器每1ms调用一次发送函数,把一个内存缓冲区里的8行数据依次送进去。缓冲区是全局数组,主程序只要往数组里写内容,显示就会自动更新。
4.3 软件消抖与数据校验
软件抗干扰不能只靠芯片硬件,程序里的处理同样重要。我常用的做法是在主循环里定期读取按键和外部输入时加上消抖延时,对显示数据不直接对IO操作,而是通过缓冲区间接映射。这样即使外部信号出现瞬时的毛刺,也不会立刻反映到显示上。
VK1620的输入信号是串行的,如果CLK上混入一个毛刺,可能导致移位寄存器里的数据错位。解决的方法是:在发送时钟和数据之前,MCU先把信号线设置到确定的状态,然后延时几个微秒再拉时钟,保证数据线上没有抖动。另外,可以在发送完一帧数据后,再反向读一下芯片的DOUT做校验,虽然这个过程比较慢,但在关键应用里值得做。
灯光亮度调节也很实用。VK1620一般支持通过调整扫描占空比来调节亮度,不需要改变限流电阻。我在程序里用一个全局变量表示亮度等级,在发送每一行数据时插入不同的延时,让灯亮的相对时间变化,效果就是亮度变化。这个方案实现简单,实际体验不错。
5. 抗干扰专项调试记录
5.1 现场干扰问题的复现与分析
说回开头提到的客户现场问题。拿到客户的样机时,我先用示波器测了VK1620的STB和CLK引脚。发现电机启动瞬间,CLK信号线上会出现幅度很大的毛刺,直接把数据线上的电平状态破坏。这就是典型的空间耦合干扰,电磁噪声通过线缆、走线之间的寄生电容进入信号回路。
复现干扰的方式很简单:把一块完好的测试板放在离接触器30厘米的地方,接触器反复通断,观察显示是否错乱。测试中我确实看到数码管偶尔闪一下,点阵也会出现不该亮的小点。这说明干扰是真实存在的,不是客户操作环境里的偶发现象。
硬件上,我给CLK、DIN、STB三根信号线都加了串联电阻和上拉电阻,然后把点阵LED的电源回路加粗,减小回路电感。软件上,在发送数据的子函数里增加了几个空指令延时,让CLK的上升沿避开数据线上的瞬态过程。这样处理完之后,再次做同样的测试,错乱现象基本消失。
5.2 软件滤波与数据重发机制
除了硬件层面的措施,我在软件里加了一套“数据重发”机制。具体来说,每帧显示数据发送完之后,MCU会延时几十微秒,再把同样的数据重新发送一次。如果第一次发送的时候正好遇到干扰导致数据错位,第二次发送会恢复正常。VK1620是锁存型芯片,第二次发送会把错误的数据覆盖掉,所以显示最终是正确的。
这套机制看起来有点笨,但在干扰严重的环境里非常有效。与之配合的还有“判断扫描状态”的方法:有些芯片有忙标志或者回读功能,VK1620系列部分型号支持指令回读,可以在发送前先读取芯片当前的寄存器状态,发现异常就重新初始化。
我这里要特别说一个问题:很多朋友在查干扰问题时,喜欢一个劲地改硬件,却忽略了程序里发送时序的余量问题。CLK和数据线之间如果时序关系不满足,比如数据还没稳定就发时钟,干扰一来,错误率会急剧上升。所以软件发送时,最好在数据设置和时钟沿之间加至少几百纳秒的延时,这个余量越大,抗干扰性越强。
5.3 热处理与长时间稳定性测试
在工业环境里,芯片不光要抗电磁干扰,还要扛得住温度变化。VK1620的功耗在正常显示时不算大,但如果你把亮度调到很高,或者点阵面积很大,芯片温度会明显上升。我在测试时用了热成像仪,芯片表面温度在连续工作2小时后稳定在55度左右,还在安全范围内。
长时间稳定性测试也很重要。我让测试板连续运行了72小时,显示内容每隔10秒切换一次,模拟实际工况。结果72小时下来,没有出现一次死机或显示错乱。这给了我很大的信心,因为之前用其他方案,跑到24小时左右总会出现一次闪断。
测试中还发现一个细节:当电源电压慢慢下降,比如从5V降到4.5V时,VK1620的显示亮度几乎不变,说明内部有稳压或恒流机制。这对电池供电的小型仪表来说非常友好,电压波动不太影响显示效果。
6. 常见问题排查与技巧速查
6.1 显示乱码、缺笔画、无显示
先说说最常见的三个问题。
显示乱码,优先检查STB的锁存时序。用逻辑分析仪抓一下STB的波形,看它是否在整帧数据发送完成之后才拉高。如果STB在发送中途有抖动,或者MCU引脚初始化时有一个不确定的电平,就会导致锁存数据错乱。解决方法是给STB引脚加一个10k上拉电阻,程序里初始化时先把引脚置为高电平,再开始发送。
缺笔画或某一段不亮,多数是限流电阻没算对,或者LED本身引脚接触不良。点阵LED的引脚比较细,手工焊接容易虚焊,建议每次焊接后用万用表挨个测量导通情况。还有一个容易忽略的情况:VK1620的段口和位口不是任意互换的,接错了会导致某个LED永远点不亮或者亮度不一致。
完全无显示,先从供电查起。测VK1620电源脚的电压是否正常,再测CLK和DIN上有没有波形。很多时候是MCU的IO模式配置有问题,比如把DIN配置成了开漏输出,而芯片又不支持开漏电平,就导致了数据无法正确进入移位寄存器。这种问题通常不怪芯片,要回头检查程序配置。
6.2 级联显示顺序颠倒
级联点阵时常见的故障就是显示内容顺序不对,或者整体镜像。这和数据发送顺序有关,前面说过要先发最后一级的数据。解决办法是把发送数据的顺序调整一下:比如两颗芯片,先构造第二颗芯片的数据数组,再构造第一颗的,然后依次发送。改完之后如果发现左右镜像,就把段数据的位顺序颠倒一下。
更多级联芯片时候,如果显示的画面像是被切成了碎片,多半是发送数据长度不对。每一颗芯片需要的数据字节数是固定的,比如某型号是16字节,两颗就是32字节。只发了30字节,最后一段数据就会错误地流到下一颗芯片,造成显示混乱。这个排查思路对所有级联型驱动芯片都适用。
6.3 点阵亮度不均与刷新率的关系
点阵亮度不均是个常见问题,尤其是大尺寸点阵上特别明显。原因通常是行扫描的驻留时间不一致。如果程序用延时函数控制行切换,而延时函数本身受中断影响抖动,那扫描就不是均匀的,人眼看起来就是一行亮一行暗。
要解决这个问题,可以用定时器中断来触发行切换,保证每行点亮的时间绝对一致。我在程序里把扫描放在定时器中断中,主循环只负责更新缓冲区数据,这样显示稳定性明显提高。另一个影响亮度均匀性的因素是VK1620的位驱动能力,如果某一行同时点亮的LED数量特别多,电流就会不够,那一行整体会偏暗。
刷新率设置上,建议不要低于100Hz。低于这个值拍照时会出现黑条纹,人眼虽然不一定看得出闪烁,但视觉疲劳感会上升。设置到120Hz以上,效果就比较理想了。
6.4 抗干扰排查的检查列表
最后整理一份检查列表,全是这次实践中验证过的有效手段。以后遇到类似干扰问题,可以从上往下一样一样查:
- 芯片电源引脚是否并联10uF电解电容和0.1uF陶瓷电容?
- 电源入口是否加了磁珠或者RC滤波?
- MCU到VK1620的信号线有没有加33-100欧串联电阻?
- 信号线是否远离LED大电流走线?是否用地线隔离?
- STB和CLK引脚有没有上拉电阻?
- 软件发送时序中,数据建立时间和保持时间是否留足余量?
- 显示数据是否做了周期性重发或校验?
- PCB地线是否大面积敷铜,回路面积是否最小?
这些问题里只要有一个没做好,在强干扰环境下整个显示系统的稳定性就会打折扣。调试的时候不要怕麻烦,逐项排查,找到问题的根源比盲目增加各种滤波器要有效得多。
这次项目做完后,我对VK1620这颗芯片的兼容性和稳定性有了更具体的认知。它不是为了性能极致而生的芯片,但恰恰是这种务实的设计思路,让它能在各种恶劣环境下稳定工作。说白了,专用显示驱动芯片能帮你挡住绝大部分来自外部的干扰,剩下的细节问题,靠布线和软件配合就能吃得下。如果在做数显或者点阵类的产品,建议按照上面的思路走一遍,能绕开不少坑。