ARTICLE DETAIL

资讯详情

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

基于光耦的LED张弛振荡电路:免单片机实现隔离闪烁

基于光耦的LED张弛振荡电路:免单片机实现隔离闪烁 1. 从LED闪一下到光耦自己振起来这个项目的来龙去脉去年年底接了个小活客户要在几台设备的操作面板上装一排隔离指示灯要求是灯自己会闪不能带单片机不能写代码坏了换一个就行。最开始我图省事想着用一颗成品闪烁LED串个电阻就完了结果对方一句要隔离把我打回去了——面板侧和主板侧不能共地这就要求发光的部分和被驱动的部分之间必须有电气隔离。也就是从那时候起我把目光从闪烁IC挪到了光耦身上最后折腾出了一个挺有意思的东西基于光耦的LED振荡电路。说白了这个电路的输入侧和输出侧之间没有任何电连接靠光来传能量和信号同时它不需要任何有源振荡芯片一颗光耦加几个电阻电容就能自激振荡输出侧的LED规律地亮灭。它能干的事其实很朴素做隔离型闪烁指示灯、做低成本的信号源、做多路级联的流水灯单元甚至当成一个看门狗式的方波发生器。适合谁看适合手里有烙铁、会看电阻色环、但又不想上单片机的朋友也适合正在学张弛振荡电路和光耦隔离电路的电子爱好者。基础差一点也没关系我会把每个参数为什么这么取值讲透你照着抄作业就能点亮。需要先说明一点本文里所有电路都是我自己搭过、测过的常规做法涉及到具体型号时我会给出典型值但不同批次光耦的**CTR电流传输比**差异不小最后几个电阻的取值你可能要按实测微调这是这类电路最真实的一面。2. 动手前先把光耦吃透不懂这几个参数电路一定调不出来2.1 光耦内部其实就两只器件在干活很多人第一次拿到PC817这种四脚光耦会一头雾水1、2、3、4脚到底谁是谁。其实内部结构非常简单——一只红外发光二极管LED加一只光敏三极管中间隔着一层透明绝缘胶。1脚是内部LED的阳极2脚是阴极3脚是光敏三极管的发射极4脚是集电极。给你电流从1脚流向2脚内部那颗红外LED就亮红外光穿过绝缘层打到光敏三极管基区三极管就导通4脚和3脚之间导通。整个过程中1、2脚和3、4脚之间没有一根导线连着这就是隔离两个字的物理来源。理解这一点非常关键因为后面我做的所有振荡电路本质上都是围绕什么时候让1脚有电流、什么时候断掉来做文章。你完全可以把光耦看成一个用光传信的开关输入端给电输出端就通输入端断电输出端就断。它的速度不算快PC817的上升下降时间在微秒级但对我们这种几赫兹到几十千赫兹的闪烁应用绰绰有余。顺带提一句光耦还有一个容易被忽略的方向不少型号的输入LED旁边会反向并联一只保护二极管用来扛反压。如果你在电路里给它加了反向电压没有这只二极管的型号很容易被打穿这是新手特别容易踩的坑后面我会细说。2.2 CTR、Vf、Vce(sat)这三个数字决定了你能不能点亮LED**CTRCurrent Transfer Ratio电流传输比**是最重要的一个参数它的定义是输出侧三极管集电极电流 ÷ 输入侧LED正向电流单位是百分比。PC817常见的分档是50%到600%不等。这意味着什么打个比方你给输入LED灌1mA输出三极管最多能流出CTR×1mA的电流。如果你选的批次CTR只有50%那1mA进、0.5mA出想驱动一个要2mA才能亮得明显的LED就费劲了反过来如果你拿的是CTR 300%的批次同样的输入电流能驱动更亮的输出但电路也更容易过灵敏、更容易乱振。**Vf正向压降**指的是内部红外LED导通时两端的电压典型值在1.0V到1.4V之间比常见的红色可见LED约1.8V低不少。这个数值直接决定了我们那个阈值触发的翻转点取值差0.2V频率可能差百分之十几。**Vce(sat)饱和压降**则是输出三极管完全导通时4脚到3脚的残余电压PC817大约在0.1V到0.2V。这个小电压在做正反馈计算时不能忽略否则你算出来的拉低到多少伏会和实测对不上。提示买光耦时如果只写PC817不写档位通常拿到的是CTR较宽的范围做振荡电路时最好一次多买几颗用同一批次的或者干脆买带CTR分档标识的比如PC817B、PC817C一致性会好很多。2.3 PC817、TLP117、MOC3052、TL431光耦反馈它们各管一摊市面上光耦型号一大堆很多人一上来就挑花眼。我按实际用途给你分个类PC817是最通用的晶体管输出光耦四脚直插便宜、好买做本文的振荡电路首选TLP117也是晶体管输出但多为贴片封装、体积小参数相近做小板子时用它注意它的引脚排列和PC817可能不同焊之前一定查TLP117光耦引脚图确认方向。MOC3052属于可控硅驱动光耦内部输出不是三极管而是光控可控硅专门用来触发外部大功率可控硅也就是热词里说的moc3052光耦触发可控硅电路输出侧能扛交流高压、能做相位控制。它不适合我们这种低压直流闪灯但如果你想做一个交流侧跟随闪烁的隔离触发器它就是对口的料。TL431配光耦是开关电源里经典的反馈组合TL431当基准和误差放大器光耦把误差信号隔离开传回一次侧它的重点在精密稳压隔离反馈跟闪烁振荡是两码事但底层思想相通——都是用光耦把两侧隔开。理解了闪烁振荡再去看TL431光耦反馈电路你会发现很多细节是一脉相承的。3. 单光耦张弛振荡器一颗光耦加两个元件就能自激3.1 核心思路让电容充电到阈值再靠正反馈把它拉回去张弛振荡器这个词听着玄其实就是电容慢慢充电充到某个电压触发一次动作再快速放电循环往复。我在光耦上实现它的思路特别直接让一颗电容通过大电阻从电源慢慢充电电容上端接光耦内部LED的阳极当电容电压爬到内部LED的导通阈值时红外LED突然有电流输出侧三极管导通这时候我用一个小小的反馈电阻把输出端的低电平拉回到电容上端让电容电压瞬间塌下去LED灭掉三极管截止电容重新开始充电。如此循环输出侧就出现了有节奏的通断。为什么用正反馈而不用比较器因为比较器要额外供电、要基准成本立刻上去。正反馈妙就妙在它让翻转变得干脆一旦触发起振电容电压被迅速拉低避免了在阈值附近来回抖动导致的半亮不亮。代价是频率会随电源电压和温度有一点漂移但对于指示灯这种应用完全够用。具体的连接是电源经限流电阻R1给节点A充电电容C1并在A与地之间光耦的1脚接A、2脚接地输出侧4脚经反馈电阻R2回到节点A3脚接地。当光耦三极管导通时4脚被拉到接近0VR2就把节点A往下拽电容被迫放电输入LED熄灭。这里R2的取值很有讲究太大反馈无力、电路容易停振太小则会把节点A死死摁住、同样振不起来经验值在2k到10k之间。3.2 参数怎么算把频率和占空比捏在手里充电过程可以套用RC充电公式来估算。设电源电压VCC阈值电压Vth约等于光耦内部LED的Vf1.2V左右充电时间 t -R1 × C1 × ln(1 − Vth / VCC)。代入 VCC5V、Vth1.2V得到 t ≈ 0.27 × R1 × C1放电时间很短可以忽略所以周期基本就是充电时间。我一般用下面这个小脚本快速试算不同组合import math def period(rc_r, c1, vcc5.0, vth1.2): # rc_r 单位欧姆, c1 单位法拉 t_charge -rc_r * c1 * math.log(1 - vth / vcc) return t_charge, 1 / t_charge for r, c in [(100e3, 33e-6), (100e3, 22e-6), (220e3, 10e-6), (470e3, 4.7e-6)]: t, f period(r, c) print(fR{r/1e3:.0f}k C{c*1e6:.0f}uF 周期{t:.3f}s 频率{f:.2f}Hz)跑出来的结果100k配33uF大约是0.9秒的周期也就是每秒闪一下多一点看起来不刺眼、很舒服。如果你想要更快的闪烁减小R1或者C1即可比如100k配10uF大约是3Hz密得像心跳。这里有个反直觉的点电容并不是越大越好因为电容本身有漏电流漏电流大的电解电容会让充不上去直接导致停振所以小容值优先选钽电容或CBB大容值就用品质好一点的电解。3.3 面包板实测第一次点亮时的几个细节焊接之前我强烈建议先上面包板验证。实测时要注意三件事第一电解电容有极性正极接节点A、负极接地接反了不仅容值大幅缩水还容易鼓包第二光耦的1、2脚千万别接反接反了内部LED反向截止电路永远不起振而且我前面提过没有反压保护二极管的型号还可能被打坏第三如果你拿万用表去量节点A的电压会发现它在一个低值和1.2V之间来回跳用示波器看就是个不太规整的锯齿波这是完全正常的。实测下来单光耦方案的优点是极简——一颗光耦、两个电阻、一个电容总共不到五毛钱缺点也很明显节点A的电压摆幅只有1V出头从接近0V到1.2V这个幅度既不够直接驱动可见LED也不够驱动后级逻辑。所以我一般把它当成一个光信号源输出侧想点灯的话后面得补一级三极管做缓冲和放大。这也是为什么我更推荐下一种方案——双光耦交叉耦合它能直接在输出侧点灯而且波形是对称方波。4. 双光耦交叉耦合振荡器对称方波直接输出点灯4.1 拓扑来源把晶体管多谐振荡器翻译成光耦版如果你学过经典的无稳态多谐振荡器会发现它就是两个三极管交叉耦合Q1的集电极经电容耦合到Q2的基极Q2的集电极再经电容耦合回Q1的基极两边轮流导通输出对称方波。我这套双光耦电路的思路完全是照搬这个拓扑只不过把三极管的基极-发射极换成了光耦的输入LED把三极管的集电极换成了光耦的输出三极管集电极。具体接法是光耦U1的输入LED阳极经基极电阻Rb1接正电源、阴极接地同时U1输出侧4脚经Rc1接正电源、3脚接地U2这边完全对称。关键在于交叉耦合电容U2的输出4脚经C2接到U1的输入阳极节点B1U1的输出4脚经C1接到U2的输入阳极节点B2。这样一来U1导通会让它的4脚拉低通过C1把U2的输入节点拉下去逼U2截止U2截止后它的4脚升到高电平又通过C2把U1的输入维持在高位。然后耦合电容通过基极电阻缓慢充电把被拉低的节点一点点抬起来抬到LED阈值时再次翻转。因为两边对称所以输出是一个占空比接近50%的方波频率公式是 f ≈ 1 / (1.4 × Rb × C)。我通常取Rb47k、C10uF算下来半周期约0.32秒一个完整周期约0.65秒也就是大约1.5Hz的闪烁肉眼看着很从容。想调快就把Rb或C减小想调慢就增大规律很清晰。4.2 接线细节电容极性、限流和输出LED的位置这个电路比单光耦版本元件多了一倍但接错的风险也翻倍我把几个关键点单独拎出来说。耦合电容的极性因为节点在振荡过程中会出现负电压电容一端被拉低、另一端电压来不及变化就会出现瞬时负压所以建议用无极性电容比如CBB或钽电容如果非要用有极性的电解电容正极朝基极电阻那一侧、负极朝光耦输出4脚那一侧接反了轻则容量异常、重则漏液。限流电阻Rc它接在正电源和输出4脚之间既决定输出三极管导通时的电流也决定4脚上升沿的速度典型取1k到4.7k。取值太小光耦输出管的电流大、发热明显取值太大4脚上升变慢翻转不够干脆我一般用2.2k。输出LED的接法最直观的是把可见LED和限流电阻串在U1的4脚与地之间这样U1导通4脚低时LED灭、U1截止4脚高时LED亮闪烁效果一目了然。不过要注意4脚同时还挂着耦合电容C1加负载前最好串一个几百欧的隔离电阻避免输出负载干扰耦合时序。我实际搭的时候就是让两颗输出LED分别挂在两个光耦的4脚上接成你亮我灭的交替效果视觉上非常有意思做双色指示灯特别合适。4.3 频率与占空比的微调经验对称结构下频率固定是1/(1.4RC)但如果你想做非对称闪烁比如亮短灭长只要让两边的Rb或C不一样就行。实测中发现一个规律哪边的RC乘积大哪边的截止时间长、对应的输出LED就更暗得久。利用这一点可以做呼吸灯般的效果虽然做不到真正的PWM渐变但做快闪-慢闪的节奏对比足够了。另一个实测心得是起振时间和耦合电容关系密切。电容越大开机后第一次翻转来得越晚有时候要等一两秒才看到灯开始闪这是正常的不是坏了。如果等了五六秒都不振那多半是某个节点没接对或者光耦方向焊反了这时候把两个耦合电容先换成小容值比如1uF缩短起振时间最容易快速定位问题。5. 调试现场这些坑我几乎每次都会踩到5.1 不起振先查这六件事相位不对、方向接反是新手最容易犯的错。写到这里我把常见的不起振原因整成一串排查顺序实测按这个顺序走九成问题能揪出来。光耦的输入到底有没有正向电流反馈电阻选得对不对电容极性有没有搞错电源是不是带不动输出侧的限流电阻是不是太大接地有没有虚焊最后还有一类特别隐蔽的光耦内部那颗LED的反向保护二极管如果你不小心给输入加了个反向偏置普通型号会直接不工作甚至永久损坏。还有一个非常容易被忽略的点是环境光干扰。虽然PC817内部有黑色封装遮光但如果你的电路板整体暴露在强光下、且光耦封装有破损外来的光会直接打到光敏三极管上造成额外导通电路就乱了。做实验时把板子放在弱光环境下能排除很多玄学故障。5.2 频率对不上、占空比偏怎么调很多人算出来是1Hz实测却是0.7Hz甚至0.5Hz差了将近一倍。原因主要有两个一是阈值电压不是理想值实际Vf会随温度和电流变化比纸面值高或低零点几伏直接导致充电时间偏移二是电解电容的实际容值偏差大标称33uF的电解电容实测可能只有25uF甚至更低。解决办法很简单先用电容表量一下实际容值再按实测值重新算电阻一般就能把频率拉回来。占空比偏则是另一种情况。双光耦对称电路如果两边参数不一致就会出现一边亮得久一边亮得短。这时候把两边的Rb、C都换成同一批次的元件或者干脆用同一颗电容的型号偏差立刻小很多。我自己习惯一次买十颗同型号电容挑出容值最接近的两颗配对用虽然有点麻烦但一致性确实好。5.3 温度漂移与CTR衰减长期运行的隐患光耦有一个绕不开的短板——CTR会随时间和温度衰减。新光耦用半年后CTR可能下降百分之十几用几年后衰减更明显温度升高时LED效率下降、三极管增益变化都会让振荡频率和阈值漂移。对于指示灯这种应用漂移几个赫兹根本看不出来但如果你要拿它当信号源就得注意了。缓解办法有几条一是把工作电流设在推荐值的中间偏下让LED长期工作在轻载状态衰减会慢二是给电路加个简单的稳压供电避免电源电压波动放大漂移三是在反馈回路里用金属膜电阻代替碳膜电阻温漂小一个量级。我在一台连续运行三个月的设备上实测最开始是1.5Hz的闪烁三个月后大概变成了1.3Hz肉眼几乎看不出差别。所以对这个应用我给出的结论是放心用但别拿它做精密时钟。5.4 常见问题速查表现象可能原因排查/解决方向完全不起振光耦1、2脚接反 / 反馈电阻开路用万用表二极管档测内部LED方向更换反馈电阻闪一下就停电解电容漏电大 / 供电不稳换钽电容或CBB加滤波电容频率偏高实际容值偏小 / 阈值偏低用电容表实测重新选R或C频率偏低反馈电阻偏大 / CTR偏低减小R或C换CTR档位更高的光耦输出LED常亮输出三极管未截止 / 负载太轻检查耦合电容、加大输出限流输出LED常灭限流电阻过大 / 输出管没导通减小Rc确认光耦输出方向开机要等几秒才闪耦合电容过大减小耦合电容或提高供电电压交替闪但不规律两边元件不配对 / 温漂换同批次元件远离热源6. 玩法扩展从闪一下到隔离驱动整套负载6.1 用它去驱动继电器、PMOS做真正的隔离开关振荡电路只是开始真正好玩的是拿它做隔离驱动。热词里提到的光耦控制继电器电路、光耦驱动PMOS做高端开关其实都能接到这个振荡器后面。思路是把振荡器输出侧的方波经过一级三极管放大后去驱动继电器的线圈或者去驱动一个PMOS的栅极。因为整个驱动链路前段是光耦隔开的被控的高压、大电流回路和你的控制侧可以完全不共地这在工控和家电改造里非常实用。需要提醒的是驱动继电器时一定要在线圈两端并一只续流二极管不然断电瞬间的反向电动势很容易把你前面的三极管或光耦打坏。驱动PMOS做高端开关时栅极要加合适的驱动电阻和下拉电阻确保光耦输出断开时PMOS能可靠关断这一条是很多人第一次做高端开关会翻车的地方。6.2 借TL431光耦反馈的思路做个简易闭环如果你想玩得更深入可以借鉴TL431加光耦的反馈结构用TL431做基准和误差比较让它在某个电压点翻转再用光耦把这个翻转信号隔离传出去。把这套结构和上面的振荡器一结合就能做出一个电压到位才开始闪、电压不够就不闪的隔离报警器。虽然这已经不是纯粹的振荡电路了但思路是相通的——都是用光耦当隔离的桥梁只不过一个传的是振荡节奏另一个传的是误差方向。6.3 多路级联做流水灯最后分享一个我觉得最好玩的扩展把多路振荡器级联。每一路用一个双光耦振荡器频率稍微错开比如第一路1.0Hz、第二路1.3Hz、第三路1.6Hz把它们的输出LED依次摆成一排。由于频率差形成了拍频看上去就会产生光点沿着一排灯流动的错觉其实每一颗灯都是独立振荡的根本没有单片机在控制。这种用参数差异制造节奏感的做法是我个人最喜欢的低成本创意玩法做展板和氛围灯非常出彩。每次调这个电路我最大的体会是别一上来就追求完美波形。光耦振荡本来就是带点粗糙感的电路它的价值不在于精度而在于用最少的元件实现隔离自激这两件事。你把Rs、Cs捏在手里的那种感觉比对着示波器调一天参数要踏实得多。真要做精密的东西还是老老实实上时基芯片或者单片机但如果你只是想给面板加个会呼吸的小灯那我拍了这么多版本下来最推荐的仍然是那颗不起眼的PC817加两个RC——便宜、皮实、坏了自己就能换。
返回列表