Carlo Collodi / kangaroo

Dependencies:   QEI mbed

Committer:
calamaridudeman
Date:
Tue Nov 19 19:07:35 2013 +0000
Revision:
23:112c0be5a7f3
Child:
25:8a34b8d6cc6e
fixed all the java-esque code to be cpp, have bezier and geometry code working solid

Who changed what in which revision?

UserRevisionLine numberNew contents of line
calamaridudeman 23:112c0be5a7f3 1 #include "mbed.h"
calamaridudeman 23:112c0be5a7f3 2 #include "include/motor.hpp"
calamaridudeman 23:112c0be5a7f3 3
calamaridudeman 23:112c0be5a7f3 4 Motor::Motor(PinName aPin, PinName fPin, PinName bPin, PinName pwmPin, PinName encA, PinName encB):aIn(aPin),Forward(fPin),Backward(bPin),pwmOut(pwmPin),encoder(encA, encB, NC, 1200, QEI::X4_ENCODING){ //15,17,18,21,25,26 and 16,19,20,22,23,24
calamaridudeman 23:112c0be5a7f3 5
calamaridudeman 23:112c0be5a7f3 6 freq =.001;
calamaridudeman 23:112c0be5a7f3 7 voltage = 12.0;
calamaridudeman 23:112c0be5a7f3 8 mode=0;
calamaridudeman 23:112c0be5a7f3 9
calamaridudeman 23:112c0be5a7f3 10 kp=3;
calamaridudeman 23:112c0be5a7f3 11 kd=0.04;
calamaridudeman 23:112c0be5a7f3 12
calamaridudeman 23:112c0be5a7f3 13 pwmOut.period_us(.0005);
calamaridudeman 23:112c0be5a7f3 14 }
calamaridudeman 23:112c0be5a7f3 15
calamaridudeman 23:112c0be5a7f3 16 void Motor::start(){
calamaridudeman 23:112c0be5a7f3 17 t.attach(this, &Motor::Control, freq);
calamaridudeman 23:112c0be5a7f3 18 }
calamaridudeman 23:112c0be5a7f3 19
calamaridudeman 23:112c0be5a7f3 20 void Motor::stop(){
calamaridudeman 23:112c0be5a7f3 21 t.detach();
calamaridudeman 23:112c0be5a7f3 22 pwmOut.write(0);
calamaridudeman 23:112c0be5a7f3 23 }
calamaridudeman 23:112c0be5a7f3 24
calamaridudeman 23:112c0be5a7f3 25 void Motor::zero(){
calamaridudeman 23:112c0be5a7f3 26 encoder.reset();
calamaridudeman 23:112c0be5a7f3 27 }
calamaridudeman 23:112c0be5a7f3 28
calamaridudeman 23:112c0be5a7f3 29 void Motor::Control(){
calamaridudeman 23:112c0be5a7f3 30 float preAngle=angle; // Storing the angle in the previous time step
calamaridudeman 23:112c0be5a7f3 31 angle = encoder.getPulses()/1200.0*6.283; // Updating new motor angle
calamaridudeman 23:112c0be5a7f3 32 speed =Motor::filterLowPass(speed,(angle-preAngle)/freq, .2); // Updating new motor angular vel
calamaridudeman 23:112c0be5a7f3 33 float mCurrent = getCurrent();
calamaridudeman 23:112c0be5a7f3 34
calamaridudeman 23:112c0be5a7f3 35 float dCurrent;
calamaridudeman 23:112c0be5a7f3 36 switch(mode){
calamaridudeman 23:112c0be5a7f3 37 case 1:
calamaridudeman 23:112c0be5a7f3 38 dCurrent = kp*(dAngle-angle);
calamaridudeman 23:112c0be5a7f3 39 case 2:
calamaridudeman 23:112c0be5a7f3 40 dCurrent = kd*(dAngularVelocity-speed);
calamaridudeman 23:112c0be5a7f3 41 case 3:
calamaridudeman 23:112c0be5a7f3 42 dCurrent = kp*(dAngle-angle)+kd*(dAngularVelocity-speed);
calamaridudeman 23:112c0be5a7f3 43 case 0:
calamaridudeman 23:112c0be5a7f3 44 dCurrent = dTorque/3.27;
calamaridudeman 23:112c0be5a7f3 45 }
calamaridudeman 23:112c0be5a7f3 46
calamaridudeman 23:112c0be5a7f3 47 float duty=0;
calamaridudeman 23:112c0be5a7f3 48 if (dCurrent>0){
calamaridudeman 23:112c0be5a7f3 49 Forward=1;
calamaridudeman 23:112c0be5a7f3 50 Backward=0;
calamaridudeman 23:112c0be5a7f3 51 duty= (abs(dCurrent)*3.27+0.174*speed+10*(abs(dCurrent)-mCurrent))/voltage;
calamaridudeman 23:112c0be5a7f3 52 }else if (dCurrent<0){
calamaridudeman 23:112c0be5a7f3 53 Forward=0;
calamaridudeman 23:112c0be5a7f3 54 Backward=1;
calamaridudeman 23:112c0be5a7f3 55 duty= (abs(dCurrent)*3.27-0.174*speed+10*(abs(dCurrent)-mCurrent))/voltage;
calamaridudeman 23:112c0be5a7f3 56 }
calamaridudeman 23:112c0be5a7f3 57
calamaridudeman 23:112c0be5a7f3 58 if (duty>0.99){
calamaridudeman 23:112c0be5a7f3 59 duty =1;
calamaridudeman 23:112c0be5a7f3 60 }
calamaridudeman 23:112c0be5a7f3 61
calamaridudeman 23:112c0be5a7f3 62 pwmOut.write(duty);
calamaridudeman 23:112c0be5a7f3 63 }
calamaridudeman 23:112c0be5a7f3 64
calamaridudeman 23:112c0be5a7f3 65 float Motor::getCurrent()
calamaridudeman 23:112c0be5a7f3 66 {
calamaridudeman 23:112c0be5a7f3 67 return (1/.140)*3.3 * aIn;
calamaridudeman 23:112c0be5a7f3 68 }
calamaridudeman 23:112c0be5a7f3 69
calamaridudeman 23:112c0be5a7f3 70 float Motor::getMotorPos()
calamaridudeman 23:112c0be5a7f3 71 {
calamaridudeman 23:112c0be5a7f3 72 return encoder.getPulses();
calamaridudeman 23:112c0be5a7f3 73 }
calamaridudeman 23:112c0be5a7f3 74
calamaridudeman 23:112c0be5a7f3 75 float Motor::filterLowPass(float old, float currentIn, float alphar){
calamaridudeman 23:112c0be5a7f3 76 return (old+alphar*(currentIn-old));
calamaridudeman 23:112c0be5a7f3 77 }
calamaridudeman 23:112c0be5a7f3 78
calamaridudeman 23:112c0be5a7f3 79 void Motor::setTorque(float t){
calamaridudeman 23:112c0be5a7f3 80 mode = 0;
calamaridudeman 23:112c0be5a7f3 81 dTorque = t;
calamaridudeman 23:112c0be5a7f3 82 }
calamaridudeman 23:112c0be5a7f3 83
calamaridudeman 23:112c0be5a7f3 84 void Motor::setPos(float pos){
calamaridudeman 23:112c0be5a7f3 85 mode = 1;
calamaridudeman 23:112c0be5a7f3 86 dAngle=pos;
calamaridudeman 23:112c0be5a7f3 87 }
calamaridudeman 23:112c0be5a7f3 88
calamaridudeman 23:112c0be5a7f3 89 void Motor::setVel(float vel){
calamaridudeman 23:112c0be5a7f3 90 mode = 2;
calamaridudeman 23:112c0be5a7f3 91 dAngularVelocity = vel;
calamaridudeman 23:112c0be5a7f3 92 }
calamaridudeman 23:112c0be5a7f3 93
calamaridudeman 23:112c0be5a7f3 94 void Motor::setPosVel(float pos, float vel){
calamaridudeman 23:112c0be5a7f3 95 mode = 3;
calamaridudeman 23:112c0be5a7f3 96 dAngle = pos;
calamaridudeman 23:112c0be5a7f3 97 dAngularVelocity = vel;
calamaridudeman 23:112c0be5a7f3 98 }