The iPod controller that I submitted for the mbed challenge

Dependencies:   mbed Motordriver PID

Committer:
networker
Date:
Wed May 04 15:41:13 2011 +0000
Revision:
0:371773dd3dd1
first publication

Who changed what in which revision?

UserRevisionLine numberNew 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