Servo Motor Driver

High-level driver for servo motors.

int servo_init(servo_t * dev, pwm.h::pwm_t pwm, int pwm_channel, unsigned int min, unsigned int max)

Initialize a servo motor by assigning it a PWM device and channel.

Digital servos are controlled by regular pulses sent to them. The width of a pulse determines the position of the servo. A pulse width of 1.5ms puts the servo in the center position, a pulse width of about 1.0ms and about 2.0ms put the servo to the maximum angles. These values can however differ slightly from servo to servo, so the min and max values are parameterized in the init function.

The servo is initialized with default PWM values:

  • frequency: 100Hz (10ms interval)
  • resolution: 10000 (1000 steps per ms)

These default values can be changed by setting SERVO_RESOLUTION and SERVO_FREQUENCY macros. Caution: When initializing a servo, the PWM device will be reconfigured to new frequency/resolution values. It is however fine to use multiple servos with the same PWM device, just on different channels.

Parameters

dev:struct describing the servo
pwm:the PWM device the servo is connected to
pwm_channel:the PWM channel the servo is connected to
min:minimum pulse width (in the resolution range)
max:maximum pulse width (in the resolution range)

Return values

  • 0 on success
  • <0 on error
void servo_set(const servo_t * dev, unsigned int pos)

Set the servo motor to a specified position.

The position of the servo is specified in the pulse width that controls the servo. With default configurations, a value of 1500 means a pulse width of 1.5 ms, which is the center position on most servos.

In case pos is larger/smaller then the max/min values, pos will be set to these values.

Parameters

dev:the servo to set
pos:the position to set the servo (in the resolution range)

struct servo_t

Descriptor struct for a servo.

pwm.h::pwm_t device

the PWM device driving the servo

int channel

the channel the servo is connected to

unsigned int min

minimum pulse width, in us

unsigned int max

maximum pulse width, in us

unsigned int scale_nom

timing scale factor, to adjust for an inexact PWM frequency, nominator

unsigned int scale_den

timing scale factor, to adjust for an inexact PWM frequency, denominator