![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
-
main.cpp
- Committer:
- NiNiHtayLwin
- Date:
- 2018-09-25
- Revision:
- 1:3b55e7add58b
- Parent:
- 0:8ffbb19fee71
File content as of revision 1:3b55e7add58b:
#include "mbed.h" #include "QEI.h" Serial pc(USBTX, USBRX); PwmOut pwmR (p21); DigitalOut pin_R1 (p22); DigitalOut pin_R2 (p23); PwmOut pwmL (p24); DigitalOut pin_L1 (p25); DigitalOut pin_L2 (p26); DigitalIn IRpin1 (p16); DigitalIn IRpin2 (p17); DigitalIn IRpin3 (p18); DigitalIn IRpin4 (p19); DigitalIn IRpin5 (p20); double voltR, voltL, voltRF, voltLF, prv_voltRF, prv_voltLF; int IRread1, IRread2, IRread3, IRread4, IRread5; int OIRread1, OIRread2, OIRread3, OIRread4, OIRread5; int act, des = 2000; double alpha = 0.5; double RFvelo, LFvelo, prv_RFvelo, prv_LFvelo; double err, errL, errF, now_time, samp_time; double prv_time, prv_err, prv_errF,prv_RveloErr,prv_LveloErr; double a,b,c; double a2,b2,c2; double now_ang1, prv_ang1, now_ang2, prv_ang2, now_omg1, now_omg2; double RF2velo,pr2v_RF2velo, prv_RF2velo,LF2velo, pr2v_LF2velo, prv_LF2velo; double now_x,prv_x,Rlevantvelo,prv_Rlevantvelo,now_e,now_u1,prv_u1,now_x1,prv_x1,Llevantvelo,prv_Llevantvelo,now_e1,now_u2,prv_u2; double W = 17.0; double PI = 3.1416; double fc = 2.5; double tau = 1/(2*PI*fc); double C = (2.0*PI*fc)*(2.0*PI*fc); double B = (2.0*PI*fc)*sqrt(2.0); double E = 500.0 * (10 ^ (4)); double alpha2 = 1.1 * E; double lambda = sqrt(E); double RactVelo, LactVelo, RdesVelo, LdesVelo, RveloErr, LveloErr, omega, VV; long counts_per_rev = (48*75); QEI wheel1 (p29, p27, NC, counts_per_rev, QEI::X2_ENCODING); QEI wheel2 (p30, p28, NC, counts_per_rev, QEI::X2_ENCODING); float pulsesToDegrees(float pulses) { return ((pulses/counts_per_rev)*360); } double sign(double xe) { if (xe > 0) { return 1; } else { return -1; } } int main() { Timer myTime; myTime.reset(); myTime.start(); pc.baud(57600); while(1) { IRread1 = IRpin1.read(); IRread2 = IRpin2.read(); IRread3 = IRpin3.read(); IRread4 = IRpin4.read(); IRread5 = IRpin5.read(); now_time = myTime.read_us()/1000000.0; samp_time = now_time - prv_time; now_ang1 = pulsesToDegrees(wheel1.getPulses()); RactVelo = (now_ang1 - prv_ang1)/samp_time; now_ang2 = pulsesToDegrees(wheel2.getPulses()); LactVelo = (now_ang2 - prv_ang2)/samp_time; if(IRread1 == 0) {OIRread1 = 1;} else if(IRread1 == 1) {OIRread1 = 0;} if(IRread2 == 0) {OIRread2 = 1;} else if(IRread2 == 1) {OIRread2 = 0;} if(IRread3 == 0) {OIRread3 = 1;} else if(IRread3 == 1) {OIRread3 = 0;} if(IRread4 == 0) {OIRread4 = 1;} else if(IRread4 == 1) {OIRread4 = 0;} if(IRread5 == 0) {OIRread5 = 1;} else if(IRread5 == 1) {OIRread5 = 0;} act = ((IRread1*(0))+(IRread2*(1000))+(IRread3*(2000))+(IRread4*(3000))+(IRread5*(4000)))/ (IRread1 + IRread2 + IRread3 + IRread4 + IRread5) ; err = des - act ; errL = err + (alpha * ((err - prv_err)/samp_time )); omega = (err*0.05) + (((err - prv_err)/samp_time)*0.1); VV = (390.0); RdesVelo = VV - (omega*(W/2.0)); LdesVelo = VV + (omega*(W/2.0)); RFvelo = ( samp_time * RactVelo + (tau * prv_RFvelo) ) / ( samp_time + tau); LFvelo = ( samp_time * LactVelo + (tau * prv_LFvelo) ) / ( samp_time + tau); a = ((samp_time*samp_time)*C)*RactVelo; b = (2.0+(samp_time*B))*prv_RF2velo; c = pr2v_RF2velo; RF2velo = (a+b-c)/(((samp_time*samp_time)*C)+(samp_time*B)+1.0); a2 = ((samp_time*samp_time)*C)*LactVelo; b2 = (2.0+(samp_time*B))*prv_LF2velo; c2 = pr2v_LF2velo; LF2velo = (a2+b2-c2)/(((samp_time*samp_time)*C)+(samp_time*B)+1.0); now_x = (prv_Rlevantvelo* samp_time) + prv_x; now_e = now_x - now_ang1; now_u1 = (-alpha2 * sign(now_e) * samp_time) + prv_u1; Rlevantvelo = now_u1 - (lambda * sqrt(abs(now_e)) * sign(now_e)); now_x1 = (prv_Llevantvelo* samp_time) + prv_x1; now_e1 = now_x1 - now_ang2; now_u2 = (-alpha2 * sign(now_e1) * samp_time) + prv_u2; Llevantvelo = now_u1 - (lambda * sqrt(abs(now_e1)) * sign(now_e1)); RveloErr = RdesVelo -RFvelo ; LveloErr = LdesVelo -LFvelo; voltR = RveloErr *0.03+(((RveloErr - prv_RveloErr)/samp_time)*0); voltL = LveloErr*0.03+(((LveloErr - prv_LveloErr)/samp_time)*0); voltRF = ( samp_time * voltR + (tau * prv_voltRF) ) / ( samp_time + tau); voltLF = ( samp_time * voltL + (tau * prv_voltLF) ) / ( samp_time + tau); if (voltR>0) { pin_R1 = 0; pin_R2 = 1; } else { pin_R1 = 1; pin_R2 = 0; } if (voltL>0) { pin_L1 = 0; pin_L2 = 1; } else { pin_L1 = 1; pin_L2 = 0; } pwmR = (abs(voltR)/12.0); pwmL = (abs(voltL)/12.0); if (pwmR>1) {pwmR = 1;} else {pwmR = pwmR;} if (pwmL>1) {pwmL = 1;} else {pwmL = pwmL;} pc.printf(" %f %f ",RactVelo,Rlevantvelo); //pc.printf(" %f", samp_time ); printf("\n\r"); //on left motor, red and black cables are crossed-connected to have forward movement when pin_L1=1 & pin_L2=0. //on breadboard, + line represent +5v. - line represent GND. 12v is only used to supply L298. prv_time = now_time; prv_ang1 = now_ang1; prv_ang2 = now_ang2; prv_err = err; prv_errF = errF; prv_voltRF = voltRF; prv_voltLF = voltLF; prv_RFvelo = RFvelo; prv_LFvelo = LFvelo; prv_RveloErr = RveloErr; prv_LveloErr = LveloErr; prv_RF2velo = RF2velo; pr2v_RF2velo = prv_RF2velo; prv_LF2velo = LF2velo; pr2v_LF2velo = prv_LF2velo; prv_x =now_x; prv_u1 =now_u1; prv_x1 =now_x1; prv_u2 =now_u2; prv_Rlevantvelo =Rlevantvelo; prv_Llevantvelo =Llevantvelo; } }