This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TPS929160-Q1: Current limitation

Part Number: TPS929160-Q1

Tool/software:

Hi!

I'm using two TPS929160 on a new board to drive 32 LEDs (1 per channel). The LEDs have a nominal forward voltage of 3,1V @ 120mA but I don't need to use them at their full power, 100mA would be OK!

Everything seems to be working just fine, I imported and adapted the EVM code to work on a PIC18F and I can run the different patterns that are on the original EVM code.

But I'm having a problem with the maximum driven current. The maximum I had until now was around 20mA per channel.

Even if I drive only one LED that is the maximum I get. The LED attached to ERR pin keeps turned off everytime (but it works, I've seen it in the past).

I already tried using different voltages (12V and 5V) on Vsupply and Vbat, nothing different besides heat dissipation.

I changed the FSx configuration and got the same result.

I'm using R(ref) = 6K32 and getting V(ref) = 1,235V. VLDO is 5V.

Do you have other ideas that I may look for?

I'm leaving in attach a piece of code that I am using and that is basically imported from the EVM code.

Thanks in advance for your attention.

BR

    // Calculate and store the CRC of data from 0x00 to 0xFF
    crcInitial();
    
    // When CAN is not used, the read offset is always 0. When CAN is used, it depends on the number of transmitted bytes.
    if(CAN_USED == FALSE) {
        read_offset = 0;
    }
    
    // Unlock device
    clearLockAll(BROADCAST);
    
    // Clear POR, FAULT for device
    setClr(BROADCAST, CLRFAULT | CLRPOR);
    
    // Check if ACKEN is set
    for(dev_idx = 0; dev_idx < DEVICE_CNT; dev_idx++) {
        FlexRead(device_address[dev_idx], FLEXWIRE0, DATA_LENGTH__1, TRUE);
        if(ledRcvBuffer[read_offset] & ACKEN_1) {
            ackEnabled[device_address[dev_idx]] = TRUE;
        }
        else {
            ackEnabled[device_address[dev_idx]] = FALSE;
        }
    }
      
	//     ***Disable all channels for device - this is reset value of register, but ensure for restart of program
	disableAllCh(BROADCAST);

	// Set PWMFREQ = 2000Hz
	// Can set PWM frequency as broadcast which will overwrite all other settings in same register
	setPWMfreq(BROADCAST, PWMFREQ__2K0);


	// Need to set REFRANGE per device to retain existing setting - PWM frequency and REFRANGE are for TPS92912x in the same register
	// Set REFRANGE = 512
	for(dev_idx = 0; dev_idx < DEVICE_CNT; dev_idx++) {
		setRefRange(device_address[dev_idx], REFRANGE__512);
	}

	//***Set DC for all Channels - actually this is the reset value in EEPROM
	regValue[0] = IOUT__MAX;
	setIOUTAllCh(BROADCAST, &regValue[0], TRUE);

	//***Set PWMOUT for all Channels - PWM high is reset value in EEPROM and PWM low is reset from register
	regValue[0] = PWM__1;
	setPWMAllCh(BROADCAST, &regValue[0], TRUE);
	setPWMhighAllCh(BROADCAST, &regValue[0], TRUE);

	// Set Single-LED-Short threshold and Low Supply Threshold - Settings are for EVMs
	setSLSth(BROADCAST, SLSTH0__2V50, 0);
	setSLSth(BROADCAST, SLSTH1__2V50, 1);

	// Need to set SLSEN and LowSupplyTh per device to retain existing setting - REFRANGE is for TPS929160/240 in the same register
	for(dev_idx = 0; dev_idx < DEVICE_CNT; dev_idx++) {
		setLowSupplyTh(device_address[dev_idx], LOWSUPTH__4V);
		enableSLS(device_address[dev_idx]);
	}

	// Clear FAULT for device because low supply threshold was just set
	setClr(BROADCAST, CLRFAULT);

	// Enable diagnostics for all channels - actually this is the reset value in EEPROM
	enableDiagAllCh(BROADCAST);
    
    //Assign LED Drivers to the correct LED according to the model and color of the LEDs
    if(model == MODEL_REAR)
    {
        blinker_dev_idx = LED_DRIVER_1_IDX;
        otherFunc_dev_idx = LED_DRIVER_2_IDX;
        blinker_limit = BLINKER_NLED_REAR-1;
    }
    else //if MODEL_HEAD
    {
        blinker_dev_idx = LED_DRIVER_2_IDX;
        otherFunc_dev_idx = LED_DRIVER_1_IDX;
        blinker_limit = BLINKER_NLED_HEAD-1;
    }
            
	//Turn off all LEDs
    enableAllCh(device_address[blinker_dev_idx]); 
    for(ch_idx = 15; ch_idx >= 0; ch_idx--)
    {
        regValue[0] = PWM__0;
        setPWMoneCh(device_address[blinker_dev_idx], regValue, device_LED_idx[ch_idx]);
    }
	
	//Enabling one LED only
    regValue[0] = PWM__1;
    setPWMoneCh(device_address[blinker_dev_idx], regValue, 8);

  • Hi Miguel,

    Are you using the EVM board or your own design? could you share the full schematic?

    I am trying to understanding your issue, what's your desired current configuration? what're your operating conditions when you have this issue, like Vin, Vout, dimming? and please provide the waveforms of VIN, Vout, Iout and ERR. 

    This device is a linear LED driver which means the thermal is important for this device, could you read the values of FLAG_ERR and FLAG_STATUS to see if a fault is triggered? Many thanks!

  • Dear Hailee,

    Thank you for your questions.

    I'm using my own design. In attach, I'm sharing somes pieces of the schematic, an image to demonstrate the pads and the thermal pad (there is plenty of area for dissipation) and the waveforms.

    TPS1_VLED, TPS2_VLED, TPS1_VBAT and TPS2_VBAT are now set to 5VDC. But I already tested with 12VDC.

    Regarding the waveforms, I only have a 2-channel non-isolated USB oscilloscope... so, this is what you get in the waveform images attached:

    - Blue signal is always ERR;

    - Trigger is set for ERR (falling edge);

    - Red signal is VLED, ILED, 5V and 12V on the different images;

    - Duty-cycle is set for 50%;

    - ILED is very bad due to the fact that when I measure the current on the terminals of a 1R1 resistor in series with the LED with the oscilloscope, the LED turns off (probably due to the fact that this oscilloscope is not isolated).

    - Only one LED is turned on for this tests.

    For now, I still can't read FLAG_ERR and FLAG_STATUS but I'm working on it. But I can't see ERR signal going down...

    Any ideas with this information?

    Thank you for your time!

    7416.attachments.zip

  • Hi Miguel,

    Could you measure the current via the current probe? if you don't have the current probe, an easy way to measure the current is that you can use a resistor to replace the LED load. For example, if your output current is 100mA, you can use the resistor of 30ohm or 60ohm (the power rating of resistors should be paid attention). 

    Do you mean when you did the test, the VBAT and SUPPLY pins are set to 5V?

    From your code, the PWM frequency is set to2kHz, is it correct? but from the waveform, it seems like the device is running 400Hz PWM signal if the time unit is 5ms/div. please help check it.

    One small question, have you programmed the EEPROM value before? I am wondering if this device runs into the fail-safe mode otherwise the PWM setting or current setting won't be changed. If you could read the internal register value, that would be very helpful. thanks!

  • Hi!

    1 - I measured the current before. It is the image "20250225_BLUE-ERR+RED-ILED_DC50.png". I did explain on the last post: "ILED is very bad due to the fact that when I measure the current on the terminals of a 1R1 resistor in series with the LED with the oscilloscope, the LED turns off (probably due to the fact that this oscilloscope is not isolated)."

    2 - When I ran the test, VBAT and VSUPPLY are set to 5V.

    3 - When I captured this images, I was running the tests at 400Hz because I was trying different frequencies.

    4 - I did not program the EEPROM, at least intentionally. But, if it was in fail-safe mode, would it run the patterns that you have in your EVM code as examples? I am able to run the code in Patterns.c and I see all the 32 LEDs turning on and off and dimming up and down. Would it be possible if it is in fail-safe mode?

    Thanks!

  • Let me add more info. I've an ammeter in series with the LED and I get 12mA at full power.

    When I execute the two lines of code below, I get 6mA.

    regValue[0] = IOUT__MAX/2;
    setIOUTAllCh(device_address[otherFunc_dev_idx], &regValue[0], TRUE); 

    If I execute the two lines of code below after the ones above, I get 3mA .

    regValue[0] = PWM__1/2;
    setPWMoneCh(device_address[otherFunc_dev_idx], regValue, 10);

    So, the device is responding to my requests but the maximum current is just not as high as I need.

  • Notice the STATUS byte (FLAG_ERR register) after the master packet:

    Reading FLAG_SLS2:

    Bits FLAG_ERR, FLAG_OUT and FLAG_SLSOUTF0 are high.

    OUTF0 is the output that I'm driving right now, it is correct.

    I believe the problem is here, now I will try to discover how to solve it.

  • Hi Miguel,

    Thanks for your feedback,

    "I've an ammeter in series with the LED and I get 12mA at full power." when you did this current measurement, were you running the PWM dimming? it's supposed to be average current, please use 100% duty cycle.

    For SLS flag, from your code, the SLSTH1 and SLSTH0 are set to 2.5V, correct? you can monitor the output voltage to see if the fault is triggered, or please Clear fault flag with CLRFAULT to see if the fault still exists.

    If you can change the output current via commands, could you help check two registers, - IOUTXn and REFERENCE? the actual output current will be affected by REFRANGE, IOUTx and R(REF), please read the value for your current setting. and you can try to change the value to see to verify the change of the output current. Thanks!