![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
Code used for Active suspension experiment in ES301 Fall 2014
Dependencies: PID mbed mbedWSEsbc
main.cpp
- Committer:
- jdawkins
- Date:
- 2015-10-20
- Revision:
- 0:ac9d425a8b57
File content as of revision 0:ac9d425a8b57:
#include "mbed.h" #include "mbedWSEsbc.h" #define PI 3.14159 #define LOG_FREQ 100; #define CTRL_FREQ 1000; DigitalOut myled(LED1); int main() { float Kp = 0.0028;//2*7.92; Ku = 25;Tuned with ziger-nichols float Ki = 0.002;//1.5*8; float Kd = 0.000;//0*0.115; float dt = 0.001; float err,err_i,err_d,err_old=0; float pwm = 0; float write_timer = 0; bool is_square = false; bool run_flag = false; mbedWSEsbcInit(921600); //Initialize the mbed WSE Project SBC wait(.2); //delay at beginning for voltage settle purposes t.start(); // Set up timer pc.printf("Quanser Active Suspension Demo\r\n"); t.reset(); // zero timer float sampT = t.read(); float tstop = 10; float sine_amp = 1000.0; float freq = 1; while(1) { if(pc.readable()) { char c = pc.getc(); if(c == 'A' || c == 'a') { pc.scanf("%f",&sine_amp); } if(c == 'F' || c == 'f') { pc.scanf("%f",&freq); } if(c == 'Q' || c == 'q') { is_square = true; } if(c == 'R' || c == 'r') { run_flag = true; } if(c == 'S' || c == 's') { is_square = false; } if(c == 'T' || c == 't') { pc.scanf("%f",&tstop); } if(c == 'u' || c == 'U') { pc.printf("Enter value for Amplitude (0 - 5000 max). Current Amp is %.1f\r\n", sine_amp); pc.scanf("%f",&sine_amp); pc.printf("Enter value for Frequency in Hertz. Current Freq is %.1f Hz\r\n", freq); pc.scanf("%f",&freq); pc.printf("Enter value for Run Duration in Seconds\r\n", freq); pc.scanf("%f",&tstop); } if(c == ' ') { mot_control(1, 0.0); wait(2); pc.printf("Stopped and Gains Zeroed\r\n"); pc.printf("Press any key to continue...\r\n"); while(!pc.readable()); } if(abs(sine_amp) >5000) sine_amp = 5000; if(run_flag){ err_i = 0; err = 0; err_d = 0; err_old = 0; LS7366_write_DTR(1,0); //zero encoder channel 1 LS7366_reset_counter(1); LS7366_write_DTR(2,0); //zero encoder channel 1 LS7366_reset_counter(2); t.reset(); while(t.read() < tstop){ // update the set point float enc_cmd = sine_amp * sin(2*PI*freq*t.read()); if(is_square){ if(enc_cmd > 0){ enc_cmd = sine_amp; }else if (enc_cmd < 0){ enc_cmd = -sine_amp; }else{ enc_cmd = 0; } } // if(t.read() > tstop){ // enc_cmd = 0; //} //Update the process variable. float enc1 = (float)LS7366_read_counter(1); err = enc_cmd - enc1; err_i += err*dt; err_d = (err-err_old)/dt; pwm = -(Kp*err + Kd*err_d +Ki*err_i); if(pwm>1.0){ pwm =1.0; } else if(pwm<-1.0){ pwm = -1.0; } else{} //Set the new output. mot_control(1, pwm); float enc2 = -(float)LS7366_read_counter(2); float adc0 = read_max1270_volts(0, 1, 1); //chan, range, bipol // if( (t.read()- write_timer) >= 0.01){ pc.printf("%.1f, %.1f, %.1f, %.3f, %.3f\r\n", enc_cmd, enc1, enc2, pwm, adc0); // } led3=!led3; err_old = err; wait(dt); } // while t < tstop run_flag = false; is_square = false; } //if run flag } // if pc.readable }//while }//main