WPILib 2012
WPILibRoboticsLibraryforFRC
Public Types | Public Member Functions | Protected Member Functions | Protected Attributes | Static Protected Attributes | Friends
PWM Class Reference

#include <PWM.h>

Inheritance diagram for PWM:
SensorBase ErrorBase SafePWM Jaguar Servo Victor

List of all members.

Public Types

enum  PeriodMultiplier { kPeriodMultiplier_1X = 1, kPeriodMultiplier_2X = 2, kPeriodMultiplier_4X = 4 }

Public Member Functions

 PWM (UINT32 channel)
 PWM (UINT8 moduleNumber, UINT32 channel)
virtual ~PWM ()
virtual void SetRaw (UINT8 value)
virtual UINT8 GetRaw ()
void SetPeriodMultiplier (PeriodMultiplier mult)
void EnableDeadbandElimination (bool eliminateDeadband)
void SetBounds (INT32 max, INT32 deadbandMax, INT32 center, INT32 deadbandMin, INT32 min)
UINT32 GetChannel ()
UINT32 GetModuleNumber ()

Protected Member Functions

virtual void SetPosition (float pos)
virtual float GetPosition ()
virtual void SetSpeed (float speed)
virtual float GetSpeed ()

Protected Attributes

bool m_eliminateDeadband
INT32 m_maxPwm
INT32 m_deadbandMaxPwm
INT32 m_centerPwm
INT32 m_deadbandMinPwm
INT32 m_minPwm

Static Protected Attributes

static const UINT32 kDefaultPwmPeriod = 774
static const UINT32 kDefaultMinPwmHigh = 102
static const INT32 kPwmDisabled = 0

Friends

class DigitalModule

Detailed Description

Class implements the 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-255 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-255 values as follows:


Constructor & Destructor Documentation

PWM::PWM ( UINT32  channel) [explicit]

Allocate a PWM in the default module given a channel.

Using a default module allocate a PWM given the channel number. The default module is the first slot numerically in the cRIO chassis.

Parameters:
channelThe PWM channel on the digital module.
PWM::PWM ( UINT8  moduleNumber,
UINT32  channel 
)

Allocate a PWM given a module and channel. Allocate a PWM using a module and channel number.

Parameters:
moduleNumberThe digital module (1 or 2).
channelThe PWM channel on the digital module (1..10).
PWM::~PWM ( ) [virtual]

Free the PWM channel.

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


Member Function Documentation

void PWM::EnableDeadbandElimination ( bool  eliminateDeadband)

Optionally eliminate the deadband from a speed controller.

Parameters:
eliminateDeadbandIf 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.
float PWM::GetPosition ( ) [protected, virtual]

Get the PWM value in terms of a position.

This is intended to be used by servos.

Precondition:
SetMaxPositivePwm() called.
SetMinNegativePwm() called.
Returns:
The position the servo is set to between 0.0 and 1.0.
UINT8 PWM::GetRaw ( ) [virtual]

Get the PWM value directly from the hardware.

Read a raw value from a PWM channel.

Returns:
Raw PWM control value. Range: 0 - 255.
float PWM::GetSpeed ( ) [protected, virtual]

Get the PWM value in terms of speed.

This is intended to be used by speed controllers.

Precondition:
SetMaxPositivePwm() called.
SetMinPositivePwm() called.
SetMaxNegativePwm() called.
SetMinNegativePwm() called.
Returns:
The most recently set speed between -1.0 and 1.0.
void PWM::SetBounds ( INT32  max,
INT32  deadbandMax,
INT32  center,
INT32  deadbandMin,
INT32  min 
)

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

Parameters:
maxThe Minimum pwm value
deadbandMaxThe high end of the deadband range
centerThe center speed (off)
deadbandMinThe low end of the deadband range
minThe minimum pwm value
void PWM::SetPeriodMultiplier ( PeriodMultiplier  mult)

Slow down the PWM signal for old devices.

Parameters:
multThe period multiplier to apply to this channel
void PWM::SetPosition ( float  pos) [protected, virtual]

Set the PWM value based on a position.

This is intended to be used by servos.

Precondition:
SetMaxPositivePwm() called.
SetMinNegativePwm() called.
Parameters:
posThe position to set the servo between 0.0 and 1.0.
void PWM::SetRaw ( UINT8  value) [virtual]

Set the PWM value directly to the hardware.

Write a raw value to a PWM channel.

Parameters:
valueRaw PWM value. Range 0 - 255.
void PWM::SetSpeed ( float  speed) [protected, virtual]

Set the PWM value based on a speed.

This is intended to be used by speed controllers.

Precondition:
SetMaxPositivePwm() called.
SetMinPositivePwm() called.
SetCenterPwm() called.
SetMaxNegativePwm() called.
SetMinNegativePwm() called.
Parameters:
speedThe speed to set the speed controller between -1.0 and 1.0.

Reimplemented in SafePWM.


Member Data Documentation

const UINT32 PWM::kDefaultMinPwmHigh = 102 [static, protected]

kDefaultMinPwmHigh is "ticks" where each tick is 6.525us

  • There are 128 pwm values less than the center, so...
  • The minimum output pulse length is 1.5ms - 128 * 6.525us = 0.665ms
  • 0.665ms / 6.525us per tick = 102
const UINT32 PWM::kDefaultPwmPeriod = 774 [static, protected]

kDefaultPwmPeriod is "ticks" where each tick is 6.525us

  • 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.

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.

Set to 5.05 ms period / 6.525us clock = 774


The documentation for this class was generated from the following files:
 All Classes Functions Variables