Rob Andon
/
EECKTclassicalcontrol
Classical Control
main.cpp
- Committer:
- RANDON
- Date:
- 2013-11-20
- Revision:
- 0:031c505c5d69
File content as of revision 0:031c505c5d69:
#include "mbed.h" Timer t; AnalogIn ain_v1(p20); AnalogIn ain_v2(p19); AnalogOut aout(p18); int main() { float t1, t2; float V1, V1scaled; float V2, V2scaled; float Cmbed; float Cout, Cout1, Cout2; float e, e1, e2; float V2Ref; float controlfreq, delaytime; // Initialize variables Cout1 = 0.0; Cout2 = 0.0; e1 = 0.0; e2 = 0.0; // Starts timer t.start(); while(t.read()<10.0) { t1 = t.read(); // Gets elapsed time from when t.start() was done. // Sense V1scaled = ain_v1.read()*3.3; // 0.0<ain.read()<1.0. Normalized voltage. / Multiple by 3.3 to get voltage. V1 = (V1scaled-1.65)*6.06; // Re-calculate actual V1(t) voltage. V2scaled = ain_v2.read()*3.3; // 0.0<ain.read()<1.0. Normalized voltage. Multiple by 3.3 to get voltage. V2 = (V2scaled-1.65)*6.06; // Re-calculate actual V1(t) voltage. // Decide // Reference voltage V2Ref = 2.0; // (V) // Error signal e = V2Ref-V2; // (V) // Commanded voltage (V) Cout = (1.948051948051948)*Cout1+(-0.948051948051948)*Cout2+(0.00746223086813)*e+(-0.008291367631262)*e1+(0.002211031368337)*e2; //Cout =(1.96078)*Cout1+(-0.96078)*Cout2+(0.01027)*e+(-0.01539)*e1+(0.00571)*e2; // Age variables Cout2 = Cout1; Cout1 = Cout; e2 = e1; e1 = e; // Actuate Cmbed = Cout/6.06+1.65; // Scale to 0<Cmbed<3.3 // Saturate Cmbed for safety if(Cmbed>3.3) Cmbed = 3.3; if(Cmbed<0.0) Cmbed = 0.0; // Cmbed = 1.65; // Must be between 0<Cmbed<3.3 aout.write(Cmbed/3.3); // 0<aout<1. Normalized voltage t2 = t.read(); controlfreq = 100; //log variable for plotting printf("v1 = %.4f, v2 = %.4f, Cmbed = %.4f, Cout = %f\n\r",V1,V2,Cmbed,Cout); delaytime =(1/(controlfreq)-(t2-t1)); // Make routine run at 0.01 (sec) wait(delaytime); } }