Carlo Collodi / kangaroo

Dependencies:   QEI mbed

Committer:
calamaridudeman
Date:
Tue Nov 26 21:26:44 2013 +0000
Revision:
43:68faf056ed5c
Parent:
37:bf257a0154db
Child:
44:3566c5699ba6
trying to get setTorque to work

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