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