PT4121EE23F LED DRIVER

Thread Starter

minte_7

Joined May 19, 2023
11
Hello,

I have assembled an LED driver design (based on the PT4121E IC) powered at 48V from an IRM-60-48 source on a breadboard. Each driver controls a different branch of LEDs. The driver I am using for testing controls a branch of 8 UVA 395nm LEDs (G3535N1UVS8U06 395NM), which are located on a second PCB. The purpose of the driver is to receive a PWM signal from an Arduino, in my case at 500Hz, which allows me to regulate the LEDs from 0 to 100%. The circuit adjusts the branch current to about 666mA using a 0.3 ohm resistor. Attached are the schematics for both the driver and the LED branch.

I am experiencing problems when controlling the LEDs. I have managed to get the LEDs to dim correctly for a short time, but then they fail and start to flicker. I have seen in a test that changing the MOSFET (I am using an SI2308A, SOT-23) solved the problem momentarily, so I assume that it ends up failing. I have also seen that the driver IC gets very hot, reaching almost 100ºC, which is not a good sign.

I would appreciate any possible ideas or solutions.

Code:


const int pwmPin = 4; // Pin GPIO del ESP32-S3 conectado a UVA2 (Pin DIM)
const int pwmFreq = 500; // Frecuencia PWM de 2 kHz
const int pwmResolution = 8; // Resolución de 8 bits (valores de 0 a 255)
const int pwmChannel = 0; // Canal PWM virtual

void setup() {
// Inicializamos el puerto serie a 115200 baudios
Serial.begin(115200);

// Damos tiempo a que se abra el monitor serie
delay(1000);
Serial.println("\n--- TEST MANUAL DRIVER PT4121E ---");
Serial.println("Escribe un porcentaje (0 a 100) y presiona Enter:");

// 1. Configuramos el canal PWM
ledcSetup(pwmChannel, pwmFreq, pwmResolution);

// 2. Asociamos el canal al pin
ledcAttachPin(pwmPin, pwmChannel);

// Apagamos los LEDs por seguridad al iniciar
setDimming(0);
}

void loop() {
// Comprobamos si has escrito algo en el Monitor Serie
if (Serial.available() > 0) {

// Leemos el número que has escrito
float porcentajeDeseado = Serial.parseFloat();

// Limpiamos el "Enter" (\n o \r) que se queda en el buffer
while(Serial.available() > 0) {
Serial.read();
}

// Mostramos confirmación en pantalla
Serial.print("Ajustando brillo al: ");
Serial.print(porcentajeDeseado);
Serial.println("%");

// Aplicamos el nuevo brillo
setDimming(porcentajeDeseado);
}
}

// =================================================================
// Función auxiliar para controlar la rama LED por porcentaje
// =================================================================
void setDimming(float percentage) {
// Limitar los valores para no volver loco al PWM
if (percentage < 0.0) percentage = 0.0;
if (percentage > 100.0) percentage = 100.0;

// Mapear el porcentaje (0-100) al ciclo de trabajo (0-255)
int dutyCycle = (int)((percentage / 100.0) * 255.0);

// Mandar la señal al driver
ledcWrite(pwmChannel, dutyCycle);
}
 

Attachments

Thread Starter

minte_7

Joined May 19, 2023
11
Hi everyone! Even though there were no replies to this thread, I finally managed to find the root cause of all the issues. I wanted to document the solution here just in case someone else runs into the same problems while designing a high-frequency step-down LED driver in the future.

It turns out there were three overlapping issues:

1. PWM duty cycle stalling (capped at ~25%):

This wasn't a software issue, but pure physics and lack of voltage headroom. When trying to push 700mA, the dynamic resistance of the 8 UVA LEDs caused the total forward voltage drop to exceed the input I was providing from my bench power supply (32V). By increasing the input voltage to 36V/48V, the driver finally had enough headroom to push the current, and the PWM control scaled perfectly up to 100%.

2. Noise and instability:

Since the LEDs are located on a secondary PCB, the wires were acting as an antenna. We fixed this by adding a ceramic capacitor (MLCC) of a few µF across the output (LED+ and LED-), placed as close as possible to the inductor and the sense resistor. It acted as a filter and completely stabilized the driver's control loop.

3. Extreme overheating (MOSFET at 100ºC and Driver shutting down):

The original MOSFET (SI2308A in a SOT-23 package) was thermally insufficient to dissipate the switching losses, and its 60V Vds rating was way too risky for a 48V bus. Furthermore, its Total Gate Charge (Qg), combined with the extremely high switching frequency, forced the internal LDO/Vreg of the PT4121E chip to dissipate way too much power, triggering its thermal shutdown.

The Final Solution (Updated BOM):

  • MOSFETs: Upgraded to a power SMD package (DPAK / TO-252) with a generous copper polygon on the PCB for heat dissipation. Key components chosen: FQD13N10LTM or IRLR110PbF. They are 100V rated, true Logic-Level (guaranteed RDS(on) at 5V), and have a tiny gate charge (Qg < 10nC). The driver IC no longer struggles to switch them.
  • Inductors: We recalculated the inductor values to drop the switching frequency down to a relaxed 200 - 300 kHz range, drastically reducing MOSFET switching losses. We will be using shielded power inductors: 390 µH for the 500mA/700mA branches, and 1.5 mH for the 100mA branch.

With these changes, the circuit is 100% stable, the PWM control is perfectly linear, and the temperatures remain completely cool. I hope documenting this journey acts as a shortcut for someone else in the future!
 
Top