Shih-Ho Hsieh / Mbed 2 deprecated Motor_XYZ_UI_SPI_8mag_encoder

Dependencies:   mbed

Committer:
hober
Date:
Sat Dec 22 01:07:34 2018 +0000
Revision:
0:9e6e3dc903c0
Child:
1:edc6b5cc7112
20181222 backup

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hober 0:9e6e3dc903c0 1 #include "linear_slide.h"
hober 0:9e6e3dc903c0 2
hober 0:9e6e3dc903c0 3 LinearSlide::LinearSlide(Motor *motor, float pitch, int length, PinName zi, PinName ei):
hober 0:9e6e3dc903c0 4 _p_motor(motor),
hober 0:9e6e3dc903c0 5 _length(length),
hober 0:9e6e3dc903c0 6 _zeroPulseCount(0),
hober 0:9e6e3dc903c0 7 _pitch(pitch),
hober 0:9e6e3dc903c0 8 _pos(0.0f),
hober 0:9e6e3dc903c0 9 _vel(0.0f),
hober 0:9e6e3dc903c0 10 _zero(zi),
hober 0:9e6e3dc903c0 11 _end(ei),
hober 0:9e6e3dc903c0 12 _nextEvent(NULL),
hober 0:9e6e3dc903c0 13 _isReset(false)
hober 0:9e6e3dc903c0 14 {
hober 0:9e6e3dc903c0 15
hober 0:9e6e3dc903c0 16 }
hober 0:9e6e3dc903c0 17
hober 0:9e6e3dc903c0 18 void LinearSlide::go(int dir)
hober 0:9e6e3dc903c0 19 {
hober 0:9e6e3dc903c0 20 if(moving()) return;
hober 0:9e6e3dc903c0 21 _dir = dir;
hober 0:9e6e3dc903c0 22 if(!isInBound()) return;
hober 0:9e6e3dc903c0 23 int pulseCount = countPulseNumber(0.1); // 1mm
hober 0:9e6e3dc903c0 24 _p_motor->setRotateFinishEvent(callback(this,&LinearSlide::goCallback));
hober 0:9e6e3dc903c0 25 _p_motor->setRotateCheckEvent(callback(this,&LinearSlide::isInBound));
hober 0:9e6e3dc903c0 26 _p_motor->setSpeed((int)(_vel*60.0f/(float)(_pitch)));
hober 0:9e6e3dc903c0 27 _p_motor->rotate((dir == MOTOR_SIDE ? CCW : CW), pulseCount);
hober 0:9e6e3dc903c0 28 }
hober 0:9e6e3dc903c0 29
hober 0:9e6e3dc903c0 30 void LinearSlide::to(float pos)
hober 0:9e6e3dc903c0 31 {
hober 0:9e6e3dc903c0 32 if(moving() || (pos == _pos)) return;
hober 0:9e6e3dc903c0 33 float diffPos = pos-_pos;
hober 0:9e6e3dc903c0 34 Direction dir = (diffPos > 0 ? CCW : CW);
hober 0:9e6e3dc903c0 35 _dir = (dir == CCW ? MOTOR_SIDE : NON_MOTOR_SIDE);
hober 0:9e6e3dc903c0 36 if(!isInBound()) return;
hober 0:9e6e3dc903c0 37 diffPos = (diffPos > 0 ? diffPos : -diffPos);
hober 0:9e6e3dc903c0 38 int pulseCount = countPulseNumber(diffPos); // 1mm
hober 0:9e6e3dc903c0 39 _p_motor->setRotateFinishEvent(callback(this,&LinearSlide::goCallback));
hober 0:9e6e3dc903c0 40 _p_motor->setRotateCheckEvent(callback(this,&LinearSlide::isInBound));
hober 0:9e6e3dc903c0 41 _p_motor->setSpeed((int)(_vel*60.0f/(float)(_pitch)));
hober 0:9e6e3dc903c0 42 _p_motor->rotate(dir, pulseCount);
hober 0:9e6e3dc903c0 43 }
hober 0:9e6e3dc903c0 44
hober 0:9e6e3dc903c0 45 inline void LinearSlide::goCallback()
hober 0:9e6e3dc903c0 46 {
hober 0:9e6e3dc903c0 47 _pos = position();
hober 0:9e6e3dc903c0 48 if(_nextEvent) _nextEvent();
hober 0:9e6e3dc903c0 49 _nextEvent = NULL;
hober 0:9e6e3dc903c0 50 if(_isReset) reset();
hober 0:9e6e3dc903c0 51 _isReset = false;
hober 0:9e6e3dc903c0 52 }
hober 0:9e6e3dc903c0 53
hober 0:9e6e3dc903c0 54 float LinearSlide::setSpeed(float cmps)
hober 0:9e6e3dc903c0 55 {
hober 0:9e6e3dc903c0 56 _vel = cmps;
hober 0:9e6e3dc903c0 57 int rpm = (int)(_vel*60.0f/(float)(_pitch));
hober 0:9e6e3dc903c0 58 int rpm_set = _p_motor->setSpeed(rpm);
hober 0:9e6e3dc903c0 59 if(rpm_set != rpm)
hober 0:9e6e3dc903c0 60 {
hober 0:9e6e3dc903c0 61 _vel = (float)(rpm_set)*_pitch/60.0f;
hober 0:9e6e3dc903c0 62 }
hober 0:9e6e3dc903c0 63 return _vel;
hober 0:9e6e3dc903c0 64 }
hober 0:9e6e3dc903c0 65
hober 0:9e6e3dc903c0 66 inline bool LinearSlide::isInBound()
hober 0:9e6e3dc903c0 67 {
hober 0:9e6e3dc903c0 68 if((_zero == 0 && _dir == NON_MOTOR_SIDE) || (_end == 0 && _dir == MOTOR_SIDE))
hober 0:9e6e3dc903c0 69 return false;
hober 0:9e6e3dc903c0 70 return true;
hober 0:9e6e3dc903c0 71 }
hober 0:9e6e3dc903c0 72
hober 0:9e6e3dc903c0 73 void LinearSlide::toZero()
hober 0:9e6e3dc903c0 74 {
hober 0:9e6e3dc903c0 75 _dir = NON_MOTOR_SIDE;
hober 0:9e6e3dc903c0 76 int pulseCount = countPulseNumber(10); // 10cm
hober 0:9e6e3dc903c0 77 _p_motor->setRotateFinishEvent(callback(this,&LinearSlide::reset));
hober 0:9e6e3dc903c0 78 _p_motor->setRotateCheckEvent(callback(this,&LinearSlide::isInBound));
hober 0:9e6e3dc903c0 79 _p_motor->setSpeed((int)(0.3f*60.0f/(float)(_pitch)));
hober 0:9e6e3dc903c0 80 _p_motor->rotate(CW, pulseCount);
hober 0:9e6e3dc903c0 81 }
hober 0:9e6e3dc903c0 82
hober 0:9e6e3dc903c0 83 void LinearSlide::toEnd()
hober 0:9e6e3dc903c0 84 {
hober 0:9e6e3dc903c0 85 _dir = MOTOR_SIDE;
hober 0:9e6e3dc903c0 86 int pulseCount = countPulseNumber(10); // 10cm
hober 0:9e6e3dc903c0 87 _p_motor->setRotateCheckEvent(callback(this,&LinearSlide::isInBound));
hober 0:9e6e3dc903c0 88 _p_motor->setSpeed((int)(0.3f*60.0f/(float)(_pitch)));
hober 0:9e6e3dc903c0 89 _p_motor->rotate(CCW, pulseCount);
hober 0:9e6e3dc903c0 90 }
hober 0:9e6e3dc903c0 91
hober 0:9e6e3dc903c0 92 void LinearSlide::initial()
hober 0:9e6e3dc903c0 93 {
hober 0:9e6e3dc903c0 94 setSpeed(3);
hober 0:9e6e3dc903c0 95 _nextEvent = callback(this,&LinearSlide::toZero);
hober 0:9e6e3dc903c0 96 _isReset = true;
hober 0:9e6e3dc903c0 97 to(_pos+1);
hober 0:9e6e3dc903c0 98 }