These H-Bridge modules have an issue with FET shoot-through at high (but <100%) duty cycles. The observations indicate it needs at least 2.9µs low signal before turning on again.
100% duty cycle again is fine too, since there’s no continuous switching happening which could cause repeated shoot-through, destroying the FET. It’s the area between zero off-time and 2.9µs off-time that is killing the FETs.
With the default Arduino analogWrite() producing 8-bit resolution PWM at 490-1000Hz you’ll probably be fine, as this will never result in an off-time between 0µs and 2.9µs:
- analogWrite(254) which is (254/255)=99.6% duty cycle results in 4-8µs of off-time at 490-1000Hz.
- analogWrite(255) which is 100% duty cycle results in 0 off-time.
It’s only when using higher PWM frequencies and/or resolutions you’ll discover there’s something wrong.
Debugging log:
High-Side FET Q2 keeps failing with short-circuit after a couple minutes of operation, connected to a 6S Lipo and MY1016 motor and 16 kHz PWM. There’s no visible damage, the FETs barely get warm before the 25A BMS shuts down.
Added 100nF snubber caps to motor leads, motor terminals and power rail, to rule out this is a U_ds dv/dt failure mode of the FET. No success, Q2 failed again.
Seller-Listing specifies 0-99% duty cycle PWM is allowed, but „easy test circuit“ clearly uses +5V as a control signal aka 100% PWM, so I ignored that.
Limiting PWM duty cycle to 98% to comply with seller listing caused the PCB trace to burn instead of the FET failing, indicating a „slower“ fault.
Measuring output voltage with a DMM without load starts behaving erradically at 95.4% duty cycle. The output voltage decreases when increasing the duty cycle beyond that and approaches 12V, which is about half of the input voltage. (1/16000)s * (100-95.4)% = 2.9µs.
Limiting PWM to 95% duty cycle (3.1µs off-time) solved the issue.
I didn’t investigate yet why this issue exists. The board uses L6384 Half-Bridge drivers, which should ensure there’s proper dead time to prevent a shoot-through condition, over the full range of 0-100% duty cycles. My board has a 270K resistor for setting the dead time, which should result in 2.7-3.1µs according to the L6384 datasheet. The IRF3205 is plenty fast for that, so there shouldn’t be an issue. Even if the L6384 was non-genuine and didn’t add proper dead-time, that wouldn’t explain why the module only misbehaves at high duty cycles. It seems like an unlikely coincidence that the module starts misbehaving at 2.9µs, which is exactly the expected set dead-time of the FET driver…
The given 99% figure in the seller listing is sufficient when the default Arduino PWM frequencies (490-1000Hz) are used, as this results in 10-20µs off time. But then it should also state that you can only use PWM frequencies <3kHz @ 99% duty cycle.
Edit: Issues with 100% duty cycle might also arise from using a bootstrap circuit to control the High-Side FETs, but on this board there is a boost converter that supplies a continuous voltage ~10V above the high power rail, so that’s not the issue here. 100% duty cycle (fully on) works fine.