EW306 Motor Position Control with SVFB
Dependencies: mbed mbedWSEsbc
Diff: main.cpp
- Revision:
- 1:d1a8fb968a8e
- Parent:
- 0:76487bb2de87
- Child:
- 2:a5d160c21ec4
--- a/main.cpp Tue Mar 07 14:44:39 2017 +0000 +++ b/main.cpp Wed Apr 10 02:40:42 2019 +0000 @@ -2,11 +2,17 @@ #include "mbedWSEsbc.h" #define PI 3.14159 -#define LOG_FREQ 2.0 -#define CTRL_FREQ 200.0 +#define LOG_FREQ 100.0 +#define CTRL_FREQ 100.0 DigitalOut myled(LED1); +float tstop = 180; //initialize stop time +float dc = 0; //initialize dc variable +float dt = 1/CTRL_FREQ; // set control loop sample time +float enc; +float ang; + int main() { @@ -18,13 +24,11 @@ wait(.2); //delay at beginning for voltage settle purposes t.start(); // Set up timer - pc.printf("Quanser Twin Tank Control Data Aquisition Program\r\n"); + pc.printf("Quanser DC Motor Control Data Aquisition Program\r\n"); t.reset(); // zero timer float sampT = t.read(); - float tstop = 180; //initialize stop time - float dc = 0; //initialize dc variable - float dt = 1/CTRL_FREQ; // set control loop sample time + while(1) { @@ -64,14 +68,15 @@ run_ctrl = false; } - - if(run_flag) { - //Prime the pump for a few seconds - mot_control(1,-1.0); wait(1); t.reset(); + //Pendulum Posiiton when code starts will be the reference position + 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); log_timer = 0; while(t.read() < tstop) { @@ -81,28 +86,24 @@ break; } - // read analog to digital chip for presssure sensors - float tank2 = read_max1270_volts(0, 1, 1); //chan, range, bipol - float tank1 = read_max1270_volts(1, 1, 1); - - //Logic to exit loop if tank gets too full - if(tank1 > 4.1 || tank2 > 4.1) { - pc.printf("%.2f, %.3f, %.3f, %.3f\r\n", t.read(),tank1,tank2,dc); - break; - } - - //Convert Voltage to Height + // Read Encoder + // Read encoder + float enc = (float)LS7366_read_counter(2); + + // Convert from counts to radians + ang = 2*PI*enc/1024; + + // Estimate States if(run_ctrl) { //If controller is active - - + // Control Law Goes Here - - + //Convert flow rate to duty cycle; - }else{ // if open loop test + }else{ // if open loop test + } @@ -117,14 +118,15 @@ //Set the new output. - mot_control(1, -dc); // negative value required due to polarity of pump motor + mot_control(1, -dc); // negative value required due to polarity of motor if( (t.read()- log_timer) >= (1.0/LOG_FREQ)) { //If log sample time has passed since last write - pc.printf("%.2f, %.3f, %.3f, %.3f\r\n", t.read(),tank1,tank2,dc); //write data to scren + pc.printf("%.3f, %.3f, %.3f\r\n", t.read(),ang,dc); //write data to scren log_timer = t.read(); } + led3=!led3; //Flash Led to Indicate program is running wait(dt); //Wait for sample time of loop frequency } // while t < tstop