C++ class for controlling DC motor with encoder feedback. Dependencies include LS7366LIB, MotCon, and PID.

Dependencies:   PID LS7366LIB MotCon2

Axis.h

Committer:
jebradshaw
Date:
2019-01-09
Revision:
12:7a7fe3baf733
Parent:
11:93d924320ddc

File content as of revision 12:7a7fe3baf733:

// Updated Axis Class on 20190108 to include mode change (Position, Velocity, Acceleration)
//  all in radians, rad/sec, rad/sec/sec
// J. Bradshaw

#ifndef MBED_AXIS_H
#define MBED_AXIS_H
 
#include "mbed.h"
#include "PID.h"        //library for software routine PID controller
#include "LS7366.h"     //library for quadrature encoder interface IC's
#include "MotCon.h"     //simple motor control routines

class Axis{
public:
    /** Create a closed loop controller connected to the specified pins
     *
     * @param _spi address of the spi object for LS7366 encoder IC communication
     * @param _cs chip select signal used for the LS7366 encoder IC spi addressing
     * @param _pwm pulse width modulation output pin for motor control signal     
     * @param _dir DigitalOut pin to control the motor direction pin1
     * @param _analog analog input pin for monitoring current
     * @param _limit pointer to integer object for limit switch detection
     */
    Axis(SPI& _spi, PinName _cs, PinName _pwm, PinName _dir, PinName _analog, int* limit);    
    /** Create a closed loop controller connected to the specified pins
     *
     * @param _spi address of the spi object for LS7366 encoder IC communication
     * @param _cs chip select signal used for the LS7366 encoder IC spi addressing
     * @param _pwm pulse width modulation output pin for motor control signal     
     * @param _dir DigitalOut pin to control the motor direction pin 1
     * @param _dir2 DigitalOut pin to control the motor direction pin 2
     * @param _analog analog input pin for monitoring current
     * @param _limit pointer to integer object for limit switch detection
     */
    Axis(SPI& _spi, PinName _cs, PinName _pwm, PinName _dir, PinName _dir2, PinName _analog, int* limit);
    void paramUpdate(void);
    void init(float encCountsPerRev);
    void moveTrapezoid(float position, float time);
    void moveScurve(float position, float time);
    void moveUpdateTrapezoid(void);
    float readCurrent(void);
    void axisOff(void);
    void axisOn(void);
    void zero(void);
    void writeEncoderValue(long value);
    void updatePIDgains(float P, float I, float D);
    void changeMoveMode(int mode);
    
    long enc;       //used to return the data from the LS7366 encoder chip
    float co;       // = 0.0;
    float Tdelay;   // = .01;
    float Pk;       // 120.0 for scorbot
    float Ik;       // 55.0 for scorbot
    float Dk;
    float set_point;// = 0.0;
    float set_point_last;
    float pos, vel, acc;    //calculated position, velocity, and acceleration
    int stat;               //overall axis status
    float pos_last, vel_last, acc_last; //history variables used to calculate motion
    float pos_cmd, vel_cmd, vel_avg_cmd, acc_cmd;    
    float vel_max, acc_max;
    float vel_accum;
    float moveTime;    
    float p_higher, p_lower;
    int moveStatus;
    int moveState;
    int debug;
    int *ptr_limit;
    float motI;   //motor current read from readCurrent() function
    volatile float motI_last;
    float mot_I_lim;    //max current limit
    float dIdT;
    float mot_I_max, mot_I_max_last;
    int axisState;
    int motInvert;
    char dataFormat;    //'r'=radians (default), 'd'=degrees, 'e'=encoder counts
    float pos_rad, vel_rad;      //current position measurement in radians
    float pos_deg, vel_deg;  //current position measurement in degrees
    float ctsPerDeg;
    int busyflag;
    int moveMode;
    float countsPerRev;   

    Ticker update;
    Ticker moveProfile;
    Timer t;
    PID *pid;
    LS7366 *ls7366;
    MotCon *motcon;
    //AnalogIn *motCurrent;
    
private:
    SPI _spi;
    DigitalOut _cs;
    PwmOut _pwm;
    DigitalOut _dir;
    DigitalOut _dir2;
    AnalogIn _analog;
};

#endif