velo_filter
/
newprogram
updatw 08/09/18
main.cpp
- Committer:
- k_waihlyan
- Date:
- 2018-09-16
- Revision:
- 1:087dfa2bff27
- Parent:
- 0:8e7dc5d573f7
File content as of revision 1:087dfa2bff27:
#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 speedDiff; double err, errL, errF, now_time, samp_time; double prv_time, prv_err, prv_errF; double now_ang1, prv_ang1, now_ang2, prv_ang2, now_omg1, now_omg2; double PI = 3.1416; double fc = 0.5; double tau = 1/(2*PI*fc); 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); } 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()); now_omg1 = (now_ang1 - prv_ang1)/samp_time; now_ang2 = pulsesToDegrees(wheel2.getPulses()); now_omg2 = (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 )); //errF = ((errL*samp_time) + (tau*prv_errF))/( tau + samp_time ); speedDiff = (errL*0.004);// + (0.0001*((err - prv_err)/samp_time)); voltR = 12.0 - speedDiff; voltL = 12.0 + speedDiff; //voltR = voltR*1.0; //voltL = voltL*1.0; voltRF = ( samp_time * voltR + (tau * prv_voltRF) ) / ( samp_time + tau); voltLF = ( samp_time * voltL + (tau * prv_voltLF) ) / ( samp_time + tau); // voltRF = 10.0; //voltLF = 10.0; if (voltRF>8) {voltRF = 8;} else {voltRF = voltRF;} if (voltLF>8) {voltLF = 8;} else {voltLF = voltLF;} if (voltRF>0) { pin_R1 = 0; pin_R2 = 1; } else { pin_R1 = 1; pin_R2 = 0; } if (voltLF>0) { pin_L1 = 0; pin_L2 = 1; } else { pin_L1 = 1; pin_L2 = 0; } pwmR = (abs(voltRF)/12.0); pwmL = (abs(voltLF)/12.0); if (pwmR>1) {pwmR = 1;} else {pwmR = pwmR;} if (pwmL>1) {pwmL = 1;} else {pwmL = pwmL;} //pc.printf(" %f %d %d %f %f %f %f %f %d %d %d %d %d\r", now_time, des, act, err, errL, errF, voltL, voltR, IRread1, IRread2, IRread3, IRread4, IRread5 ); //pc.printf(" %f %f %f\r", err, errL, errF); //pc.printf(" %d %d %f %f %f", des,act,err,now_omg1,now_omg2); pc.printf("%f %f", now_omg1,now_omg2); 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; } }