I have two PCB that I designed and they are made by a PCB manufacturer (so they are identical). They use a MAX485CSA to communicate but suddenly one of them is drawing too much current, on a normal operation the circuit draws around 5mA and now It's drawing 73mA from my bench power supply (I get the reading from the power supply display). I know that the culprit is the 485 transceiver because if I disable the sender pin and enable the receiver (both pins are tied together as you can see in the schematic so this is how it works) the current drops again to normal levels (5mA), I've also noticed:
- When transmitting: channel A is 2.84V when high state while in B channel is 4.54V when high state. In the healthy PCB, both are around 4.5-5V when high state.
- When not transmitting: channel A is 2.84V (when it should be 4.5-5V) and channel B is 0V as it should be.
- If the circuit is connected to the power supply powered ON with its output OFF A and B are connected to the receiver (in this case the receiver is an Arduino using a MAX485CPA, same setup as the sender circuit), the receiver gets an endless train of garbage (random 0s and 255s), this doesn't happen with the healthy sender.
- If the circuit is connected to the power supply powered OFF or is not connected to the power supply at all I don't get any garbage.
Things that solved the garbage problem under any circumstance: joining the circuit's common ground with the power supply's ground (Earth), joining both sender and receiver GNDs, adding pull-up and pull-down resistors to channels A, B at the receiver's end.
Note that even with the voltage levels being wrong I can get the data right if I turn on the circuit before the receiver (so the receiver's buffer won't get filled with garbage)
I'm pretty sure that if I replace the MAX485 on the sender the problem will be gone but I'd like to know what's going on and how can I protect the transceiver to prevent this from happening again before I send the circuit to repair.
I attach below the part of the schematic that shows how the transceiver is connected if you wonder about termination and pull-up pull-down resistors:
I'm sending data through a very short distance, like 5-10 meters and low bitrate (9600bps) so I've not added termination resistors, plus a termination resistor would draw additional current.
- I have played around a lot with 485 transceivers in very messy setups like breadboards and such and I've never needed pull-up/pull-down resistors so that's why I have not added them to the design.
I'm going to keep common ground as Jeroen suggested but there's still something bothering me. I've been checking the receiver's side controlled by the Arduino and I noticed a transient in the non-inverting channel when the Arduino's USB is plugged-in (being USB the only PS), it stays at 4V for like 3 seconds, then it drops to 288mV. The signal also goes up and down some millivolts as I plug-unplug other USB devices and the monitor. This 4V to 288mV transient is causing current spikes in the sender's end of the same magnitude as I'm experiencing now continuously in the defective circuit ¿someone knows what does this mean?
The 485 transceiver was damaged after all, It has been replaced and the problem with the excessive current is gone and voltage levels in the output are right this time. I'm also not getting garbage from the powered off circuit,with or without common ground.
Reasons for this to happen remain unkwnon even though there are some potential culprits:
- Not keeping common-mode within spec due to the lack of common ground as Jeroen pointed out.
- Max485 transceiver failure after frequent transients from the receiver's end when connecting/disconnecting the USB cable which caused current spikes on the circuit.
For now I'll be performing tests on the circuit using common ground and see how it performs. I'm also powering the Arduino from the power jack so I won't get those ominous transients each time I plug in the USB cable.