New version of quadcopter software written to OO principles

Dependencies:   mbed MODSERIAL filter mbed-rtos ConfigFile PID PPM FreeIMU_external_magnetometer TinyGPS

FlightController/MotorMixer/MotorMixer.cpp

Committer:
joe4465
Date:
2015-05-08
Revision:
4:9ffbf9101992
Parent:
2:969dfa4f2436

File content as of revision 4:9ffbf9101992:

#include "MotorMixer.h"

MotorMixer::MotorMixer(PinName motor1, PinName motor2, PinName motor3, PinName motor4)
{   
    _motorPower = MotorPower();
    
    _motor1 = new PwmOut(motor1);
    _motor2 = new PwmOut(motor2);
    _motor3 = new PwmOut(motor3);
    _motor4 = new PwmOut(motor4);
    
    //Set period
    double period = 1.0 / FLIGHT_CONTROLLER_FREQUENCY;
    _motor1->period(period);
    _motor2->period(period);
    _motor3->period(period);
    _motor4->period(period);
    
    //Disable
    setPower(MOTORS_OFF);
    
    DEBUG("Motor power initialised\r\n");  
}

MotorMixer::~MotorMixer(){}

void MotorMixer::computePower(PidWrapper::PidOutput pidOutput, double throttle)
{    
    //Calculate base power to apply from throttle - returns 1060 at min, 1860 at max
    double basePower = MOTORS_MIN + (throttle * 800);
    
    MotorPower motorPower = MotorPower();
    
    //Map motor power - each PID returns -100 <-> 100
    motorPower.motor1 = basePower + pidOutput.pitch + pidOutput.roll + pidOutput.yaw;
    motorPower.motor2 = basePower + pidOutput.pitch - pidOutput.roll - pidOutput.yaw;
    motorPower.motor3 = basePower - pidOutput.pitch - pidOutput.roll + pidOutput.yaw;
    motorPower.motor4 = basePower - pidOutput.pitch + pidOutput.roll - pidOutput.yaw;
    
    //Specify intial motor power limits
    double motorFix = 0;
    double motorMin = motorPower.motor1;
    double motorMax = motorPower.motor1;
    
    //Check motor power is within limits - if not add/remove constant to all motors to keep motor ratio the same
    if(motorPower.motor1 < motorMin) motorMin = motorPower.motor1;
    if(motorPower.motor1 > motorMax) motorMax = motorPower.motor1;
    if(motorPower.motor2 < motorMin) motorMin = motorPower.motor2;
    if(motorPower.motor2 > motorMax) motorMax = motorPower.motor2;
    if(motorPower.motor3 < motorMin) motorMin = motorPower.motor3;
    if(motorPower.motor3 > motorMax) motorMax = motorPower.motor3;
    if(motorPower.motor4 < motorMin) motorMin = motorPower.motor4;
    if(motorPower.motor4 > motorMax) motorMax = motorPower.motor4;
        
    //Check if min or max is outside of the limits
    if(motorMin < MOTORS_MIN) motorFix = MOTORS_MIN - motorMin;
    else if(motorMax > MOTORS_MAX) motorFix = MOTORS_MAX - motorMax;
    
    //Add/remove constant
    motorPower.motor1 += motorFix;
    motorPower.motor2 += motorFix;
    motorPower.motor3 += motorFix;
    motorPower.motor4 += motorFix;
    
    //Set motor power
    setPower(motorPower);
}

void MotorMixer::computePower(double throttle)
{    
    //Calculate base power to apply from throttle - returns 1060 at min, 1860 at max
    double basePower = MOTORS_MIN + (throttle * 800);
    
    MotorPower motorPower = MotorPower();
    motorPower.motor1 = basePower;
    motorPower.motor2 = basePower;
    motorPower.motor3 = basePower;
    motorPower.motor4 = basePower;
    
    //Set motor power
    setPower(motorPower);
}

void MotorMixer::setPower(double motor1Power, double motor2Power, double motor3Power, double motor4Power)
{
    _motorPower.motor1 = motor1Power;
    _motorPower.motor2 = motor2Power;
    _motorPower.motor3 = motor3Power;
    _motorPower.motor4 = motor4Power;
    
    #ifdef MOTORS_ENABLED
        _motor1->pulsewidth_us(motor1Power);
        _motor2->pulsewidth_us(motor2Power);
        _motor3->pulsewidth_us(motor3Power);
        _motor4->pulsewidth_us(motor4Power);
    #endif
}

void MotorMixer::setPower(double motorPower)
{
    setPower(motorPower, motorPower, motorPower, motorPower);
}

void MotorMixer::setPower(MotorMixer::MotorPower motorPower)
{
    setPower(motorPower.motor1, motorPower.motor2, motorPower.motor3, motorPower.motor4);
}

MotorMixer::MotorPower MotorMixer::getMotorPower()
{
    return _motorPower;
}