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:
2:e575d390c730
Parent:
1:8046f460a725

File content as of revision 2:e575d390c730:

// ***********************************************************************
// 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
     *
     * @return   voltage value in float format
     */        
    float getBatteryVolts(void);
    
    /** read acceleration rate
     *
     * @return   acceleration rate
     */
    uint8_t getAccelerationRate(void);

    /** read current from motor channel 1
     *
     * @return   current value
     */    
    uint8_t getMotor1Current(void);
    
    /** read current from motor channel 2
     *
     * @return   current value in apprx. units of 0.1amp
     */        
    uint8_t getMotor2Current(void);
    
    /** read current speed register for motor channel 1
     *
     * @return   speed value (0->255); meaning dependent on mode
     */       
    uint8_t getMotor1Speed(void);
    
    /** read current speed register for motor channel 2
     *
     * @return   speed value (0->255); meaning dependent on mode
     */           
    uint8_t getMotor2Speed(void);
    
    /** read current mode
     *
     * @return   mode value (0, 1, 2, or 3); default is mode 0
     */
    uint8_t getMode(void);
    
    /** set system mode
     *
     * @param   mode     value (0, 1, 2, or 3)
     */    
    void setMode(uint8_t mode);
    
    /** set acceleration rate
     *
     * @param   rate   acceleration rate
     */      
    void setAccelerationRate(uint8_t rate);
    
    /** send command to command register
     *
     * @param   command   command code
     *
     * MD25_RESET_ENCODERS             0x20
     * MD25_DIABLE SPEED_REGULATION    0x30
     * MD25_ENABLE_SPEED_REGULATION    0x31
     * MD25_DISABLE_TIMEOUT            0x32
     * MD25_ENABLE_TIMEOUT             0x33
     */      
    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