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.

Committer:
tkstreet
Date:
Fri May 19 23:09:27 2017 +0000
Revision:
9:1ca7d16de1c4
Parent:
8:bc70a421ef4c
Child:
10:16d45e3f4be3
Transferred DigitalOut and I2C definitions to control class to make AP1017 class more generic.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tkstreet 0:a0435a630c5d 1 #include "AP1017.h"
tkstreet 4:c36159701cde 2 #include "debug.h"
tkstreet 0:a0435a630c5d 3
tkstreet 0:a0435a630c5d 4 /******************** Constructors & Destructors ****************************/
tkstreet 0:a0435a630c5d 5
tkstreet 0:a0435a630c5d 6 // Default constructor
tkstreet 9:1ca7d16de1c4 7 AP1017::AP1017(DigitalOut* A, DigitalOut* B, I2C* M) : motorOn(false), dutyCycle(0.0)
tkstreet 0:a0435a630c5d 8 {
tkstreet 9:1ca7d16de1c4 9 i2cMotor = M;
tkstreet 9:1ca7d16de1c4 10 inA = A;
tkstreet 9:1ca7d16de1c4 11 inB = B;
tkstreet 9:1ca7d16de1c4 12
tkstreet 6:d4d3bc82d446 13 // Instantiate TCA9554A
tkstreet 6:d4d3bc82d446 14 motor = new TCA9554A(i2cMotor, TCA9554A::SLAVE_ADDRESS_38H); // 38H->Port 0->RSV
tkstreet 6:d4d3bc82d446 15
tkstreet 6:d4d3bc82d446 16 // Initialize RSV as output
tkstreet 6:d4d3bc82d446 17 if (motor->configurePort(TCA9554A::PORT_0, TCA9554A::DIR_OUTPUT)!= TCA9554A::SUCCESS) {
tkstreet 6:d4d3bc82d446 18 MSG("#AP1017: Error configuring TCA9554A port.\r\n");
tkstreet 6:d4d3bc82d446 19 }
tkstreet 6:d4d3bc82d446 20 motor->setPortLevel(TCA9554A::PORT_0, TCA9554A::LOW); // Turn motor off
tkstreet 0:a0435a630c5d 21 }
tkstreet 0:a0435a630c5d 22
tkstreet 0:a0435a630c5d 23 // Default destructor
tkstreet 0:a0435a630c5d 24 AP1017::~AP1017(void)
tkstreet 0:a0435a630c5d 25 {
tkstreet 3:f8e70f639ed0 26 stop();
tkstreet 6:d4d3bc82d446 27 delete inA, inB, motor, i2cMotor;
tkstreet 0:a0435a630c5d 28 }
tkstreet 0:a0435a630c5d 29
tkstreet 0:a0435a630c5d 30 /*********************** Member Functions ***********************************/
tkstreet 0:a0435a630c5d 31
tkstreet 4:c36159701cde 32 AP1017::Status AP1017::setDirection(AP1017::Rotation dir)
tkstreet 0:a0435a630c5d 33 {
tkstreet 3:f8e70f639ed0 34 direction = dir;
tkstreet 4:c36159701cde 35
tkstreet 3:f8e70f639ed0 36 switch(direction){
tkstreet 4:c36159701cde 37 case DIRECTION_CW: // direction = 0x00
tkstreet 4:c36159701cde 38 if(isMotorOn())
tkstreet 4:c36159701cde 39 {
tkstreet 4:c36159701cde 40 MSG("#AP1017.cpp: Error. Cannot change direction while motor is running.\r\n");
tkstreet 0:a0435a630c5d 41 return ERROR_MOTORON;
tkstreet 4:c36159701cde 42 }else
tkstreet 4:c36159701cde 43 {
tkstreet 4:c36159701cde 44 inA->write(1);
tkstreet 4:c36159701cde 45 inB->write(0);
tkstreet 4:c36159701cde 46 MSG("#AP1017.cpp: Direction: CCW\r\n");
tkstreet 4:c36159701cde 47 }
tkstreet 0:a0435a630c5d 48 break;
tkstreet 4:c36159701cde 49 case DIRECTION_CCW: // direction = 0x01
tkstreet 4:c36159701cde 50 if(isMotorOn())
tkstreet 4:c36159701cde 51 {
tkstreet 4:c36159701cde 52 MSG("#AP1017.cpp: Error. Cannot change direction while motor is running.\r\n");
tkstreet 0:a0435a630c5d 53 return ERROR_MOTORON;
tkstreet 4:c36159701cde 54 }else
tkstreet 4:c36159701cde 55 {
tkstreet 4:c36159701cde 56 inA->write(0);
tkstreet 4:c36159701cde 57 inB->write(1);
tkstreet 4:c36159701cde 58 MSG("#AP1017.cpp: Direction: CW\r\n");
tkstreet 4:c36159701cde 59 }
tkstreet 0:a0435a630c5d 60 break;
tkstreet 4:c36159701cde 61 case DIRECTION_BRAKE: // direction = 0x03
tkstreet 1:4d4c77589134 62 inA->write(1);
tkstreet 1:4d4c77589134 63 inB->write(1);
tkstreet 4:c36159701cde 64 MSG("#AP1017.cpp: Direction: Brake\r\n");
tkstreet 0:a0435a630c5d 65 break;
tkstreet 4:c36159701cde 66 case DIRECTION_COAST: // direction = 0x04
tkstreet 1:4d4c77589134 67 inA->write(0);
tkstreet 1:4d4c77589134 68 inB->write(0);
tkstreet 0:a0435a630c5d 69 motorOn = false;
tkstreet 4:c36159701cde 70 MSG("#AP1017.cpp: Direction: Coast\r\n");
tkstreet 0:a0435a630c5d 71 break;
tkstreet 0:a0435a630c5d 72 default:
tkstreet 0:a0435a630c5d 73 return ERROR_DIRECTION;
tkstreet 0:a0435a630c5d 74 }
tkstreet 0:a0435a630c5d 75
tkstreet 0:a0435a630c5d 76 return SUCCESS;
tkstreet 0:a0435a630c5d 77 }
tkstreet 0:a0435a630c5d 78
tkstreet 3:f8e70f639ed0 79
tkstreet 3:f8e70f639ed0 80 AP1017::Rotation AP1017::getDirection(void)
tkstreet 0:a0435a630c5d 81 {
tkstreet 3:f8e70f639ed0 82 return direction;
tkstreet 3:f8e70f639ed0 83 }
tkstreet 3:f8e70f639ed0 84
tkstreet 0:a0435a630c5d 85
tkstreet 3:f8e70f639ed0 86 AP1017::Status AP1017::setSpeed(float dc)
tkstreet 3:f8e70f639ed0 87 {
tkstreet 9:1ca7d16de1c4 88 if((dc <= 100.0) && (dc >= 0.0))
tkstreet 9:1ca7d16de1c4 89 {
tkstreet 3:f8e70f639ed0 90 dutyCycle = dc/100.0;
tkstreet 0:a0435a630c5d 91
tkstreet 0:a0435a630c5d 92 if(motorOn == true){
tkstreet 4:c36159701cde 93 MSG("#AP1017.cpp: Changed running motor speed.\r\n");
tkstreet 0:a0435a630c5d 94 }
tkstreet 0:a0435a630c5d 95 }
tkstreet 9:1ca7d16de1c4 96 else
tkstreet 9:1ca7d16de1c4 97 {
tkstreet 0:a0435a630c5d 98 dutyCycle = 0.0;
tkstreet 0:a0435a630c5d 99
tkstreet 0:a0435a630c5d 100 return ERROR_DUTY_CYCLE;
tkstreet 0:a0435a630c5d 101 }
tkstreet 0:a0435a630c5d 102
tkstreet 0:a0435a630c5d 103 return SUCCESS;
tkstreet 0:a0435a630c5d 104 }
tkstreet 0:a0435a630c5d 105
tkstreet 0:a0435a630c5d 106
tkstreet 3:f8e70f639ed0 107 float AP1017::getSpeed(void)
tkstreet 0:a0435a630c5d 108 {
tkstreet 3:f8e70f639ed0 109 return dutyCycle*100.0;
tkstreet 0:a0435a630c5d 110 }
tkstreet 0:a0435a630c5d 111
tkstreet 0:a0435a630c5d 112
tkstreet 3:f8e70f639ed0 113 AP1017::Status AP1017::start(void)
tkstreet 0:a0435a630c5d 114 {
tkstreet 6:d4d3bc82d446 115 motor->setPortLevel(TCA9554A::PORT_0, TCA9554A::HIGH); // set RSV high
tkstreet 0:a0435a630c5d 116 motorOn = true; // Set ON flag
tkstreet 0:a0435a630c5d 117
tkstreet 0:a0435a630c5d 118 return SUCCESS;
tkstreet 0:a0435a630c5d 119 }
tkstreet 0:a0435a630c5d 120
tkstreet 0:a0435a630c5d 121
tkstreet 3:f8e70f639ed0 122 AP1017::Status AP1017::stop(void)
tkstreet 0:a0435a630c5d 123 {
tkstreet 6:d4d3bc82d446 124 motor->setPortLevel(TCA9554A::PORT_0, TCA9554A::LOW); // set RSV low
tkstreet 0:a0435a630c5d 125 motorOn = false; // Set OFF flag
tkstreet 0:a0435a630c5d 126
tkstreet 0:a0435a630c5d 127 return SUCCESS;
tkstreet 0:a0435a630c5d 128 }
tkstreet 0:a0435a630c5d 129
tkstreet 3:f8e70f639ed0 130 AP1017::Status AP1017::brake(void)
tkstreet 0:a0435a630c5d 131 {
tkstreet 0:a0435a630c5d 132 setDirection(DIRECTION_BRAKE);
tkstreet 0:a0435a630c5d 133 return SUCCESS;
tkstreet 0:a0435a630c5d 134 }
tkstreet 0:a0435a630c5d 135
tkstreet 3:f8e70f639ed0 136 AP1017::Status AP1017::coast(void)
tkstreet 0:a0435a630c5d 137 {
tkstreet 0:a0435a630c5d 138 setDirection(DIRECTION_COAST);
tkstreet 0:a0435a630c5d 139 return SUCCESS;
tkstreet 4:c36159701cde 140 }
tkstreet 4:c36159701cde 141
tkstreet 4:c36159701cde 142 bool AP1017::isMotorOn(void)
tkstreet 4:c36159701cde 143 {
tkstreet 4:c36159701cde 144 return motorOn;
tkstreet 0:a0435a630c5d 145 }