常见的通信指示灯电路就是简单的把LED 连到TXD 和RXD 上,一有动静就闪一下。问题是,如果波特率很高,一次通信时间很短,相当于占空比很低,LED 闪烁的亮度就很弱,不容易观察。比如MODBUS 通信,波特率100k 以上时,不容易观察收发指示灯的状态。所以需求是:LED 每次被低电平触发点亮后,至少要保持10 毫秒。
按理说只需要加个简单的低通滤波电路就行了,但是串口通信一般空闲状态是高电平,所以通信指示灯应该用低电平触发,那就是说,得在低通滤波后面串联个PMOS 或者PNP 三极管来驱动LED。最后我选择加一个运放来驱动LED,理由:
- 用运放当作比较器很方便,容易调整电路参数;
- LM321、LM358 之类的普通运放最便宜几分钱就能买到,比很多MOS 管更廉价;
- 运放输入阻抗大,阈值电压可调,能用更小的电容实现滤波,小电容对通信线影响小;
其实这种地方用个几毛钱的单片机效果更好,电路也简单,还不占地方,就是单片机要编程,板子不能焊好直接用。
更新: 想到个效果更好、更简单的电路,用一个PNP 三极管加一个PMOS。
原理
输入低电平时,电容C1 经过PNP 三极管Q1 快速放电,同时Q2 导通,LED 点亮。输入高电平时,Q1 截止,C1 经过大电阻R2 慢速充电,直到电压升高到Q2 截止。按图中的参数,仿真可以检测到1us 的低电平脉冲,并维持LED 点亮10ms 以上。R4 只是为了仿真方便,实际电路中去掉。Q1 可以用MMBT3906T,Q2 可以用CJE3139K。
这个电路用大电阻和PNP 三极管把电容和串口数据线隔开,电容放电时瞬时大电流不经过串口数据线,对通信质量完全不会有副作用。
仿真
图里:
- 红色是输入的脉冲信号,代表串口数据线;
- 绿色是电容电压;
- 蓝色是LED 驱动电压;
原理 - 运放
左边的电容滤波原理和按键消抖差不多。当串口信号被拉低,电容C1 经过D1、R4 快速放电;运放同相端电压低于反相端,输出低电平,LED 点亮。当串口信号恢复高电平空闲状态,C1 经过R3 缓慢充电,在C1 电压升高到比反向端更高之前,运放输出保持低电平,LED 会继续点亮一段时间。
R4 用来限制电容的放电电流,因为瞬时电流太大可能影响通讯。D2 和R2 用来设置运放的阈值电压,用二极管D2 上拉,原因是我手头有封装很小的二极管,画PCB 比较舒适。
仿真 - 运放
用一个脉冲信号源代替串口信号,周期20ms,低电平维持1us。波特率很高时,低电平持续时间很短,如果电路检测不到低电平那就废了,所以用1us 的脉冲仿真测试,如果能检测到,说明这个电路理论上能支持1Mbps 的通信速率。
- 图中红色线是输入的脉冲信号;
- 蓝色是电容电压曲线;
- 绿色是运放输出电压;
- 粉色是电容放电电流;
可见,1us 低电平就足以把电容拉低,使运放输出转变到低电平。而电容的峰值放电电流如下图,也就四十几毫安,应该问题不大。输入信号拉高以后,运放输出电压能维持10ms 左右的低电平,满足设计需求。
不过这个电路还是有缺点的,如果通信频率很高,信号转入高电平空闲状态后,不到10ms 就又变成低电平了,那运放就会一直输出低电平,看起来LED 就一直亮着,闪都不闪。可以按需要调整C1、R3 的值,延长或缩短运放的保持时间。