The iPod controller that I submitted for the mbed challenge
Dependencies: mbed Motordriver PID
fader.h@0:371773dd3dd1, 2011-05-04 (annotated)
- Committer:
- networker
- Date:
- Wed May 04 15:41:13 2011 +0000
- Revision:
- 0:371773dd3dd1
first publication
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
networker | 0:371773dd3dd1 | 1 | #ifndef FADER_H |
networker | 0:371773dd3dd1 | 2 | #define FADER_H |
networker | 0:371773dd3dd1 | 3 | #include "motordriver.h" |
networker | 0:371773dd3dd1 | 4 | #include "PID.h" |
networker | 0:371773dd3dd1 | 5 | #include "filter.h" |
networker | 0:371773dd3dd1 | 6 | |
networker | 0:371773dd3dd1 | 7 | extern AnalogIn Vmotor; |
networker | 0:371773dd3dd1 | 8 | extern DigitalOut track; |
networker | 0:371773dd3dd1 | 9 | |
networker | 0:371773dd3dd1 | 10 | |
networker | 0:371773dd3dd1 | 11 | class servo: public Motor {//class to control a DC motor with analog (potentiometer) feedback |
networker | 0:371773dd3dd1 | 12 | AnalogIn *fb; |
networker | 0:371773dd3dd1 | 13 | PID *pid; |
networker | 0:371773dd3dd1 | 14 | Ticker tick; |
networker | 0:371773dd3dd1 | 15 | float _setPoint; |
networker | 0:371773dd3dd1 | 16 | float _out; |
networker | 0:371773dd3dd1 | 17 | float deadband; |
networker | 0:371773dd3dd1 | 18 | bool coasting; |
networker | 0:371773dd3dd1 | 19 | float med; |
networker | 0:371773dd3dd1 | 20 | filter *flt; |
networker | 0:371773dd3dd1 | 21 | protected: |
networker | 0:371773dd3dd1 | 22 | virtual void process(); |
networker | 0:371773dd3dd1 | 23 | void reset() { |
networker | 0:371773dd3dd1 | 24 | pid->reset(); |
networker | 0:371773dd3dd1 | 25 | } |
networker | 0:371773dd3dd1 | 26 | void update() { |
networker | 0:371773dd3dd1 | 27 | med = flt->process(*fb); |
networker | 0:371773dd3dd1 | 28 | } |
networker | 0:371773dd3dd1 | 29 | public: |
networker | 0:371773dd3dd1 | 30 | servo(PinName p, PinName f, PinName r, PinName a); |
networker | 0:371773dd3dd1 | 31 | virtual ~servo() { |
networker | 0:371773dd3dd1 | 32 | delete pid; |
networker | 0:371773dd3dd1 | 33 | delete fb; |
networker | 0:371773dd3dd1 | 34 | delete flt; |
networker | 0:371773dd3dd1 | 35 | } |
networker | 0:371773dd3dd1 | 36 | //setters |
networker | 0:371773dd3dd1 | 37 | virtual void set(float v) { |
networker | 0:371773dd3dd1 | 38 | _setPoint = v; |
networker | 0:371773dd3dd1 | 39 | pid->setSetPoint(v); |
networker | 0:371773dd3dd1 | 40 | printf("%f %%\n", v*100); |
networker | 0:371773dd3dd1 | 41 | } |
networker | 0:371773dd3dd1 | 42 | //getters |
networker | 0:371773dd3dd1 | 43 | float pos() { |
networker | 0:371773dd3dd1 | 44 | //return *fb; |
networker | 0:371773dd3dd1 | 45 | return med; |
networker | 0:371773dd3dd1 | 46 | } |
networker | 0:371773dd3dd1 | 47 | float setPoint() { |
networker | 0:371773dd3dd1 | 48 | return _setPoint; |
networker | 0:371773dd3dd1 | 49 | } |
networker | 0:371773dd3dd1 | 50 | float output() { |
networker | 0:371773dd3dd1 | 51 | return _out; |
networker | 0:371773dd3dd1 | 52 | } |
networker | 0:371773dd3dd1 | 53 | bool isCoasting() { |
networker | 0:371773dd3dd1 | 54 | return coasting; |
networker | 0:371773dd3dd1 | 55 | } |
networker | 0:371773dd3dd1 | 56 | }; |
networker | 0:371773dd3dd1 | 57 | |
networker | 0:371773dd3dd1 | 58 | class fader: public servo { |
networker | 0:371773dd3dd1 | 59 | float thres, thres2; |
networker | 0:371773dd3dd1 | 60 | int count; |
networker | 0:371773dd3dd1 | 61 | float lastpos; |
networker | 0:371773dd3dd1 | 62 | AnalogIn *touch; |
networker | 0:371773dd3dd1 | 63 | void (*command)(float); |
networker | 0:371773dd3dd1 | 64 | enum { holding, tracking, moving} state; |
networker | 0:371773dd3dd1 | 65 | protected: |
networker | 0:371773dd3dd1 | 66 | virtual void process() ; |
networker | 0:371773dd3dd1 | 67 | public: |
networker | 0:371773dd3dd1 | 68 | fader(PinName p, PinName f, PinName r, PinName a, PinName t=NC); |
networker | 0:371773dd3dd1 | 69 | virtual ~fader() { |
networker | 0:371773dd3dd1 | 70 | if (touch) |
networker | 0:371773dd3dd1 | 71 | delete touch; |
networker | 0:371773dd3dd1 | 72 | } |
networker | 0:371773dd3dd1 | 73 | //setters |
networker | 0:371773dd3dd1 | 74 | virtual void set(float v) { |
networker | 0:371773dd3dd1 | 75 | if (state==moving) |
networker | 0:371773dd3dd1 | 76 | return; //cannot accept new value while wiper is being moved |
networker | 0:371773dd3dd1 | 77 | if (state==holding) |
networker | 0:371773dd3dd1 | 78 | reset(); //clear cummulative error after coasting |
networker | 0:371773dd3dd1 | 79 | state = tracking;//this is the only way to make the servo active again |
networker | 0:371773dd3dd1 | 80 | servo::set(v); |
networker | 0:371773dd3dd1 | 81 | // printf("%f%%\n", v*100); |
networker | 0:371773dd3dd1 | 82 | track = 0; //debug |
networker | 0:371773dd3dd1 | 83 | } |
networker | 0:371773dd3dd1 | 84 | void setOnMove(void(*f)(float)) { |
networker | 0:371773dd3dd1 | 85 | command = f; |
networker | 0:371773dd3dd1 | 86 | } |
networker | 0:371773dd3dd1 | 87 | void setMoveThreshold(float t) { |
networker | 0:371773dd3dd1 | 88 | thres = t; |
networker | 0:371773dd3dd1 | 89 | } |
networker | 0:371773dd3dd1 | 90 | //getters |
networker | 0:371773dd3dd1 | 91 | //pos is inherited |
networker | 0:371773dd3dd1 | 92 | }; |
networker | 0:371773dd3dd1 | 93 | #endif |