![](/media/cache/group/9e3cc099b3b04bca937a1cca1da81b19.jpg.50x50_q85.jpg)
Moet dit er bij
Dependencies: mbed QEI HIDScope biquadFilter MODSERIAL FastPWM
main.cpp@13:41fc5b6262c0, 2019-10-29 (annotated)
- Committer:
- BasB
- Date:
- Tue Oct 29 21:33:42 2019 +0000
- Revision:
- 13:41fc5b6262c0
- Parent:
- 12:55b76c319364
- Child:
- 14:8aa57a7c5b30
Dit is echt de shit! Hij kan met state machine calibreren en naar home position bewegen en dan aangestuurd worden met een gewenste Vx en Vy
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
BasB | 0:335646ab45c0 | 1 | #include "mbed.h" |
BasB | 0:335646ab45c0 | 2 | #include "HIDScope.h" |
BasB | 0:335646ab45c0 | 3 | #include "QEI.h" |
BasB | 0:335646ab45c0 | 4 | #include "MODSERIAL.h" |
BasB | 0:335646ab45c0 | 5 | #include "BiQuad.h" |
BasB | 0:335646ab45c0 | 6 | #include "FastPWM.h" |
BasB | 0:335646ab45c0 | 7 | |
BasB | 0:335646ab45c0 | 8 | // Button and potmeter1 control |
BasB | 0:335646ab45c0 | 9 | InterruptIn button1(D11); |
BasB | 0:335646ab45c0 | 10 | InterruptIn button2(D10); |
BasB | 0:335646ab45c0 | 11 | InterruptIn buttonsw2(SW2); |
BasB | 0:335646ab45c0 | 12 | InterruptIn buttonsw3(SW3); |
BasB | 0:335646ab45c0 | 13 | AnalogIn potmeter1(A0); |
BasB | 0:335646ab45c0 | 14 | AnalogIn potmeter2(A1); |
BasB | 0:335646ab45c0 | 15 | AnalogIn potmeter3(A2); |
BasB | 0:335646ab45c0 | 16 | AnalogIn potmeter4(A3); |
BasB | 2:7ea5ae2287a7 | 17 | |
BasB | 0:335646ab45c0 | 18 | // Encoder |
BasB | 0:335646ab45c0 | 19 | DigitalIn encA1(D9); |
BasB | 0:335646ab45c0 | 20 | DigitalIn encB1(D8); |
BasB | 0:335646ab45c0 | 21 | DigitalIn encA2(D13); |
BasB | 0:335646ab45c0 | 22 | DigitalIn encB2(D13); |
BasB | 0:335646ab45c0 | 23 | QEI encoder1(D9,D8,NC,64,QEI::X4_ENCODING); //Encoding motor 1 |
BasB | 0:335646ab45c0 | 24 | QEI encoder2(D13,D12,NC,64,QEI::X4_ENCODING); //Encoding motor 2 |
BasB | 0:335646ab45c0 | 25 | float Ts = 0.01; //Sample time |
BasB | 11:cd7be08f46b0 | 26 | float deg2rad=0.0174532; //Conversion factor degree to rad |
BasB | 11:cd7be08f46b0 | 27 | float rad2deg=57.29578; //Conversion factor rad to degree |
BasB | 13:41fc5b6262c0 | 28 | float motor1angle=(-140.0-10.0)*deg2rad*5.5; //Measured angle motor 1 |
BasB | 11:cd7be08f46b0 | 29 | float motor2angle=(-10.0)*deg2rad*2.75; //Measured angle motor 2 |
BasB | 7:676a83def149 | 30 | float motor1offset; //Offset bij calibratie |
BasB | 7:676a83def149 | 31 | float motor2offset; |
BasB | 2:7ea5ae2287a7 | 32 | float potmeter; |
BasB | 4:1e8da6b5f147 | 33 | float omega1; //velocity rad/s motor 1 |
BasB | 0:335646ab45c0 | 34 | float omega2; //Velocity rad/s motor2 |
BasB | 11:cd7be08f46b0 | 35 | |
BasB | 0:335646ab45c0 | 36 | |
BasB | 0:335646ab45c0 | 37 | |
BasB | 0:335646ab45c0 | 38 | // Motor |
BasB | 0:335646ab45c0 | 39 | DigitalOut motor2Direction(D4); |
BasB | 0:335646ab45c0 | 40 | FastPWM motor2Power(D5); |
BasB | 0:335646ab45c0 | 41 | DigitalOut motor1Direction(D7); |
BasB | 0:335646ab45c0 | 42 | FastPWM motor1Power(D6); |
BasB | 0:335646ab45c0 | 43 | |
BasB | 0:335646ab45c0 | 44 | //Motorcontrol |
BasB | 0:335646ab45c0 | 45 | bool motordir1; |
BasB | 0:335646ab45c0 | 46 | bool motordir2; |
BasB | 13:41fc5b6262c0 | 47 | float motor1ref=(-140.0-10.0)*deg2rad*5.5; |
BasB | 11:cd7be08f46b0 | 48 | float motor2ref=(-10.0)*deg2rad*2.75; |
BasB | 0:335646ab45c0 | 49 | double controlsignal1; |
BasB | 0:335646ab45c0 | 50 | double controlsignal2; |
BasB | 0:335646ab45c0 | 51 | double pi2= 6.283185; |
BasB | 0:335646ab45c0 | 52 | float motor1error; //motor 1 error |
BasB | 0:335646ab45c0 | 53 | float motor2error; |
BasB | 0:335646ab45c0 | 54 | float Kp=0.27; |
BasB | 0:335646ab45c0 | 55 | float Ki=0.35; |
BasB | 0:335646ab45c0 | 56 | float Kd=0.1; |
BasB | 0:335646ab45c0 | 57 | float u_p1; |
BasB | 0:335646ab45c0 | 58 | float u_p2; |
BasB | 0:335646ab45c0 | 59 | float u_i1; |
BasB | 0:335646ab45c0 | 60 | float u_i2; |
BasB | 0:335646ab45c0 | 61 | |
BasB | 0:335646ab45c0 | 62 | //Windup control |
BasB | 0:335646ab45c0 | 63 | float ux1; |
BasB | 0:335646ab45c0 | 64 | float ux2; |
BasB | 0:335646ab45c0 | 65 | float up1; //Proportional contribution motor 1 |
BasB | 0:335646ab45c0 | 66 | float up2; //Proportional contribution motor 2 |
BasB | 0:335646ab45c0 | 67 | float ek1; |
BasB | 0:335646ab45c0 | 68 | float ek2; |
BasB | 0:335646ab45c0 | 69 | float ei1= 0.0; //Error integral motor 1 |
BasB | 0:335646ab45c0 | 70 | float ei2=0.0; //Error integral motor 2 |
BasB | 0:335646ab45c0 | 71 | float Ka= 1.0; //Integral windup gain |
BasB | 0:335646ab45c0 | 72 | |
BasB | 0:335646ab45c0 | 73 | //RKI |
BasB | 0:335646ab45c0 | 74 | float Vx=0.0; //Desired linear velocity x direction |
BasB | 0:335646ab45c0 | 75 | float Vy=0.0; //Desired linear velocity y direction |
BasB | 11:cd7be08f46b0 | 76 | float q1=-10.0f*deg2rad; //Angle of first joint [rad] |
BasB | 13:41fc5b6262c0 | 77 | float q2=-140.0f*deg2rad; //Angle of second joint [rad] |
BasB | 0:335646ab45c0 | 78 | float q1dot; //Velocity of first joint [rad/s] |
BasB | 0:335646ab45c0 | 79 | float q2dot; //Velocity of second joint [rad/s] |
BasB | 0:335646ab45c0 | 80 | float l1=26.0; //Distance base-link [cm] |
BasB | 0:335646ab45c0 | 81 | float l2=62.0; //Distance link-endpoint [cm] |
BasB | 0:335646ab45c0 | 82 | float xe; //Endpoint x position [cm] |
BasB | 0:335646ab45c0 | 83 | float ye; //Endpoint y position [cm] |
BasB | 0:335646ab45c0 | 84 | |
BasB | 0:335646ab45c0 | 85 | //Hidscope |
BasB | 0:335646ab45c0 | 86 | HIDScope scope(6); //Going to send x channels of data. To access data go to 'http:/localhost:18082/' after starting HIDScope application. |
BasB | 0:335646ab45c0 | 87 | |
BasB | 3:6e28b992b99e | 88 | //State maschine |
BasB | 9:298469a70280 | 89 | enum Motor_States{motor_wait , motor_encoderset , motor_wait2 , motor_bewegen}; |
BasB | 3:6e28b992b99e | 90 | Motor_States motor_curr_state; |
BasB | 3:6e28b992b99e | 91 | bool motor_state_changed = true; |
BasB | 9:298469a70280 | 92 | bool motor_calibration_done = false; |
BasB | 9:298469a70280 | 93 | bool motor_RKI=false; |
BasB | 3:6e28b992b99e | 94 | bool button1_pressed = false; |
BasB | 3:6e28b992b99e | 95 | bool button2_pressed = false; |
BasB | 3:6e28b992b99e | 96 | |
BasB | 0:335646ab45c0 | 97 | // PC connection |
BasB | 0:335646ab45c0 | 98 | MODSERIAL pc(USBTX, USBRX); |
BasB | 0:335646ab45c0 | 99 | |
BasB | 0:335646ab45c0 | 100 | // Intializing tickers |
BasB | 0:335646ab45c0 | 101 | Ticker motorTicker; |
BasB | 0:335646ab45c0 | 102 | Ticker controlTicker; |
BasB | 0:335646ab45c0 | 103 | Ticker directionTicker; |
BasB | 0:335646ab45c0 | 104 | Ticker encoderTicker; |
BasB | 0:335646ab45c0 | 105 | Ticker scopeTicker; |
BasB | 3:6e28b992b99e | 106 | Ticker tickGlobal; //Global ticker |
BasB | 0:335646ab45c0 | 107 | |
BasB | 0:335646ab45c0 | 108 | const float PWM_period = 1e-6; |
BasB | 0:335646ab45c0 | 109 | |
BasB | 0:335646ab45c0 | 110 | volatile int counts1; // Encoder counts |
BasB | 0:335646ab45c0 | 111 | volatile int counts2; |
BasB | 10:990287a722d2 | 112 | volatile int counts1af; |
BasB | 10:990287a722d2 | 113 | volatile int counts2af; |
BasB | 10:990287a722d2 | 114 | int counts1offset; |
BasB | 10:990287a722d2 | 115 | int counts2offset; |
BasB | 0:335646ab45c0 | 116 | volatile int countsPrev1 = 0; |
BasB | 0:335646ab45c0 | 117 | volatile int countsPrev2 = 0; |
BasB | 0:335646ab45c0 | 118 | volatile int deltaCounts1; |
BasB | 0:335646ab45c0 | 119 | volatile int deltaCounts2; |
BasB | 0:335646ab45c0 | 120 | |
BasB | 0:335646ab45c0 | 121 | float factorin = 6.23185/64; // Convert encoder counts to angle in rad |
BasB | 0:335646ab45c0 | 122 | float gearratio = 131.25; // Gear ratio of gearbox |
BasB | 0:335646ab45c0 | 123 | |
BasB | 3:6e28b992b99e | 124 | void button1Press() |
BasB | 3:6e28b992b99e | 125 | { |
BasB | 3:6e28b992b99e | 126 | button1_pressed = true; |
BasB | 3:6e28b992b99e | 127 | } |
BasB | 0:335646ab45c0 | 128 | |
BasB | 6:e7e39d116ed0 | 129 | void button2Press() |
BasB | 6:e7e39d116ed0 | 130 | { |
BasB | 6:e7e39d116ed0 | 131 | button2_pressed = true; |
BasB | 6:e7e39d116ed0 | 132 | } |
BasB | 0:335646ab45c0 | 133 | |
BasB | 3:6e28b992b99e | 134 | // Ticker Functions |
BasB | 0:335646ab45c0 | 135 | void readEncoder() |
BasB | 0:335646ab45c0 | 136 | { |
BasB | 10:990287a722d2 | 137 | counts1af = encoder1.getPulses(); |
BasB | 10:990287a722d2 | 138 | deltaCounts1 = counts1af - countsPrev1; |
BasB | 10:990287a722d2 | 139 | countsPrev1 = counts1af; |
BasB | 0:335646ab45c0 | 140 | |
BasB | 10:990287a722d2 | 141 | counts2af = encoder2.getPulses(); |
BasB | 10:990287a722d2 | 142 | deltaCounts2 = counts2af - countsPrev2; |
BasB | 10:990287a722d2 | 143 | countsPrev2 = counts2af; |
BasB | 0:335646ab45c0 | 144 | } |
BasB | 0:335646ab45c0 | 145 | |
BasB | 9:298469a70280 | 146 | void PID_controller(){ |
BasB | 9:298469a70280 | 147 | |
BasB | 9:298469a70280 | 148 | static float error_integral1=0; |
BasB | 9:298469a70280 | 149 | static float e_prev1=motor1error; |
BasB | 9:298469a70280 | 150 | |
BasB | 9:298469a70280 | 151 | //Proportional part: |
BasB | 9:298469a70280 | 152 | u_p1=Kp*motor1error; |
BasB | 9:298469a70280 | 153 | |
BasB | 9:298469a70280 | 154 | //Integral part |
BasB | 9:298469a70280 | 155 | error_integral1=error_integral1+ei1*Ts; |
BasB | 9:298469a70280 | 156 | u_i1=Ki*error_integral1; |
BasB | 9:298469a70280 | 157 | |
BasB | 9:298469a70280 | 158 | //Derivative part |
BasB | 9:298469a70280 | 159 | float error_derivative1=(motor1error-e_prev1)/Ts; |
BasB | 9:298469a70280 | 160 | float u_d1=Kd*error_derivative1; |
BasB | 9:298469a70280 | 161 | e_prev1=motor1error; |
BasB | 9:298469a70280 | 162 | |
BasB | 9:298469a70280 | 163 | // Sum and limit |
BasB | 9:298469a70280 | 164 | up1= u_p1+u_i1+u_d1; |
BasB | 9:298469a70280 | 165 | if (up1>1){ |
BasB | 9:298469a70280 | 166 | controlsignal1=1;} |
BasB | 9:298469a70280 | 167 | else if (up1<-1){ |
BasB | 9:298469a70280 | 168 | controlsignal1=-1;} |
BasB | 9:298469a70280 | 169 | else { |
BasB | 9:298469a70280 | 170 | controlsignal1=up1;} |
BasB | 9:298469a70280 | 171 | |
BasB | 9:298469a70280 | 172 | // To prevent windup |
BasB | 9:298469a70280 | 173 | ux1= up1-controlsignal1; |
BasB | 9:298469a70280 | 174 | ek1= Ka*ux1; |
BasB | 9:298469a70280 | 175 | ei1= motor1error-ek1; |
BasB | 9:298469a70280 | 176 | |
BasB | 9:298469a70280 | 177 | // Motor 2 |
BasB | 9:298469a70280 | 178 | |
BasB | 9:298469a70280 | 179 | static float error_integral2=0; |
BasB | 9:298469a70280 | 180 | static float e_prev2=motor2error; |
BasB | 9:298469a70280 | 181 | |
BasB | 9:298469a70280 | 182 | //Proportional part: |
BasB | 9:298469a70280 | 183 | u_p2=Kp*motor2error; |
BasB | 9:298469a70280 | 184 | |
BasB | 9:298469a70280 | 185 | //Integral part |
BasB | 9:298469a70280 | 186 | error_integral2=error_integral2+ei2*Ts; |
BasB | 9:298469a70280 | 187 | u_i2=Ki*error_integral2; |
BasB | 9:298469a70280 | 188 | |
BasB | 9:298469a70280 | 189 | //Derivative part |
BasB | 9:298469a70280 | 190 | float error_derivative2=(motor2error-e_prev2)/Ts; |
BasB | 9:298469a70280 | 191 | float u_d2=Kd*error_derivative2; |
BasB | 9:298469a70280 | 192 | e_prev2=motor2error; |
BasB | 9:298469a70280 | 193 | |
BasB | 9:298469a70280 | 194 | // Sum and limit |
BasB | 9:298469a70280 | 195 | up2= u_p2+u_i2+u_d2; |
BasB | 9:298469a70280 | 196 | if (up2>1.0f){ |
BasB | 9:298469a70280 | 197 | controlsignal2=1.0f;} |
BasB | 9:298469a70280 | 198 | else if (up2<-1){ |
BasB | 9:298469a70280 | 199 | controlsignal2=-1.0f;} |
BasB | 9:298469a70280 | 200 | else { |
BasB | 9:298469a70280 | 201 | controlsignal2=up2;} |
BasB | 9:298469a70280 | 202 | |
BasB | 9:298469a70280 | 203 | // To prevent windup |
BasB | 9:298469a70280 | 204 | ux2= up2-controlsignal2; |
BasB | 9:298469a70280 | 205 | ek2= Ka*ux2; |
BasB | 9:298469a70280 | 206 | ei2= motor2error-ek2; |
BasB | 9:298469a70280 | 207 | } |
BasB | 9:298469a70280 | 208 | |
BasB | 9:298469a70280 | 209 | void RKI(){ |
BasB | 9:298469a70280 | 210 | |
BasB | 9:298469a70280 | 211 | if (motor_RKI==true){ |
BasB | 9:298469a70280 | 212 | q1dot=(l2*cos(q1+q2)*Vx+l2*sin(q1+q2)*Vy)/((-l1*sin(q1)-l2*sin(q1+q2))*l2*cos(q1+q2)+l2*sin(q1+q2)*(l1*cos(q1)+l2*cos(q1+q2))); |
BasB | 9:298469a70280 | 213 | q2dot=((-l1*cos(q1)-l2*cos(q1+q2))*Vx+(-l1*sin(q1)-l2*sin(q1+q2))*Vy)/((-l1*sin(q1)-l2*sin(q1+q2))*l2*cos(q1+q2)+l2*sin(q1+q2)*(l1*cos(q1)+l2*cos(q1+q2))); |
BasB | 9:298469a70280 | 214 | q1=q1+q1dot*Ts; |
BasB | 9:298469a70280 | 215 | q2=q2+q2dot*Ts; |
BasB | 9:298469a70280 | 216 | |
BasB | 9:298469a70280 | 217 | xe=l1*cos(q1)+l2*cos(q1+q2); |
BasB | 9:298469a70280 | 218 | ye=l1*sin(q1)+l2*sin(q1+q2); |
BasB | 9:298469a70280 | 219 | |
BasB | 9:298469a70280 | 220 | |
BasB | 9:298469a70280 | 221 | |
BasB | 9:298469a70280 | 222 | if (q1<0.0f){ |
BasB | 9:298469a70280 | 223 | q1=0.0;} |
BasB | 13:41fc5b6262c0 | 224 | else if (q1>65.0f*deg2rad){ |
BasB | 13:41fc5b6262c0 | 225 | q1=65.0f*deg2rad;} |
BasB | 9:298469a70280 | 226 | else{ |
BasB | 9:298469a70280 | 227 | q1=q1;} |
BasB | 9:298469a70280 | 228 | |
BasB | 13:41fc5b6262c0 | 229 | if (q2>-50.0*deg2rad){ |
BasB | 13:41fc5b6262c0 | 230 | q2=-50.0*deg2rad;} |
BasB | 9:298469a70280 | 231 | else if (q2<-135.0*deg2rad){ |
BasB | 9:298469a70280 | 232 | q2=-135.0*deg2rad;} |
BasB | 9:298469a70280 | 233 | else{ |
BasB | 9:298469a70280 | 234 | q2=q2;} |
BasB | 9:298469a70280 | 235 | |
BasB | 9:298469a70280 | 236 | motor1ref=5.5f*q1+5.5f*q2; |
BasB | 9:298469a70280 | 237 | motor2ref=2.75f*q1; |
BasB | 9:298469a70280 | 238 | } |
BasB | 9:298469a70280 | 239 | } |
BasB | 9:298469a70280 | 240 | |
BasB | 9:298469a70280 | 241 | |
BasB | 9:298469a70280 | 242 | void motorControl(){ |
BasB | 10:990287a722d2 | 243 | counts1= counts1af-counts1offset; |
BasB | 13:41fc5b6262c0 | 244 | motor1angle = (counts1 * factorin / gearratio)-((140.0*5.5*deg2rad)+(10.0*5.5*deg2rad)); // Angle of motor shaft in rad + correctie voor q1 en q2 |
BasB | 9:298469a70280 | 245 | omega1 = deltaCounts1 / Ts * factorin / gearratio; // Angular velocity of motor shaft in rad/s |
BasB | 9:298469a70280 | 246 | motor1error=motor1ref-motor1angle; |
BasB | 9:298469a70280 | 247 | if (controlsignal1<0){ |
BasB | 9:298469a70280 | 248 | motordir1= 0;} |
BasB | 9:298469a70280 | 249 | else { |
BasB | 9:298469a70280 | 250 | motordir1= 1;} |
BasB | 11:cd7be08f46b0 | 251 | |
BasB | 9:298469a70280 | 252 | motor1Power.write(abs(controlsignal1)); |
BasB | 9:298469a70280 | 253 | motor1Direction= motordir1; |
BasB | 9:298469a70280 | 254 | |
BasB | 10:990287a722d2 | 255 | counts2= counts2af - counts2offset; |
BasB | 11:cd7be08f46b0 | 256 | motor2angle = (counts2 * factorin / gearratio)-(10.0*2.75*deg2rad); // Angle of motor shaft in rad + correctie voor q1 |
BasB | 9:298469a70280 | 257 | omega2 = deltaCounts2 / Ts * factorin / gearratio; // Angular velocity of motor shaft in rad/s |
BasB | 9:298469a70280 | 258 | motor2error=motor2ref-motor2angle; |
BasB | 9:298469a70280 | 259 | if (controlsignal2<0){ |
BasB | 9:298469a70280 | 260 | motordir2= 0;} |
BasB | 9:298469a70280 | 261 | else { |
BasB | 9:298469a70280 | 262 | motordir2= 1;} |
BasB | 11:cd7be08f46b0 | 263 | if (motor_calibration_done == true){ |
BasB | 11:cd7be08f46b0 | 264 | motor2Power.write(abs(controlsignal2));} |
BasB | 9:298469a70280 | 265 | motor2Direction= motordir2; |
BasB | 9:298469a70280 | 266 | } |
BasB | 9:298469a70280 | 267 | |
BasB | 8:3cfc8be293d3 | 268 | void do_motor_wait(){ |
BasB | 3:6e28b992b99e | 269 | // Entry function |
BasB | 3:6e28b992b99e | 270 | if ( motor_state_changed == true ) { |
BasB | 3:6e28b992b99e | 271 | motor_state_changed = false; |
BasB | 3:6e28b992b99e | 272 | // More functions |
BasB | 3:6e28b992b99e | 273 | } |
BasB | 3:6e28b992b99e | 274 | |
BasB | 8:3cfc8be293d3 | 275 | // Do nothing until end condition is met |
BasB | 5:4d8b85b7cfc4 | 276 | |
BasB | 8:3cfc8be293d3 | 277 | // State transition guard |
BasB | 8:3cfc8be293d3 | 278 | if ( button2_pressed ) { |
BasB | 8:3cfc8be293d3 | 279 | button2_pressed = false; |
BasB | 8:3cfc8be293d3 | 280 | motor_curr_state = motor_encoderset; //Beginnen met calibratie |
BasB | 3:6e28b992b99e | 281 | motor_state_changed = true; |
BasB | 3:6e28b992b99e | 282 | // More functions |
BasB | 3:6e28b992b99e | 283 | } |
BasB | 8:3cfc8be293d3 | 284 | |
BasB | 8:3cfc8be293d3 | 285 | } |
BasB | 0:335646ab45c0 | 286 | |
BasB | 3:6e28b992b99e | 287 | void do_motor_Encoder_Set(){ |
BasB | 3:6e28b992b99e | 288 | // Entry function |
BasB | 3:6e28b992b99e | 289 | if ( motor_state_changed == true ) { |
BasB | 3:6e28b992b99e | 290 | motor_state_changed = false; |
BasB | 3:6e28b992b99e | 291 | // More functions |
BasB | 3:6e28b992b99e | 292 | } |
BasB | 7:676a83def149 | 293 | motor1Power.write(0.0f); |
BasB | 7:676a83def149 | 294 | motor2Power.write(0.0f); |
BasB | 10:990287a722d2 | 295 | counts1offset = counts1af ; |
BasB | 10:990287a722d2 | 296 | counts2offset = counts2af; |
BasB | 7:676a83def149 | 297 | |
BasB | 3:6e28b992b99e | 298 | // State transition guard |
BasB | 7:676a83def149 | 299 | if ( button2_pressed ) { |
BasB | 9:298469a70280 | 300 | button2_pressed = false; |
BasB | 9:298469a70280 | 301 | motor_calibration_done = true; |
BasB | 9:298469a70280 | 302 | motor_curr_state = motor_wait2; |
BasB | 3:6e28b992b99e | 303 | motor_state_changed = true; |
BasB | 3:6e28b992b99e | 304 | } |
BasB | 3:6e28b992b99e | 305 | } |
BasB | 3:6e28b992b99e | 306 | |
BasB | 9:298469a70280 | 307 | void do_motor_wait2(){ |
BasB | 9:298469a70280 | 308 | // Entry function |
BasB | 9:298469a70280 | 309 | if ( motor_state_changed == true ) { |
BasB | 9:298469a70280 | 310 | motor_state_changed = false; |
BasB | 9:298469a70280 | 311 | // More functions |
BasB | 9:298469a70280 | 312 | } |
BasB | 12:55b76c319364 | 313 | motor_RKI=true; |
BasB | 9:298469a70280 | 314 | // Do nothing until end condition is met |
BasB | 9:298469a70280 | 315 | |
BasB | 9:298469a70280 | 316 | // State transition guard |
BasB | 9:298469a70280 | 317 | if ( button2_pressed ) { |
BasB | 9:298469a70280 | 318 | button2_pressed = false; |
BasB | 10:990287a722d2 | 319 | motor_curr_state = motor_bewegen; |
BasB | 9:298469a70280 | 320 | motor_state_changed = true; |
BasB | 9:298469a70280 | 321 | // More functions |
BasB | 9:298469a70280 | 322 | } |
BasB | 9:298469a70280 | 323 | |
BasB | 9:298469a70280 | 324 | } |
BasB | 9:298469a70280 | 325 | |
BasB | 9:298469a70280 | 326 | void do_motor_bewegen(){ |
BasB | 9:298469a70280 | 327 | // Entry function |
BasB | 9:298469a70280 | 328 | if ( motor_state_changed == true ) { |
BasB | 9:298469a70280 | 329 | motor_state_changed = false; |
BasB | 9:298469a70280 | 330 | // More functions |
BasB | 9:298469a70280 | 331 | } |
BasB | 12:55b76c319364 | 332 | static float t=0; |
BasB | 12:55b76c319364 | 333 | Vx=6.0f*sin(1.0f*t); |
BasB | 12:55b76c319364 | 334 | Vy=0.0f; |
BasB | 12:55b76c319364 | 335 | t+=Ts; |
BasB | 12:55b76c319364 | 336 | |
BasB | 9:298469a70280 | 337 | if ( button2_pressed ) { |
BasB | 9:298469a70280 | 338 | button2_pressed = false; |
BasB | 9:298469a70280 | 339 | motor_RKI = false; |
BasB | 9:298469a70280 | 340 | motor_curr_state = motor_wait2; |
BasB | 9:298469a70280 | 341 | motor_state_changed = true; |
BasB | 9:298469a70280 | 342 | // More functions |
BasB | 9:298469a70280 | 343 | } |
BasB | 9:298469a70280 | 344 | |
BasB | 9:298469a70280 | 345 | |
BasB | 9:298469a70280 | 346 | } |
BasB | 9:298469a70280 | 347 | |
BasB | 3:6e28b992b99e | 348 | void motor_state_machine() |
BasB | 3:6e28b992b99e | 349 | { |
BasB | 3:6e28b992b99e | 350 | switch(motor_curr_state) { |
BasB | 3:6e28b992b99e | 351 | case motor_wait: |
BasB | 3:6e28b992b99e | 352 | do_motor_wait(); |
BasB | 3:6e28b992b99e | 353 | break; |
BasB | 3:6e28b992b99e | 354 | case motor_encoderset: |
BasB | 3:6e28b992b99e | 355 | do_motor_Encoder_Set(); |
BasB | 3:6e28b992b99e | 356 | break; |
BasB | 9:298469a70280 | 357 | case motor_wait2: |
BasB | 9:298469a70280 | 358 | do_motor_wait2(); |
BasB | 9:298469a70280 | 359 | break; |
BasB | 9:298469a70280 | 360 | case motor_bewegen: |
BasB | 9:298469a70280 | 361 | do_motor_bewegen(); |
BasB | 9:298469a70280 | 362 | break; |
BasB | 3:6e28b992b99e | 363 | } |
BasB | 3:6e28b992b99e | 364 | } |
BasB | 3:6e28b992b99e | 365 | |
BasB | 3:6e28b992b99e | 366 | // Global loop of program |
BasB | 3:6e28b992b99e | 367 | void tickGlobalFunc() |
BasB | 3:6e28b992b99e | 368 | { |
BasB | 3:6e28b992b99e | 369 | //sampleSignal(); |
BasB | 3:6e28b992b99e | 370 | //emg_state_machine(); |
BasB | 3:6e28b992b99e | 371 | motor_state_machine(); |
BasB | 4:1e8da6b5f147 | 372 | readEncoder(); |
BasB | 9:298469a70280 | 373 | PID_controller(); |
BasB | 9:298469a70280 | 374 | motorControl(); |
BasB | 9:298469a70280 | 375 | RKI(); |
BasB | 9:298469a70280 | 376 | |
BasB | 3:6e28b992b99e | 377 | // controller(); |
BasB | 3:6e28b992b99e | 378 | // outputToMotors(); |
BasB | 3:6e28b992b99e | 379 | } |
BasB | 3:6e28b992b99e | 380 | |
BasB | 3:6e28b992b99e | 381 | |
BasB | 0:335646ab45c0 | 382 | int main() |
BasB | 0:335646ab45c0 | 383 | { |
BasB | 0:335646ab45c0 | 384 | pc.baud(115200); |
BasB | 0:335646ab45c0 | 385 | pc.printf("\r\nStarting...\r\n\r\n"); |
BasB | 0:335646ab45c0 | 386 | motor1Power.period(PWM_period); |
BasB | 0:335646ab45c0 | 387 | motor2Power.period(PWM_period); |
BasB | 2:7ea5ae2287a7 | 388 | |
BasB | 3:6e28b992b99e | 389 | motor_curr_state = motor_wait; // Start off in EMG Wait state |
BasB | 3:6e28b992b99e | 390 | tickGlobal.attach( &tickGlobalFunc, Ts ); |
BasB | 0:335646ab45c0 | 391 | |
BasB | 4:1e8da6b5f147 | 392 | button1.fall(&button1Press); |
BasB | 6:e7e39d116ed0 | 393 | button2.fall(&button2Press); |
BasB | 0:335646ab45c0 | 394 | |
BasB | 0:335646ab45c0 | 395 | while (true) { |
BasB | 10:990287a722d2 | 396 | pc.printf("counts1offset %i counts1af: %i counts1: %i\r\n",counts1offset,counts1af,counts1); |
BasB | 10:990287a722d2 | 397 | pc.printf("counts2offset %i counts2af: %i counts2: %i\r\n",counts2offset,counts2af,counts2); |
BasB | 10:990287a722d2 | 398 | pc.printf("state: %i motor1ref: %f motor1angle: %f\r\n",motor_curr_state,motor1ref,motor1angle); |
BasB | 11:cd7be08f46b0 | 399 | pc.printf("q1: %f q2: %f motor1error: %f \r\n",q1*rad2deg,q2*rad2deg, motor1error); |
BasB | 11:cd7be08f46b0 | 400 | |
BasB | 0:335646ab45c0 | 401 | wait(0.5); |
BasB | 0:335646ab45c0 | 402 | } |
BasB | 0:335646ab45c0 | 403 | } |