Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
XYZ_sensor_Platform/motor/linear_slide.cpp@0:9e6e3dc903c0, 2018-12-22 (annotated)
- 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?
| User | Revision | Line number | New 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 | } |