Andrew Russell / Servo

Dependents:   JS_1motor_20170707_ok Task_1_BallRidingbot_KeepingStationCatching_layingDown_1230 Task_2_BallRidingbot_MovingForwardCatching_backward_1230 testSSWMR_StationKeeping_200170830_OK ... more

Committer:
andrewrussell
Date:
Fri Feb 15 04:13:20 2013 +0000
Revision:
0:e50cd1696bca
Child:
1:c1b2ec2662fd
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
andrewrussell 0:e50cd1696bca 1 #include "Servo.h"
andrewrussell 0:e50cd1696bca 2 #include "mbed.h"
andrewrussell 0:e50cd1696bca 3
andrewrussell 0:e50cd1696bca 4 /**
andrewrussell 0:e50cd1696bca 5 * Servo constructor
andrewrussell 0:e50cd1696bca 6 *
andrewrussell 0:e50cd1696bca 7 * Initialize variables, attach to a PWM-enabled pin.
andrewrussell 0:e50cd1696bca 8 */
andrewrussell 0:e50cd1696bca 9 Servo::Servo(PinName pwm32) : _pwm(pwm32) {
andrewrussell 0:e50cd1696bca 10 _period = 0;
andrewrussell 0:e50cd1696bca 11 _min = 0;
andrewrussell 0:e50cd1696bca 12 _max = 0;
andrewrussell 0:e50cd1696bca 13 _pos = 0;
andrewrussell 0:e50cd1696bca 14 invert = 0;
andrewrussell 0:e50cd1696bca 15 }
andrewrussell 0:e50cd1696bca 16
andrewrussell 0:e50cd1696bca 17 /**
andrewrussell 0:e50cd1696bca 18 * float read
andrewrussell 0:e50cd1696bca 19 *
andrewrussell 0:e50cd1696bca 20 * Read the value shat should be at the servo.
andrewrussell 0:e50cd1696bca 21 */
andrewrussell 0:e50cd1696bca 22 float Servo::read(void) {
andrewrussell 0:e50cd1696bca 23 return _pos;
andrewrussell 0:e50cd1696bca 24 }
andrewrussell 0:e50cd1696bca 25
andrewrussell 0:e50cd1696bca 26 /**
andrewrussell 0:e50cd1696bca 27 * void write
andrewrussell 0:e50cd1696bca 28 *
andrewrussell 0:e50cd1696bca 29 * Write a value to the servo
andrewrussell 0:e50cd1696bca 30 *
andrewrussell 0:e50cd1696bca 31 * @param float to Positional data taking values of 0.0 to 1.0.
andrewrussell 0:e50cd1696bca 32 */
andrewrussell 0:e50cd1696bca 33 void Servo::write(float to) {
andrewrussell 0:e50cd1696bca 34 if(to < 0 || to > 1) return;
andrewrussell 0:e50cd1696bca 35 float dest_pw;
andrewrussell 0:e50cd1696bca 36 if(invert == 0) {
andrewrussell 0:e50cd1696bca 37 dest_pw = to * _slope + _min;
andrewrussell 0:e50cd1696bca 38 }
andrewrussell 0:e50cd1696bca 39 else if(invert == 1) {
andrewrussell 0:e50cd1696bca 40 dest_pw = to * -_slope + _max;
andrewrussell 0:e50cd1696bca 41 }
andrewrussell 0:e50cd1696bca 42 else { return; }
andrewrussell 0:e50cd1696bca 43 _pwm.pulsewidth(dest_pw);
andrewrussell 0:e50cd1696bca 44 }
andrewrussell 0:e50cd1696bca 45
andrewrussell 0:e50cd1696bca 46 /**
andrewrussell 0:e50cd1696bca 47 * void calibrate
andrewrussell 0:e50cd1696bca 48 *
andrewrussell 0:e50cd1696bca 49 * Set the limits of the PWM.
andrewrussell 0:e50cd1696bca 50 *
andrewrussell 0:e50cd1696bca 51 * @param float period Pulse period
andrewrussell 0:e50cd1696bca 52 * @param float max Maximum pulse width
andrewrussell 0:e50cd1696bca 53 * @param float min Minimum pulse width
andrewrussell 0:e50cd1696bca 54 */
andrewrussell 0:e50cd1696bca 55 void Servo::calibrate(float period, float max, float min) {
andrewrussell 0:e50cd1696bca 56 _period = period;
andrewrussell 0:e50cd1696bca 57 _min = min;
andrewrussell 0:e50cd1696bca 58 _max = max;
andrewrussell 0:e50cd1696bca 59 _slope = max - min;
andrewrussell 0:e50cd1696bca 60
andrewrussell 0:e50cd1696bca 61 _pwm.period(_period);
andrewrussell 0:e50cd1696bca 62 }