Linux PWM Driver via SysFS

Hi all,

I have finally cleaned up my PWM driver that uses the SysFS interface to drive RC motor controllers and servos.


  • Supports setting PWM duty or PPM compliant duty cycles.
  • Set PWM devices using a normalised float value (0 to 1).
  • PPM zero-points can be set to support reverse on RC motor controllers, allowing the duty to be set with a normalised float from -1.0 to 1.0.


When researching how I was going to interface with a PCA9685 board for a DIY RoboCar project, I found that a driver for that hardware exists in the Linux kernel.
This meant I was able to simply use the SysFS interface to configure that particular board, and any other PWM devices that kernel driver
support exists for (of which there is a a lot). This also includes Single Board Computers such as Raspberry Pi and Rock Pi, where
you can use the PWM port on the GPIO header.

A survey of the available ROS packages didn’t show many ROS 2 PWM packages, and none of those used the SysFS interface. So here is my package to solve this.


  1. Enable the kernel driver for the PWM hardware by configuring the Device Tree.
  2. Set up the udev rule so the PWM device’s SysFS interface can be written to from non-root users.
  3. Install/compile this package into your ROS2 install or workspace.
  4. Add the pwmdriver node to your launch scripts, or run the pwmdriver node, making sure to specify your configuration file.
  5. Publish the normalised float to the /pwm/<output name> topic, setting the duty cycle.
  6. Zoom around!