Practical Robotics Modular Robot Library

Dependents:   ModularRobot

motors.cpp

Committer:
jah128
Date:
2017-01-13
Revision:
6:732aa91eb555
Parent:
5:6da8daaeb9f7

File content as of revision 6:732aa91eb555:

#include "robot.h"

DigitalOut nsleep(p7);
DigitalIn nfault_l(p8,PullUp);
DigitalIn nfault_r(p11,PullUp);
AnalogIn motor_vprop_l(p19);
AnalogIn motor_vprop_r(p20);
PwmOut enable_l(p21);
PwmOut enable_r(p22);
DigitalOut hb1_l(p23);
DigitalOut hb1_r(p24);
DigitalOut hb2_l(p29);
DigitalOut hb2_r(p30);
float left_motor_speed = 0;
float right_motor_speed = 0;
int motor_pwm_period = 0;

float Motors::get_left_motor_speed()
{
    return left_motor_speed;
}

float Motors::get_right_motor_speed()
{
    return right_motor_speed;
}

void Motors::forwards(float speed)
{
    set_left_motor_speed(speed);
    set_right_motor_speed(speed);
}

void Motors::backwards(float speed)
{
    set_left_motor_speed(-speed);
    set_right_motor_speed(-speed);
}

void Motors::turn(float speed)
{
    set_left_motor_speed(speed);
    set_right_motor_speed(-speed);
}

float Motors::get_current_left()
{
    float current = motor_vprop_l.read();
    //Vprop = 5x voltage on sense pins - sense pins have 0.25 ohm resistance - current is 0.8 actual voltage measured [or 2.64 x scaled value]
    return current * 2.64f;
}

float Motors::get_current_right()
{
    float current = motor_vprop_r.read();
    return current * 2.64f;
}

float Motors::get_adjusted_speed(float speed_in)
{
    float ret_speed = speed_in;
    if(USE_STALL_OFFSET == 1) {
        ret_speed += STALL_OFFSET;
        ret_speed /= (STALL_OFFSET + 1.0f);
    }
    return ret_speed;
}

void Motors::sleep()
{
    nsleep = 0;
    left_motor_speed = 0;
    right_motor_speed = 0;
}

void Motors::wake_up()
{
    nsleep = 1;
}

void Motors::coast_left()
{
    enable_l = 0;
    left_motor_speed = 0;
}

void Motors::brake_left()
{
    hb1_l = 1;
    hb2_l = 1;
    enable_l = 1;
    left_motor_speed = 0;
}

void Motors::set_left_motor_speed(float speed)
{
    if(speed == 0) {
        left_motor_speed = 0;
        enable_l = 0;
    } else {
        if(speed < 0) {
            hb1_l = 1;
            hb2_l = 0;
            left_motor_speed = -get_adjusted_speed(-speed);
            enable_l = -left_motor_speed;
        } else {
            hb1_l = 0;
            hb2_l = 1;
            left_motor_speed = get_adjusted_speed(speed);
            enable_l = left_motor_speed;
        }
    }
}

void Motors::coast_right()
{
    enable_r = 0;
    right_motor_speed = 0;
}

void Motors::brake_right()
{
    hb1_r = 1;
    hb2_r = 1;
    enable_r = 1;
    right_motor_speed = 0;
}

void Motors::coast()
{
    coast_left();
    coast_right();
}

void Motors::brake()
{
    brake_left();
    brake_right();
}

void Motors::set_right_motor_speed(float speed)
{
    if(speed == 0) {
        right_motor_speed = 0;
        enable_r = 0;
    } else {
        if(speed < 0) {
            hb1_r = 1;
            hb2_r = 0;
            right_motor_speed = -get_adjusted_speed(-speed);
            enable_r = -right_motor_speed;
        } else {
            hb1_r = 0;
            hb2_r = 1;
            right_motor_speed = get_adjusted_speed(speed);
            enable_r = right_motor_speed;
        }
    }
}

void Motors::set_pwm_period(int period_in)
{
    motor_pwm_period = period_in;
    enable_l.period_us(motor_pwm_period);
    enable_r.period_us(motor_pwm_period);
}

void Motors::init()
{
    if(motor_pwm_period == 0) motor_pwm_period = MOTOR_PWM_PERIOD_US;
    enable_l.period_us(motor_pwm_period);
    enable_r.period_us(motor_pwm_period);
    enable_l = 0;
    enable_r = 0;
    wake_up();
}