Tweaking PWM output period for dimming LEDs

Hi all, I’m working on an LED driver circuit and wanted to run this by y’all.

The circuit I’m building is a simple TIP120 transistor based amplifier, which I intend to be connected to PWM outputs on the RoboRIO, with the pulsed output effectively modulating the duty cycle of the LEDs.

The snag I’m running into relates to PWM duty cycles. Ideally, I’d like 0% to be an output of 0vdc, and 100% to be a constant output of 6vdc. 50% would then be 6vdc pulsed at say 1ms on, 1ms off. From my understanding the default PWM signal is a 1-2ms pulse every 20 seconds, which translates to a 5-10% duty cycle. I see references in the WPILib API’s PWM class to varying the PWM period potentially down to 5.05ms, and pulses as small as .5ms (which should get me ~10-40%), but does anyone know if it is possible to manipulate the PWM output further? I’m also open to other suggestions such as an efficient way to pulse a DIO pin in the necessary manner.

Disclaimer: I’ve read the API docs, but I haven’t dug into the actual code. I also haven’t yet resorted to just tinkering with things and seeing what I get with an oscilloscope.

The PWM signal sent from the roboRIO is a Hobby PWM signal, slightly different from a typical duty cycle. I would use a digital pin and create my own function to adjust the duty cycle.

Would the analog outputs on the MXP be an option?

I’ve previously used PWM.setRaw() to set the duty cycle of PWM channels for driving LEDs, where setRaw(0) is 0% duty cycle and setRaw(255) is 100%.

1 Like

My team had to do the same thing; there are functions to get a DIO pin to output a PWM signal of a user specified frequency. We did it using LabVIEW, but it should work in a similar way using Java or C++. If you just need to open the DIO pin as normal, you can use the Gen PWM VI to set your duty cycle. There is an additional VI abbreviated Config PWM Rate where you can actually change the frequency of the signal for the DIO pin.

I was also able to find documentation for the Java DigitalOutput class here: . There are setPWMRate(), enablePWM() and updateDutyCycle() methods to control the PWM functionality for a specific DIO pin. The API should have more details on how to implement them.


How many LED’s are you trying to drive? If you are driving multiple LED’s, are they connected in series? How many are connected in series?

Thanks guys, I’m taking a look at those methods now.

As for the number of LEDs, its one of the ubiquitous RGB LED strips. If you’re working toward the usual warning about current draw on the PWM pins, I’m quite aware, hence the transistor amp.