Andreas Steffen / Mbed 2 deprecated PIservo

Dependencies:   mbed

Revision:
0:3e6ae21a6bb1
Child:
1:dc799997391e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon Aug 06 12:53:57 2012 +0000
@@ -0,0 +1,74 @@
+/* PIservo
+ implement a PI controller with USB serial gain setting to stabilize dipole trap power.
+ Two analog inputs (control and sensor), one analog output (to RF VCA).
+
+20120806 Andreas Steffen
+*/
+
+
+#include "mbed.h"
+
+AnalogIn ctl(p20);
+AnalogIn pd(p16);
+AnalogOut vca(p18);
+DigitalOut led1(LED1);
+Serial pc(USBTX, USBRX);
+
+
+Timer t;
+Ticker commTick;
+Ticker intTick;
+
+float pGain = 1.;
+float iGain = 1000.;
+float integrator = 0.; //the building up integrator value
+
+void serialComm(){
+    char c;
+    float f;
+    
+    if (pc.readable()) { 
+        c = pc.getc();
+        pc.scanf("%f", &f);
+        switch (c) {
+            case 'p':
+                pGain = f;   
+                pc.printf("Changed p gain to %f.\n",pGain);
+                break;
+            case 'i':
+                iGain = f;   
+                pc.printf("Changed i gain to %f.\n",iGain);
+                break;
+            default:
+                pc.printf("Command not understood.\n",iGain);
+                pc.printf("Read %c and %lf.\n",c,f);
+                break;
+        }
+    }
+}
+
+void limitIntegrator(){ 
+    if (integrator > 3.3) {
+            integrator = 3.3;
+        }
+    if (integrator < -3.3) {
+        integrator = -3.3;
+    }
+}
+
+int main() {
+    float err;
+    pc.printf("mbed restarted!\n");
+    
+    commTick.attach(&serialComm,0.5); //check serial every half second  
+    intTick.attach(&limitIntegrator,0.001); //check integrator overrun every ms  
+    
+    t.start();
+
+    while(1) {
+        err = ctl - pd;  
+        integrator += err * iGain*1e-6 * t.read_us(); //iGain is in Hz!
+        t.reset();  //reset timer to get next integration time      
+        vca = err * pGain + integrator;        
+    }
+}