
这篇接着上一篇往下聊。上一篇我们把光纤通信的基本盘过了一遍从损耗窗口到波分复用算是把“光通信”这个领域最骨干的部分搭起来了。这一篇我不打算继续在光纤上打转而是换个方向专门讲讲光通信里的另一条路线——空间光通信或者说再具体一点就是这两年热度一直很高的可见光通信以及它背后的硬件电路是怎么一回事。很多朋友一听“光通信”第一反应就是光纤、光模块、OTDR这些设备。但光通信这门学科其实分得很开一边是导波光学这条线也就是光在光纤里跑另一边是空间光通信光直接在空气里传播。可见光通信就是空间光通信里最贴近日常生活的一个分支它用我们身边最常见的LED灯作为信号源把数据调制到灯光上接收端再用光电探测器把光信号变回电信号。说白了就是用灯光来传数据。这篇“光通信领域基础——02”我打算把重点放在可见光通信的硬件电路上因为大多数人看资料都卡在原理上知道LED能发信号、知道光电二极管能收信号但真到了要搭一个能跑起来的最小系统时就不知道怎么选了。发射端怎么把高频信号叠到LED上接收端那个微弱的电流信号怎么变成能解调的数字波形这些都需要实打实的电路设计功底。这篇内容适合两类人看一类是通信工程专业的学生想从课本上的信道模型走进真实的电路实现另一类是电子爱好者手里有LED和光电二极管想自己搭一套可见光通信系统玩一玩但不知道从哪下手。这篇文章会把整个信号链路拆开讲从发射端到接收端把每一级电路的选型思路和实际参数都说清楚至少让你看完之后自己能动手画个原理图。1. 先搞清楚可见光通信的“通信模型”和光纤有什么不同1.1 信道差异决定了硬件设计的思路不同为什么可见光通信的硬件电路没法直接抄光纤通信的作业根本原因在于信道差异太大了。光纤通信里光在光纤这个封闭波导里传播外界干扰几乎进不来信号衰减也很有规律所以接收端的灵敏度可以做得非常高动不动就是-30dBm以下。但可见光通信不一样光在空气里传播不仅衰减大而且环境光太阳光、白炽灯、日光灯全是背景噪声信噪比天然就差好几个数量级。这个差异直接影响了电路设计的目标。在光纤通信里你主要关注的是带宽和灵敏度尽量把信号做得很快、很准但在可见光通信里你首先要考虑的是如何在一片强背景光里把微弱信号“抠”出来然后才谈得上带宽。这就是为什么可见光通信的接收端电路里隔直电容、高通滤波、自动增益控制这些电路出现的频率特别高——因为它们都是在跟背景光做斗争。还有一点很关键可见光通信是强度调制/直接检测系统也就是IM/DD。发送端用光的强弱变化来表示信息接收端直接检测光的强度转换成电流。这个模型比相干光通信简单很多不需要本振光、不需要90度混频器、不需要平衡探测器。所以整套硬件链路的复杂度跟光纤通信的相干接收机相比低了不少这反而是可见光通信更适合入门的地方。1.2 可见光通信的典型场景对电路提出的要求很多人觉得可见光通信就是“用台灯传文件”的玩具其实它的应用场景远不止这些。现在做得比较多的几个方向包括室内定位、水下通信、电磁敏感环境下的无线接入、车对车通信。这几个场景对硬件电路的要求各不相同但核心链路是一样的。室内定位用的是LED灯具要求的是低成本、易部署对带宽要求不高几百kbps就够用了但接收端必须能在室内混杂的灯光环境下稳定工作。水下通信对带宽和误码率要求更高海水的散射和吸收很严重需要专门选择合适的LED波长电路上要做很多均衡补偿。车对车通信最怕的就是环境光干扰太阳光对光电探测器的饱和效应是最头疼的问题之一这要求接收端电路有很强的动态范围和抗饱和能力。所以你在做可见光通信硬件电路的时候不能只盯着“能不能通”看还要考虑“在什么环境下通”。一个在实验室暗室里跑得很好的电路拿到太阳底下可能完全瘫痪。这种工程意识比单纯会画图重要得多。2. 可见光通信系统的信号链路拆解2.1 发射端链路从基带数字信号到LED光信号先看发射端。一个典型的可见光通信发射端信号链路是这么走的基带数字信号比如来自单片机的UART或者FPGA的LVDS引脚→ 驱动电路 → LED → 光信号出去。这里有个很多人第一次做会犯的错误直接把单片机的IO引脚接到LED上以为LED亮灭就是OOK调制了。IO引脚驱动能力确实能让LED亮灭但问题是速度上不去。普通单片机的IO翻转速率也就几MHz到几十MHz而且输出电流有限带不动大功率LED更不用说还要给LED加上一个合适的直流偏置点让它在高频下线性工作。所以发射端的核心是驱动电路它要解决两个问题第一提供足够的电流驱动能力让LED达到合适的光功率第二把基带信号叠加到LED的直流工作点上实现快速调制。常见方案有两种一种是分立元件搭的共源极或共射极放大电路另一种是专用的LED驱动芯片。分立方案的优点是便宜、灵活缺点是需要自己调偏置点和匹配网络专用驱动芯片省事但选择范围不大而且很多芯片并不是为高速调制设计的。如果你只是做个几十kbps的演示系统分立方案完全够了。但如果目标速率在1Mbps以上就要注意LED本身的高频特性了后面我会专门讲预加重电路是怎么回事。2.2 接收端链路从光信号到可处理的电信号接收端的链路比发射端复杂得多。整个链条是光信号 → 光电二极管 → 跨阻放大器TIA→ 后级放大/滤波 → 比较器或ADC → 数字信号。光电二极管把接收到的光功率转换成一个很小的电流信号这个电流通常在微安到毫安级别。关键点在于这个微弱电流信号必须经过一个跨阻放大器把这个电流转成电压信号。为什么要用跨阻放大器而不是普通的电压放大器因为光电二极管本质上是一个电流源它的输出阻抗很高如果你直接接到普通电压放大器的输入端信号会被电阻分压吃掉。跨阻放大器利用运放的虚地特性把输入电流全部引到反馈电阻上输出电压就等于输入电流乘以反馈电阻线性度很好而且输入端等效阻抗很低不容易受到光电二极管结电容的影响。跨阻放大器后面通常还要加一级后级放大和滤波把信号的幅度进一步抬到适合比较器或ADC的范围。如果是OOK调制可以直接用比较器把模拟信号转成数字方波如果是PPM或者OFDM这类复杂调制就需要ADC采样后做数字解调。篇幅有限这篇主要讲OOK链路的实现但原理是通用的。3. 可见光通信硬件电路设计实操搭一个能跑起来的最小系统3.1 发射端电路设计LED驱动拓扑与元件选型我直接用一个实际做过的方案来讲。假设目标是把UART信号通过LED传出去速率定在115200bps传输距离3米以内在白光LED上调制。第一步是选LED。普通照明用的白光LED带宽很低也就几百kHz就到了3dB衰减点但1Mbps以下的速率勉强能用因为UART信号本身的频谱不算高。如果想做得更稳可以用彩色的LED比如红色LED它的响应速度通常比白色荧光粉LED快很多因为白光LED的荧光粉余晖效应会拖慢响应速度。这就是为什么很多可见光通信实验都选红光LED的原因——不是因为红光好看起来专业而是因为物理上响应更快。驱动部分我用的方案是一个射极跟随器加一个偏置网络的组合。核心思想是LED工作在一个直流偏置电流上比如50mA信号通过晶体管在这个偏置电流上进行叠加调制。这样LED发出来的光强就是“直流成分交流信号”接收端可以通过高通滤波把直流背景去掉保留交流信号。具体的电路结构信号从基极输入经过三极管比如S8050或者2N2222射极输出LED串在集电极或者发射极上再给LED并联一个合适的RC网络来调整高频响应。基极要用电容耦合防止直流电平影响偏置点。我实测下来这个电路在115200bps下波形还算干净只是上升沿稍微慢了一点毕竟白光LED的余晖效应摆在那里。这里有个参数要算一下偏置电流决定了LED的静态工作点太小了信号摆幅放不开太大了LED功耗高且容易进入非线性区。白光LED的话我一般把静态电流选在LED额定电流的30%到50%之间。额定电流300mA的LED静态电流给50mA左右就够了。当然具体还要看你用的LED的I-V特性和光输出特性保险起见用示波器看波形调。3.2 接收端电路设计光电探测器加跨阻放大器电路要点接收端我用的方案是PIN光电二极管加跨阻放大器。PIN管选的是S2386这类普通可见光响应型光电二极管感光面积比较大灵敏度高价格也不贵。有人会用APD雪崩光电二极管增益高了很多但偏置电压要几十伏甚至上百伏而且温度漂移大不是很适合第一次做的人。建议从PIN管开始。跨阻放大器的运放选择是这整个电路里最关键的一步。需要考虑的参数包括增益带宽积GBW、输入偏置电流、输入电容、噪声电压密度。我自己的经验是做低速可见光通信几百kbps到几Mbps运放的GBW至少要在50MHz以上否则跨阻放大器的闭环带宽会很差信号全被衰减掉了。常用运放有OPA657、OPA380、AD8015这些前两个在实验室里比较常见。反馈电阻Rf的取值决定了增益。比如光电二极管的响应度是0.5A/W接收到的光功率是1微瓦那光电流就是0.5微安。如果反馈电阻取1MΩ输出电压就是0.5V这个幅度对后级来说已经够用了。反馈电阻越大增益越高但带宽会下降。原因很简单反馈电阻和运放输入电容、光电二极管结电容会形成一个极点频率越高衰减越厉害。反馈电容Cf是用来做相位补偿的防止电路自激。它的取值有一个经验公式Cf等于运放输入总电容除以2乘以pi乘以Rf乘以GBW再开方。这个公式的具体形式我记不太清了但思路是根据运放的GBW和反馈电阻算出需要补偿的极点位置然后反推Cf的大小。实际操作中我通常先估算一个值1pF到10pF之间然后上示波器看有没有自激振荡有就往大调没有就往小调调到方波不振荡、过冲最小为止。3.3 PCB布局与调试顺序别让小细节毁掉整块板子很多电路仿真跑得好好的一上实物就不工作90%的问题出在布局上。跨阻放大器这一级最害怕的是寄生电容和地环路噪声所以PCB布局时要把光电二极管和运放放得越近越好中间不要有过孔和长走线。反馈电阻也尽量靠近运放的反馈端反馈环路要短否则寄生电感会在高频时跟寄生电容形成谐振导致波形出现振铃。调试顺序我建议从后往前逐级验证先用信号发生器在接收端注入一个已知电流信号看看跨阻放大器输出对不对然后接上光电二极管用激光笔或者手机闪光灯对着照看有没有反应最后才把发射端拉开距离做无线传输测试。这样每一级的问题都能定位得清楚。还有个细节电源去耦电容一定要加而且要用多种容值并联比如10uF电解电容加0.1uF陶瓷电容。很多人忽略这个结果运放在高频段电源阻抗太大整个电路自激表现出来就是示波器上全是噪声还以为是天线收到干扰了。4. 常见问题与排查技巧实录4.1 接收灵敏度上不去先别急着换运放我见过很多同学做可见光通信接收距离不够第一反应是“增益不够换个更大的反馈电阻”。如果距离差一点点这招可能有效但如果差很多问题往往不在增益上而在信噪比上。反馈电阻加大信号是变大了但噪声也跟着变大而且噪声放大的比例可能比信号还多因为跨阻放大器的噪声主要是由反馈电阻的热噪声决定的电阻越大热噪声越大。正确的排查顺序是先用光电探测器加一个简单的光电转换电路配合万用表测一下在没有信号的时候环境光产生的光电流有多大。如果环境光电流已经远远大于信号电流那当务之急是减少环境光的干扰而不是加大增益。可以在光电二极管前加一个带通滤光片或者做一个光学透镜聚焦信号光这些光学层面的改进往往比电路层面的改动效果更明显。4.2 环境光带来的直流干扰怎么压下去环境光干扰最常用的处理办法是交流耦合也就是在跨阻放大器输出之后加一个高通滤波器把直流成分和低频的环境光变化滤掉。但这里有个坑如果环境光很强光电二极管会进入饱和状态此时不管你怎么做交流耦合都没用因为光电二极管的线性范围已经到了极限。这时候要么减少进光量加衰减片要么换一个感光面积更小的光电二极管要么用自动增益控制电路根据光电流大小动态调整增益。我做过一个比较实用的方案在光电二极管两端并联一个受控开关用单片机检测环境光电流的大小超过阈值就自动降低偏置或者调整放大倍数。这个方案不算复杂但能显著提高接收机在复杂光照环境下的稳定性。4.3 一个用得上的调试清单做可见光通信硬件调试我一般按下面的顺序走可以少走不少弯路确认LED和光电二极管的波长要匹配。如果LED是红光650nm光电二极管的峰值响应在960nm那接收效果会非常差别问我是怎么知道的。先近距离几厘米测试系统能不能通再逐渐拉远距离。近距离不行就查电路近距离行了远距离不行再查信号强度和信噪比。用示波器看发射端LED两端波形正常应该是一个高频信号叠加在直流电平上的样子。如果只有直流分量没有交流分量说明驱动电路没把信号加进去。接收端跨阻放大器输出正常应该是一个带有交流纹波的直流电平。如果波形完全是直的先检查光电二极管有没有加反偏电压光电二极管要反偏接法再检查是不是光根本就没照到管子上面。最后分享一个实战里比较管用的习惯每次调完一个版本把关键的电阻电容参数记录下来包括LED的型号、偏置电流、反馈电阻和补偿电容的取值以及对应的实测带宽和传输距离。这看起来像多此一举但当你需要复现一个之前调好的电路时这套记录能帮你省下好几个小时。我手里现在自己做可见光通信实验时也一直保持着这个习惯而且遇到问题的时候回头翻记录往往比从头分析来得更快。