C++ class for controlling DC motor with encoder feedback. Dependencies include LS7366LIB, MotCon, and PID.
Dependencies: LS7366LIB MotCon2 PID
Diff: Axis.cpp
- Revision:
- 12:b80cc2e27bdb
- Parent:
- 11:93d924320ddc
--- a/Axis.cpp Tue Nov 15 15:41:33 2016 +0000 +++ b/Axis.cpp Wed Jul 11 13:47:33 2018 +0000 @@ -10,8 +10,8 @@ this->_dir = 0; this->co = 0.0; this->Tdelay = .01; - this->Pk = 140.0; //120.0; //rough gains, seem to work well but could use tuning - this->Ik = 95.0; //75.0; + this->Pk = 450.0; //120.0; //rough gains, seem to work well but could use tuning + this->Ik = 105.0; //75.0; this->Dk = 0.0; this->set_point = 0.0; this->set_point_last = 0.0; @@ -36,6 +36,11 @@ this->update.attach(this, &Axis::paramUpdate, Tdelay); this->axisState = 0; this->mot_I_lim = .35; + this->dIdT = 0.0; + this->motI = 0.0; + this->motI_last = 0.0; + this->mot_I_max = 0.0; + this->mot_I_max_last = 0.0; this->motInvert = 0; this->dataFormat = 'r'; //default is radians // this->ctsPerDeg = cpd; //update counts per degree passed from constructor @@ -86,7 +91,14 @@ this->pid->setTunings(this->Pk, this->Ik, this->Dk); //turns on controller } - + +void Axis::updatePIDgains(float P, float I, float D){ + this->Pk = P; //120.0; //rough gains, seem to work well but could use tuning + this->Ik = I; //75.0; + this->Dk = D; + this->pid->setTunings(this->Pk, this->Ik, this->Dk); +} + void Axis::paramUpdate(void){ //testOut = 1; this->enc = this->ls7366->LS7366_read_counter(); @@ -255,8 +267,13 @@ } float Axis::readCurrent(void){ - motCurrent = (this->_analog.read() * 3.3) / .525; //525mV per amp - return motCurrent; + this->motI = (this->_analog.read() * 3.3) / .525; //525mV per amp + if(abs(this->motI) > this->mot_I_max){ //update the max motor current measured + this->mot_I_max = this->motI; + } + this->dIdT = motI - motI_last; + this->motI_last = motI; + return this->motI; } void Axis::axisOff(void){ @@ -267,10 +284,12 @@ void Axis::axisOn(void){ this->co = 0.0; - this->pid->reset(); - //start at 0 - this->set_point = 0.0; - this->pid->setSetPoint(0); + this->pid->reset(); + //start at 0 if not already homed + if(this->stat != 0){ + this->set_point = 0.0; + this->pid->setSetPoint(0); + } this->pid->setTunings(this->Pk, this->Ik, this->Dk); //turns on controller this->axisState = 1; @@ -286,6 +305,7 @@ this->enc = this->ls7366->LS7366_read_counter(); this->pos = 0.0; + this->pid->reset(); //added to avoid possible itegral windup effects on instant position change 20170616 this->set_point = 0.0; this->pid->setSetPoint(0);