Motor driver library for the AP1017.

/media/uploads/tkstreet/akm_name_logo.png

AKM Development Platform

AP1017 Motor Driver

Import libraryAP1017

Motor driver library for the AP1017.

AP1017.cpp

Committer:
tkstreet
Date:
2017-04-14
Revision:
0:a0435a630c5d
Child:
1:4d4c77589134

File content as of revision 0:a0435a630c5d:

#include "AP1017.h"

/******************** Constructors & Destructors ****************************/

// Default constructor
AP1017::AP1017(void) : motorOn(false), dutyCycle(0.50), pwmPeriod_us(200),
                        motor(ENABLE_PIN), inA(INPUTA_PIN), inB(INPUTB_PIN)
{
    freq_hz = 0.000001/pwmPeriod_us;            // Derive frequency
    pulseWidth_us = dutyCycle * pwmPeriod_us;   // Derive pulse width
    stopMotor();                                // Keep motor off
}

// Default destructor
AP1017::~AP1017(void)
{
    stopMotor();
    
    if(ap1017)
        delete ap1017;
}

/*********************** Member Functions ***********************************/

AP1017::Status AP1017::setDirection(char dir)
{

    switch(dir){
        case DIRECTION_CW:
            if(motorOn == true && dir == DIRECTION_CCW)
                return ERROR_MOTORON;
            inA.write(1);
            inB.write(0);
            motorOn = true;
            break;
        case DIRECTION_CCW:
            if(motorOn == true && dir == DIRECTION_CW)
                return ERROR_MOTORON;
            inA.write(0);
            inB.write(1);
            motorOn = true;
            break;
        case DIRECTION_BRAKE:
            inA.write(1);
            inB.write(1);
            motorOn = true;
            break;
        case DIRECTION_COAST:
            inA.write(0);
            inB.write(0);
            motorOn = false;
            break;
        default:
            return ERROR_DIRECTION;
    }

    return SUCCESS;
}

AP1017::Status AP1017::setDutyCycle(float dc)
{
    if((dutyCycle <= 1.00) && (dutyCycle >= 0.0)){
        dutyCycle = dc;

        pulseWidth_us = dutyCycle * pwmPeriod_us; // Override pulse width

        if(motorOn == true){
            motor.write(dutyCycle);          // If motor is on, keep it on
        }

    }
    else{
        dutyCycle = 0.0;
        pulseWidth_us = 0.0;

        return ERROR_DUTY_CYCLE;
    }

    return SUCCESS;
}


AP1017::Status AP1017::setFrequency(float freq)
{
    if(freq > MAX_FREQUENCY){
        return ERROR_FREQUENCY;
    }

    freq_hz = freq;
    pwmPeriod_us = (1/freq)/0.000001;        // Calculate the period

    return SUCCESS;
}


AP1017::Status AP1017::setPeriod_us(float per)
{
    if(per < 0){
        return ERROR_PERIOD;
    }

    pwmPeriod_us = per;

    freq_hz = 1/(per * 0.000001);   // Calculate the frequency

    if(motorOn == true){                // If motor on, keep it on
        motor.period_us(pwmPeriod_us);
    }

    return SUCCESS;
}


 AP1017::Status AP1017::setPulseWidth_us(float pw)
 {
     if((pw <= 0.0) || (pw > pwmPeriod_us)){
         return ERROR_PULSEWIDTH;
     }

     dutyCycle = pw/pwmPeriod_us;     // Override duty cycle
     pulseWidth_us = pw;

     return SUCCESS;
 }


AP1017::Status AP1017::startMotor(void)
{
    motor.period_us(pwmPeriod_us);          // Set the period
    motor.pulsewidth_us(pulseWidth_us);     // Set the pulse width
    motor.write(dutyCycle);                 // Set duty cycle, start motor
    motorOn = true;                         // Set ON flag

    return SUCCESS;
}


AP1017::Status AP1017::stopMotor(void)
{
    motor.write(0.0);                       // turn motor off (duty cycle saved)
    motorOn = false;                        // Set OFF flag

    return SUCCESS;
}

AP1017::Status  AP1017::brakeMotor(void)
{
    setDirection(DIRECTION_BRAKE);
    return SUCCESS;
}

AP1017::Status  AP1017::coastMotor(void)
{
    setDirection(DIRECTION_COAST);
    return SUCCESS;
}