Luke Ledva
/
ES305
asdfghj
Revision 0:eb94c702a103, committed 2017-11-28
- Comitter:
- m193672
- Date:
- Tue Nov 28 04:22:29 2017 +0000
- Commit message:
- asdfghjk
Changed in this revision
diff -r 000000000000 -r eb94c702a103 MotorID.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MotorID.cpp Tue Nov 28 04:22:29 2017 +0000 @@ -0,0 +1,231 @@ +/************************************************************************************* +Program Name: ES305 Laboratory Experiment 1, part 1 - mbed serial setup and streaming +Description: A basic code to run a DC motor using a Ticker object. The user specifies +sun rimte, and duty cycle. The program runs at 100 Hz and streams data at 50 Hz +Author: Levi DeVries, PhD, USNA +Date: 8/14/2017 +**************************************************************************************/ + +// Include necessary libraries +#include "mbed.h" +#include "mbedWSEsbc.h" +#define PI (3.14159) + + +// Declare objects (if necessary) +Ticker Controller; // declare Ticker object named "Controller" +DigitalOut myled(LED1); // LED, flash lights for debugging + + +// variables for data handling and storage +float TotalTime; // Total run time +float Time; // Current elapsed time +float Ts = 0.0083; // Control update period (seconds) (100 Hz equivalent) +float Tstrm = 0.01; // Data streaming period (seconds) (50 Hz equivalent) +float usrDC; // uaser-specified duty cycle +float ang,angp,speed; // variables for approximating speed from encoder measurements +float dc; // duty cycle applied to motor +long enc1; // encoder variable +float lowDC; +float dspd; +float spdErr; +float Kp; +float dc_p = 0.0; +float spdErr_p = 0.0; + + + + +// Function definition Prototypes (declarations) +void ctrCode(); // declare that a separate (other than main) function named "ctrCode" exists +void twoStepCode(); +void pCtrlCode(); +void PIctrlCode(); + + +// Enter main function +int main () +{ + // Initializes mbed to access functionality of encoder, A/D, driver, etc. chipsets + // Input is baud rate for PC communication + mbedWSEsbcInit(115200); // also initializes timer object t + mot_en1.period(0.020); // sets PWM period to 0.02 seconds for best DC motor operation + + while(1) { + + // Scan serial port for user input to begin experiment + //pc.scanf("%f,%f",&TotalTime,&lowDC); + pc.scanf("%f,%f,%f",&TotalTime,&dspd,&Kp); + + // perform necessary functions to time the experiment + Time = 0.0; // reset time variable + t.reset(); // reset timer object + + // Attach the ctrCode function to ticker object specified with period Ts + //Controller.attach(&twoStepCode,Ts); + Controller.attach(&PIctrlCode,Ts); + + t.start(); // start measuring elapsed time + + // perform operations while the elapsed time is less than the desired total time + while(Time <= TotalTime) { + + + + // read current elapsed time + Time = t.read(); + + + // send data over serial port + pc.printf("%f,%f,%f\n",Time,speed,dc); + + + wait(Tstrm); // print data at approximately 50 Hz + + + + + } // end while(Time<=Ttime) + + Controller.detach(); // detach ticker to turn off controller + // Turn motor off at end of experiment + mot_control(1,0.0); + + }// end while(1) +}// end main + + + +// Additional function definitions +void ctrCode() // function to attach to ticker +{ + + myled = !myled; // toggle LED 2 to indicate control update + + // Read encoder + enc1 = LS7366_read_counter(1); // input is the encoder channel + + // Convert from counts to radians + ang = 2.0*PI*enc1/6400.0; + + // Estimate speed + speed = (ang-angp)/Ts; + + // Age variables + angp = ang; + + // compute duty cycle for motor (will be changed later!) + dc = usrDC; // user-specified duty cycle + + // motor control + mot_control(1,dc); // first input is the motor channel, second is duty cycle + +} // end ctrCode() + + + + +// Additional function definitions +void twoStepCode() // function to attach to ticker +{ + myled = !myled; // toggle LED 2 to indicate control update + + // Read encoder + enc1 = LS7366_read_counter(1); // input is the encoder channel + + // Convert from counts to radians + ang = 2.0*PI*enc1/6400.0; + + // Estimate speed + speed = (ang-angp)/Ts; + + // Age variables + angp = ang; + + // compute duty cycle for motor over two step inputs + if(Time<0.1) { + dc = 0.0; + } else if(Time<0.55) { + dc = lowDC; // low duty cycle + } else { + dc = 0.10; + } + // motor control + mot_control(1,dc); // first input is the motor channel, second is duty cycle +} // end twoStepCode() + +void pCtrlCode() // function to attach to ticker +{ + myled = !myled; // toggle LED 2 to indicate control update + + // Read encoder + enc1 = LS7366_read_counter(1); // input is the encoder channel + + // Convert from counts to radians + ang = 2.0*PI*enc1/6400.0; + + // Estimate speed + speed = (ang-angp)/Ts; + + // Age variables + angp = ang; + + // compute error + spdErr = dspd-speed; + + // compute duty cycle for motor + if(Time<0.1) { + dc = 0.0; + } else { + dc = Kp*(spdErr); + } + // enforce duty cycle saturation + if(dc>1.0) { + dc = 1.0; + } else if(dc<-1.0) { + dc = -1.0; + } + // motor control + mot_control(1,dc); // first input is the motor channel, second is duty cycle +} + +void PIctrlCode() // function to attach to ticker +{ + myled = !myled; // toggle LED 2 to indicate control update + + // Read encoder + enc1 = LS7366_read_counter(1); // input is the encoder channel + + // Convert from counts to radians + ang = 2.0*PI*enc1/6400.0; + + // Estimate speed + speed = (ang-angp)/Ts; + + // Age variables + angp = ang; + + // compute error + spdErr = dspd-speed; + + + // compute duty cycle for motor + if(Time<0.1) { + dc = 0.0; + } else { + dc = dc_p + 0.03554*spdErr - 0.030412*spdErr_p; + //dc = dc_p+(0.6593/20)*(1.079*spdErr-0.9213*spdErr_p); + } + dc_p = dc; + spdErr_p = spdErr; + // enforce duty cycle saturation + if(dc>1.0) { + dc = 1.0; + } else if(dc<-1.0) { + dc = -1.0; + } + // motor control + mot_control(1,dc); // first input is the motor channel, second is duty cycle +} + +
diff -r 000000000000 -r eb94c702a103 mbed.bld --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Tue Nov 28 04:22:29 2017 +0000 @@ -0,0 +1,1 @@ +https://mbed.org/users/mbed_official/code/mbed/builds/e2bfab296f20 \ No newline at end of file
diff -r 000000000000 -r eb94c702a103 mbedWSEsbc.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbedWSEsbc.lib Tue Nov 28 04:22:29 2017 +0000 @@ -0,0 +1,1 @@ +http://developer.mbed.org/users/jebradshaw/code/mbedWSEsbc/#2564f54c89df