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:
Wed May 03 18:55:18 2017 +0000
Revision:
8:bc70a421ef4c
Parent:
6:d4d3bc82d446
Child:
9:1ca7d16de1c4
Minor fix to motor object.

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