ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

VK1620点阵LED驱动芯片抗干扰实战:从选型到硬件软件设计

VK1620点阵LED驱动芯片抗干扰实战:从选型到硬件软件设计 写VK1620这块点阵LED显示驱动芯片还是因为前段时间在做一批仪表显示面板。客户现场环境比较恶劣电机一启动数码管和LED点阵就开始闪、跳数字甚至乱码。试过用595加三极管扫加了一大堆滤波电容也不理想后来换成VK1620这类带抗干扰设计的数显驱动IC问题才算是从根上解决。这篇文章就把这次选型、设计和调试的过程拆开讲讲尤其是抗干扰这块的思路和实际操作给准备做点阵LED显示、数显面板的朋友一个参考。1. 整体设计与方案选型为什么最终定下VK16201.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的电流段口的电流也控制在芯片允许范围内。限流电阻的计算不复杂。比如工作电压5VLED正向压降约2V想要每路电流5mA那么限流电阻就是5-2/0.005600欧。我实际用的是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这颗芯片的兼容性和稳定性有了更具体的认知。它不是为了性能极致而生的芯片但恰恰是这种务实的设计思路让它能在各种恶劣环境下稳定工作。说白了专用显示驱动芯片能帮你挡住绝大部分来自外部的干扰剩下的细节问题靠布线和软件配合就能吃得下。如果在做数显或者点阵类的产品建议按照上面的思路走一遍能绕开不少坑。
返回列表