class wpilib.PWM(channel)[source]

Bases: wpilib.LiveWindowSendable

Raw interface to PWM generation in the FPGA.

The values supplied as arguments for PWM outputs range from -1.0 to 1.0. They are mapped to the hardware dependent values, in this case 0-2000 for the FPGA. Changes are immediately sent to the FPGA, and the update occurs at the next FPGA cycle. There is no delay.

As of revision 0.1.10 of the FPGA, the FPGA interprets the 0-2000 values as follows:

  • 2000 = full “forward”
  • 1999 to 1001 = linear scaling from “full forward” to “center”
  • 1000 = center value
  • 999 to 2 = linear scaling from “center” to “full reverse”
  • 1 = minimum pulse width (currently .5ms)
  • 0 = disabled (i.e. PWM output is held low)

kDefaultPwmPeriod is the 1x period (5.05 ms). In hardware, the period scaling is implemented as an output squelch to get longer periods for old devices.

  • 20ms periods (50 Hz) are the “safest” setting in that this works for all devices
  • 20ms periods seem to be desirable for Vex Motors
  • 20ms periods are the specified period for HS-322HD servos, but work reliably down to 10.0 ms; starting at about 8.5ms, the servo sometimes hums and get hot; by 5.0ms the hum is nearly continuous
  • 10ms periods work well for Victor 884
  • 5ms periods allows higher update rates for Luminary Micro Jaguar speed controllers. Due to the shipping firmware on the Jaguar, we can’t run the update period less than 5.05 ms.

Allocate a PWM given a channel.

Parameters:channel (int) – The PWM channel number. 0-9 are on-board, 10-19 are on the MXP port
class PeriodMultiplier[source]

Bases: builtins.object

Represents the amount to multiply the minimum servo-pulse pwm period by.

k1X = 1
k2X = 2
k4X = 4

Optionally eliminate the deadband from a speed controller.

Parameters:eliminateDeadband (bool) – If True, set the motor curve on the Jaguar to eliminate the deadband in the middle of the range. Otherwise, keep the full range without modifying any values.[source]

Free the PWM channel.

Free the resource associated with the PWM channel and set the value to 0.


Gets the channel number associated with the PWM Object.

Returns:The channel number.
Return type:int

Get the scale for positions.


Get the scale for negative speeds.


Get the PWM value in terms of a position.

This is intended to be used by servos.


setBounds() must be called first.

Returns:The position the servo is set to between 0.0 and 1.0.
Return type:float

Get the scale for positive speeds.


Get the PWM value directly from the hardware.

Read a raw value from a PWM channel.

Returns:Raw PWM control value. Range: 0 - 255.
Return type:int

Get the PWM value in terms of speed.

This is intended to be used by speed controllers.


setBounds() must be called first.

Returns:The most recently set speed between -1.0 and 1.0.
Return type:float
PWM.kDefaultPwmCenter = 1.5

the PWM range center in ms

PWM.kDefaultPwmPeriod = 5.05

the default PWM period measured in ms.

PWM.kDefaultPwmStepsDown = 1000

the number of PWM steps below the centerpoint

PWM.kPwmDisabled = 0

the value to use to disable

PWM.setBounds(max, deadbandMax, center, deadbandMin, min)[source]

Set the bounds on the PWM pulse widths.

This sets the bounds on the PWM values for a particular type of controller. The values determine the upper and lower speeds as well as the deadband bracket.

  • max (float) – The max PWM pulse width in ms
  • deadbandMax (float) – The high end of the deadband range pulse width in ms
  • center (float) – The center (off) pulse width in ms
  • deadbandMin (float) – The low end of the deadband pulse width in ms
  • min (float) – The minimum pulse width in ms

Slow down the PWM signal for old devices.

Parameters:mult (PWM.PeriodMultiplier) – The period multiplier to apply to this channel

Set the PWM value based on a position.

This is intended to be used by servos.


setBounds() must be called first.

Parameters:pos (float) – The position to set the servo between 0.0 and 1.0.

Set the PWM value directly to the hardware.

Write a raw value to a PWM channel.

Parameters:value (int) – Raw PWM value. Range 0 - 255.

Set the PWM value based on a speed.

This is intended to be used by speed controllers.


setBounds() must be called first.

Parameters:speed (float) – The speed to set the speed controller between -1.0 and 1.0.