常見的通信指示燈電路就是簡單的把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 的值,延長或縮短運放的保持時間。