Motor driver library for the AP1017.
AKM Development Platform
AP1017 Motor Driver
Import libraryAP1017
Motor driver library for the AP1017.
AP1017.cpp
- Committer:
- tkstreet
- Date:
- 2017-05-03
- Revision:
- 8:bc70a421ef4c
- Parent:
- 6:d4d3bc82d446
- Child:
- 9:1ca7d16de1c4
File content as of revision 8:bc70a421ef4c:
#include "AP1017.h" #include "debug.h" #define I2C_SPEED 400000 /******************** Constructors & Destructors ****************************/ // Default constructor AP1017::AP1017(void) : motorOn(false), dutyCycle(0.0) { // TODO: Move pin assignments to Ap1017Ctrl and pass references here //motor = new PwmOut(P0_10); inA = new DigitalOut(P0_11); inB = new DigitalOut(P0_9); // Instantiate I2C i2cMotor = new I2C(I2C_SDA0, I2C_SCL0); i2cMotor->frequency(I2C_SPEED); // Instantiate TCA9554A motor = new TCA9554A(i2cMotor, TCA9554A::SLAVE_ADDRESS_38H); // 38H->Port 0->RSV // Initialize RSV as output if (motor->configurePort(TCA9554A::PORT_0, TCA9554A::DIR_OUTPUT)!= TCA9554A::SUCCESS) { MSG("#AP1017: Error configuring TCA9554A port.\r\n"); } motor->setPortLevel(TCA9554A::PORT_0, TCA9554A::LOW); // Turn motor off } // Default destructor AP1017::~AP1017(void) { stop(); delete inA, inB, motor, i2cMotor; } /*********************** Member Functions ***********************************/ AP1017::Status AP1017::setDirection(AP1017::Rotation dir) { direction = dir; switch(direction){ case DIRECTION_CW: // direction = 0x00 if(isMotorOn()) { MSG("#AP1017.cpp: Error. Cannot change direction while motor is running.\r\n"); return ERROR_MOTORON; }else { inA->write(1); inB->write(0); MSG("#AP1017.cpp: Direction: CCW\r\n"); } break; case DIRECTION_CCW: // direction = 0x01 if(isMotorOn()) { MSG("#AP1017.cpp: Error. Cannot change direction while motor is running.\r\n"); return ERROR_MOTORON; }else { inA->write(0); inB->write(1); MSG("#AP1017.cpp: Direction: CW\r\n"); } break; case DIRECTION_BRAKE: // direction = 0x03 inA->write(1); inB->write(1); MSG("#AP1017.cpp: Direction: Brake\r\n"); break; case DIRECTION_COAST: // direction = 0x04 inA->write(0); inB->write(0); motorOn = false; MSG("#AP1017.cpp: Direction: Coast\r\n"); break; default: return ERROR_DIRECTION; } return SUCCESS; } AP1017::Rotation AP1017::getDirection(void) { return direction; } AP1017::Status AP1017::setSpeed(float dc) { if((dc <= 100.0) && (dc >= 0.0)){ dutyCycle = dc/100.0; MSG("#AP1017.cpp: dutyCycle = %.1f%%\r\n", dc); if(motorOn == true){ //TODO MSG("#AP1017.cpp: Changed running motor speed.\r\n"); } } else{ dutyCycle = 0.0; return ERROR_DUTY_CYCLE; } return SUCCESS; } float AP1017::getSpeed(void) { MSG("#AP1017.cpp: Speed = %.1f%%\r\n", dutyCycle); return dutyCycle*100.0; } AP1017::Status AP1017::start(void) { motor->setPortLevel(TCA9554A::PORT_0, TCA9554A::HIGH); // set RSV high MSG("#AP1017.cpp: Motor: ON\r\n"); motorOn = true; // Set ON flag return SUCCESS; } AP1017::Status AP1017::stop(void) { motor->setPortLevel(TCA9554A::PORT_0, TCA9554A::LOW); // set RSV low MSG("#AP1017.cpp: Motor: OFF\r\n"); motorOn = false; // Set OFF flag return SUCCESS; } AP1017::Status AP1017::brake(void) { setDirection(DIRECTION_BRAKE); MSG("#AP1017.cpp: Motor: BRAKE\r\n"); return SUCCESS; } AP1017::Status AP1017::coast(void) { setDirection(DIRECTION_COAST); MSG("#AP1017.cpp: Motor: COAST\r\n"); return SUCCESS; } bool AP1017::isMotorOn(void) { return motorOn; }