test not done
Dependencies: mbed QEI QEI_hw SDFileSystem
main.cpp
- Committer:
- chanaka_madhusanka
- Date:
- 2019-10-30
- Revision:
- 1:a7c5a3920ba8
- Parent:
- 0:0205108c2c99
File content as of revision 1:a7c5a3920ba8:
#include "mbed.h" #include "SDFileSystem.h" #include "QEI.h" #include <math.h> SDFileSystem sd(p5, p6, p7, p8, "sd"); // the pinout on the mbed Cool Components workshop board p5 - mosi, p6-miso, p7 - sck, p8 - cs Serial pc (USBTX,USBRX); QEI wheel (p29, p30, NC, 2000, QEI::X4_ENCODING); //to get encoder position //int i= 2; int value = 0; void PID(); void motor(); void DOB(double derivative_position); void RTOB(double derivative_position); void sendDAC(int value); void file_writer(double input, double torque); double dt=0.0002,t=0; //time double Kp=0,Ki=0,Kd=0; //pid double torque_rtob,rtob_filter_input, rtob_filter_output, rtob_filter_integral = 0, rtob_additional_torque; // double torque_dob, dob_filter_input, dob_filter_output, dob_filter_integral = 0; double pre_val=0, g_dis=150, error_val=5, k=0.000000085, torque_command, pre_position=0,derivative_val, J=0.462, Jn=0.462, Kt1=25.0, Kt2=25.0, pid_val, motor_voltage, motor_input, motor_torque, motor_current, load_torque, integral1, theta_dot = 0, theta; //DAC 712 DigitalOut dac_a0(p13); DigitalOut dac_a1(p12); DigitalOut dac_wr(p9); DigitalOut dac_clr(p10); DigitalOut dac_d15(p15); DigitalOut dac_d14(p16); DigitalOut dac_d13(p17); DigitalOut dac_d12(p18); DigitalOut dac_d11(p19); DigitalOut dac_d10(p20); DigitalOut dac_d9(p21); DigitalOut dac_d8(p22); DigitalOut dac_d7(p23); DigitalOut dac_d6(p24); DigitalOut dac_d5(p25); DigitalOut dac_d4(p26); DigitalOut dac_d3(p27); DigitalOut dac_d2(p28); DigitalOut dac_d1(p11); DigitalOut dac_d0(p14); int main(){ float val = 32767/10; int sendval; double position; double x; //while(1){ //reverse loop dac_a0 = 0; dac_a1 = 1; dac_clr = 1; sendval = int(val * 0.06*(0.9)); //for maximum torque = 46.75 voltage = 2.805 >>> 0 is not zero. Eventhough "0.9" is a positive it gives negative direction movement for "3" it gives positive movement sendDAC(sendval); dac_a0 = 1; dac_a1 = 0; wait(0.1); //to change the back velocity dac_a0 = 0; dac_a1 = 1; dac_clr = 1; sendval = int(val * 0.06*(1.4)); //for maximum torque = 46.75 voltage = 2.805 >>> 0 is not zero. Eventhough "0.9" is a positive it gives negative direction movement for "3" it gives positive movement sendDAC(sendval); dac_a0 = 1; dac_a1 = 0; wait(3); //to change the back velocity //forward loop dac_a0 = 0; dac_a1 = 1; sendval = int(val * 0.06*(6)); sendDAC(sendval); dac_a0 = 1; dac_a1 = 0; wait(4); position = 0; x = -wheel.getPulses()/200.0; double torque; torque = 25*0.6*0.4*(0.0284*(15)+0.1436)/1.2796; //maximum percentage is 40... range 0-40 while(-0.01>error_val | error_val>0.01) { //minimize the error value between reation torque and torque pc.printf("%lf\t %lf\t %lf\r\n",pid_val,torque_rtob,error_val); position = (-wheel.getPulses()/200.0)-x; //////////////// double derivative_position = (position-pre_position)/dt; pre_position = position; error_val = torque - torque_rtob; PID(); //DOB(derivative_position); RTOB(derivative_position); motor_voltage = ((pid_val*J)/25)*(1.2796/(0.6*0.4)); //motor_input = motor_voltage + ((torque_dob/25)*(1.2796/(0.6*0.4))); //sendVal=motor_input motor_input = motor_voltage; dac_a0 = 0; dac_a1 = 1; sendval = motor_input; sendDAC(sendval); dac_a0 = 1; dac_a1 = 0; //fprintf (fp3, "%f %f %f\n",t,torque_rtob,load_torque); t+=0.0002; } if((wheel.getPulses()/200.0)<6){ //file_writer(position,torque_rtob); } pc.printf("Pulses is: %lf\t %lf\r\n",position,torque_rtob); //for(double i = 1 ; i<=20 ; i+=0.2){ //to increase torque // // double torque; // // if(i<10.1){ // // torque = 25*0.6*0.4*(0.0284*(6+i)+0.1436)/1.2796; //maximum percentage is 40... range 0-40 // // while(-0.1>error_val | error_val>0.1) { //minimize the error value between reation torque and torque // pc.printf("%lf\t %lf\t %lf\r\n",torque,torque_rtob,position); // // position = (-wheel.getPulses()/200.0)-x; //////////////// // // double derivative_position = (position-pre_position)/dt; // pre_position = position; // // error_val = torque - torque_rtob; // // PID(); // // motor_voltage = ((pid_val*J)/25)*(1.2796/0.6*0.4); // // motor_input = motor_voltage + ((torque_dob/25)*(1.2796/0.6*0.4)); //sendVal=motor_input // // dac_a0 = 0; // dac_a1 = 1; // sendval = motor_input; // sendDAC(sendval); // dac_a0 = 1; // dac_a1 = 0; // // DOB(derivative_position); // RTOB(derivative_position); // // //fprintf (fp3, "%f %f %f\n",t,torque_rtob,load_torque); // // t+=0.0002; // } // // if((wheel.getPulses()/200.0)<6){ // //file_writer(position,torque_rtob); // } // pc.printf("Pulses is: %lf\t %lf\r\n",position,torque_rtob); // // if(i>9.9){ // for(int j=1; j<500 ;j++){ // pc.printf("Wait position : %lf\t %lf\r\n",-(wheel.getPulses()/200.0)-x,torque); // } // } // }else if(i>=10.1){ // // dac_a0 = 0; // dac_a1 = 1; // sendval = int(val * 0.06*(6+20-i)); // sendDAC(sendval); // dac_a0 = 1; // dac_a1 = 0; // torque = 25*0.6*0.4*(0.0284*(6+20-i)+0.1436)/1.2796 // position = (-wheel.getPulses()/200.0)-x; // // if((wheel.getPulses()/200.0)<6){ // //file_writer(position,torque); // } // pc.printf("Pulses is: %lf\t %lf\r\n",position,torque); // } // wait(0.05); // } //} } //set voltages to dac void sendDAC(int value){ int remainder = 0; dac_clr = 0; wait_us(120); dac_clr = 1; //send output dac dac_wr = 1; if(value >= 0){ if(value >= 32767){ dac_d15 = 0; dac_d14= 1; dac_d13 = 1; dac_d12 = 1; dac_d11 = 1; dac_d10 =1; dac_d9 = 1; dac_d8 = 1; dac_d7 = 1; dac_d6 = 1; dac_d5 = 1; dac_d4 = 1; dac_d3 = 1; dac_d2 = 1; dac_d1 =1; dac_d0 = 1; } else { dac_d15 = 0; dac_d14 = value / 16384 ; remainder = value - dac_d14.read() * 16384; dac_d13 = remainder / 8192; remainder = remainder - dac_d13.read() * 8192; dac_d12 = remainder / 4096; remainder = remainder - dac_d12.read() * 4096; dac_d11 = remainder / 2048; remainder = remainder - dac_d11.read() * 2048; dac_d10 = remainder / 1024; remainder = remainder - dac_d10.read() * 1024; dac_d9 = remainder / 512; remainder = remainder - dac_d9.read() * 512; dac_d8 = remainder / 256; remainder = remainder - dac_d8.read() * 256; dac_d7 = remainder / 128; remainder = remainder - dac_d7.read() * 128; dac_d6 = remainder / 64; remainder = remainder - dac_d6.read() * 64; dac_d5 = remainder / 32; remainder = remainder - dac_d5.read() * 32; dac_d4 = remainder / 16; remainder = remainder - dac_d4.read() * 16; dac_d3 = remainder / 8; remainder = remainder - dac_d3.read() * 8; dac_d2 = remainder / 4; remainder = remainder - dac_d2.read() * 4; dac_d1 = remainder / 2; remainder = remainder - dac_d1.read() * 2; dac_d0 = remainder ; } } if (value < 0){ if(value <= -32768){ dac_d15 = 1; dac_d14= 0; dac_d13 = 0; dac_d12 = 0; dac_d11 = 0; dac_d10 =0; dac_d9 = 0; dac_d8 = 0; dac_d7 = 0; dac_d6 = 0; dac_d5 = 0; dac_d4 = 0; dac_d3 = 0; dac_d2 = 0; dac_d1 =0; dac_d0 = 0; } else{ dac_d15 = 1; dac_d14 = ( 32768 + value) / 16384 ; remainder = ( 32768 + value) - dac_d14.read() * 16384; dac_d13 = remainder / 8192; remainder = remainder - dac_d13.read() * 8192; dac_d12 = remainder / 4096; remainder = remainder - dac_d12.read() * 4096; dac_d11 = remainder / 2048; remainder = remainder - dac_d11.read() * 2048; dac_d10 = remainder / 1024; remainder = remainder - dac_d10.read() * 1024; dac_d9 = remainder / 512; remainder = remainder - dac_d9.read() * 512; dac_d8 = remainder / 256; remainder = remainder - dac_d8.read() * 256; dac_d7 = remainder / 128; remainder = remainder - dac_d7.read() * 128; dac_d6 = remainder / 64; remainder = remainder - dac_d6.read() * 64; dac_d5 = remainder / 32; remainder = remainder - dac_d5.read() * 32; dac_d4 = remainder / 16; remainder = remainder - dac_d4.read() * 16; dac_d3 = remainder / 8; remainder = remainder - dac_d3.read() * 8; dac_d2 = remainder / 4; remainder = remainder - dac_d2.read() * 4; dac_d1 = remainder / 2 ; remainder = remainder - dac_d1.read() * 2; dac_d0 = remainder ; } } dac_wr = 0; } void file_writer(double position,double torque){ mkdir("/sd/mydir", 0777); FILE *fp = fopen("/sd/mydir/sdtesthys.txt", "a"); if(fp == NULL){ error("Could not open file for write\n"); } fprintf(fp,"%lf\t %lf\t \r\n",position,torque); fclose(fp); } //PID controller void PID(){ integral1 = integral1 + error_val*dt; derivative_val = (error_val - pre_val)/dt; pre_val = error_val; pid_val = (0*error_val)+(0*integral1)+(0*derivative_val); } //disturbance observer void DOB(double derivative_position){ //disturbance observer dob_filter_input = (derivative_position * g_dis * Jn) + (motor_input * Kt2 * (0.6*0.4/1.2796)); //g = g_dis / J_n / filter_input_dob = dob_filter_input dob_filter_integral = dob_filter_integral + ((dob_filter_input - dob_filter_output) * dt); //filter dob_filter_output = g_dis * dob_filter_integral; torque_dob = dob_filter_output - (Jn * g_dis); } //reaction torque observer void RTOB(double derivative_position){ rtob_additional_torque = 1.10745; //ask sir rtob_filter_input = (derivative_position * g_dis * Jn) + (motor_input * Kt2 * (0.6*0.4/1.2796)) - rtob_additional_torque; rtob_filter_integral = rtob_filter_integral + ((rtob_filter_input - rtob_filter_output) * dt); //fil rtob_filter_output = g_dis * rtob_filter_integral; torque_rtob = rtob_filter_output - (derivative_position * g_dis * Jn); } //Threading code void thread_2(void const *argument){ while(1){ //pc.printf("%i\t %f %f\t \r\n)",count,dx_res,I_msrd); //file_writer(); } }