Library of routines to drive a MD25 motor control board

Dependents:   Nucleo_motors HTU21D_HELLOWORLD Major_dHome pixyMajordhome ... more

MD25.h

Committer:
jimherd
Date:
2011-05-20
Revision:
1:8046f460a725
Parent:
0:e7f4a9247af2
Child:
2:e575d390c730

File content as of revision 1:8046f460a725:

// ***********************************************************************
// MBED MD25 H-bridge Motor Controller.
//
// Based on Arduino code by Richie Reynolds
// ***********************************************************************
#ifndef MBED_MD25_h
#define MBED_MD25_h

#include "mbed.h"

#define     MD25_DEFAULT_ADDRESS    0xB0
//
// modes
//
//  Mode        Description
//   0    Skid-steer with unsigned speed values (STOP = 128)
//   1    Skid-steer with signed speed values  (STOP = 0)
//   2    Forward/turn steer with unsigned values (speed1 to control both motors, speed2 for turn)
//   3    Forward/turn steer with signed values (speed1 to control both motors, speed2 for turn)
//
#define     MODE_0       0
#define     MODE_1       1
#define     MODE_2       2
#define     MODE_3       3

//
// register definitions
//
#define     MD25_SPEED1_REG         0
#define     MD25_SPEED2_REG         1
#define     MD25_ENCODER1_REG       2
#define     MD25_ENCODER2_REG       6
#define     MD25_VOLTAGE_REG        10
#define     MD25_CURRENT1_REG       11
#define     MD25_CURRENT2_REG       12
#define     MD25_SOFTWAREVER_REG    13
#define     MD25_ACCELRATE_REG      14
#define     MD25_MODE_REG           15
#define     MD25_CMD_REG            16        // command register
//
// Command register command set
//
#define     MD25_RESET_ENCODERS             0x20
#define     MD25_DIABLE SPEED_REGULATION    0x30
#define     MD25_ENABLE_SPEED_REGULATION    0x31
#define     MD25_DISABLE_TIMEOUT            0x32
#define     MD25_ENABLE_TIMEOUT             0x33

/** MD25 class
 *
 * Allow access to an MD25 Dual 12V 2.8A H-Bridge DC Motor Driver
 *
 * @code
 *      MD25  motor_control(p9,p10);   // assumes default address of 0xB0
 * or
 *      MD25  motor_control(p9, p10, 0xB0);
 * @endcode
 */
class MD25 {
public:
    /** Constructor for the MD25 connected to specified I2C pins at a specified address
     *
     * @param   sda         I2C data pin
     * @param   scl         I2C clock pin
     * @param   i2cAddress  I2C address
     */
    MD25(PinName sda, PinName scl, int MD25_i2cAddress);

    /** Constructor for the MD25 connected to specified I2C pins at default address
     *
     * @param   sda         I2C data pin
     * @param   scl         I2C clock pin
     */
    MD25(PinName sda, PinName scl);

    /** Read encoder for channel 1
     *
     * @return   32-bit signed integer value of current encoder value for channel 1
     */
    int32_t getEncoder1(void);
    
    /** Read encoder for channel 2
     *
     * @return   32-bit signed integer value of current encoder value for channel 2
     */
    int32_t getEncoder2(void);

    /** set speed registers for both channels
     *
     * Effect of value is dependent on system mode
     *
     * @param   speed_1   speed register for channel 1  (0->255)
     * @param   speed_2   speed register for channel 2  (0->255)
     */    
    void setSpeedRegisters(uint8_t speed_1, uint8_t speed_2);    
    
    /** set speed register for  channel 1
     *
     * Effect of value is dependent on system mode
     *
     * @param   speed_1   speed register for channel 1  (0->255)
     */        
    void setSpeed1Reg(uint8_t speed);
    
    /** set speed register for  channel 2
     *
     * Effect of value is dependent on system mode
     *
     * @param   speed_2   speed register for channel 2  (0->255)
     */        
    void setSpeed2Reg(uint8_t speed);
    
    /** switch motor 1 off
     */        
    void stopMotor1(void);
    
    /** switch motor 2 off
     */        
    void stopMotor2(void);
          
    /** switch both motors off
     */
    void stopMotors(void);
    
    /** read current software version
     *
     * @return   version number
     */    
    uint32_t getSoftwareVersion(void);
    
    /** read battery voltage
     *
     * Actual voltage = (10 * value)
     *
     * @return   voltage value in units of 0.1v
     */        
    float getBatteryVolts(void);
    
    /** read acceleration rate
     *
     * @return   acceleration rate
     */          
    uint8_t getAccelerationRate(void);
    
    uint8_t getMotor1Current(void);
    uint8_t getMotor2Current(void);
    uint8_t getMotor1Speed(void);
    uint8_t getMotor2Speed(void);
    uint8_t getMode(void);
    void setMode(uint8_t mode);
    void setAccelerationRate(uint8_t rate);
    void setCommand(uint8_t command);

private:
    I2C       _i2c;
    uint8_t   current_mode;
    uint8_t   MD25_i2cAddress;

    uint8_t   readRegisterbyte(uint8_t reg);
    void      writeRegisterbyte(uint8_t reg, uint8_t value);
};

#endif // MBED_md25_h