My final year project

Dependencies:   BSP_DISCO_F746NG F746_GUI LCD_DISCO_F746NG SDFileSystem TS_DISCO_F746NG ResistiveTouchController Map CYS8218Controller MedianFilter

Revision:
47:c04b0d51e1e3
Parent:
46:9f66021615f9
Child:
49:a907d4f447a9
--- a/main.cpp	Sun Oct 09 00:58:52 2016 +0200
+++ b/main.cpp	Mon Oct 10 08:19:48 2016 +0200
@@ -13,6 +13,7 @@
 void Manual();
 void Automatic();
 void Calibrate();
+
 //-----------------------
 
 //-- GUI Thread Variables and Objects
@@ -27,6 +28,8 @@
 float alpha = 0;
 float xSP = -20;
 float x = 0;
+float xError = 0;
+float xPrevError = 0;
 MedianFilter xFilter(7);
 
 //-- Y Axis Variables
@@ -34,6 +37,8 @@
 float beta = 0;
 float ySP = 50;
 float y = 0;
+float yError = 0;
+float yPrevError = 0;
 MedianFilter yFilter(7);
 
 
@@ -41,13 +46,15 @@
 float P = 0;
 float I = 0;
 float D = 0;
-float Ts = 4;
+float Ts = 0.004;
+Timer cycleTimer;
 //-----------------------
 
 
 //-- Sensors and Actuator objects
 ResistiveTouchController plate(A0,A1,A3,A4,A5);
-Map plateMapper(0,1024, -170,170);
+Map xMapper(0,1024, -170,170);
+Map yMapper(0,1024, -136,136);
 CYS8218Controller xMotor(D9);
 CYS8218Controller yMotor(D8);
 
@@ -68,9 +75,7 @@
 bool saved = false;
 
 // TODO Delete these variables
-float t = 0;
 Serial pc(USBTX,USBRX);
-DigitalIn test(D3);
 
 int main()
 {
@@ -92,6 +97,13 @@
       case Screen::CALIBRATE_SCREEN :
         Calibrate();
         break;
+      case Screen::MANUAL_SETPOINT_SCREEN :
+        Automatic();
+        break;
+      default :
+        xMotor.Off();
+        yMotor.Off();
+        break;
     }
   }
 }
@@ -161,6 +173,7 @@
 
 void Init()
 {
+  // TODO Read values from sd card
   ImageFromSD splash("/sd/Splash.txt");
   pc.baud(57600);
   xMotor.SetZero(28.0);
@@ -176,13 +189,13 @@
 {
 
   xMotor.Set(zeroAlpha);
-  yMotor.Set(zeroBeta);
+  yMotor.Set(-zeroBeta);
 
   if( saved)
   {
-    // TODO Save zero position on servos
+    // TODO Save zero position on sd card
     xMotor.SetZero(zeroAlpha);
-    yMotor.SetZero(zeroBeta);
+    yMotor.SetZero(-zeroBeta);
     zeroAlpha = 0;
     zeroBeta = 0;
     nextScreen = Screen::MAIN_SETTINGS_SCREEN;
@@ -194,7 +207,9 @@
 
 void Manual()
 {
-  // TODO Add manual control logic
+  xMotor.set(alpha);
+  yMotor.set(beta);
+  Thread::wait(10);
 }
 
 void Automatic()
@@ -202,11 +217,36 @@
   //TODO Add automatic control mode logic
   ballOnPlate = plate.TouchDetected();
 
-  if( ballOnPlate )
+  if( ballOnPlate && started )
   {
+    cycleTimer.start();
     plate.Measure();
-    x = plateMapper.Calculate(floor(plate.X()));
-    y = plateMapper.Calculate(floor(plate.Y()));
+    x = xMapper.Calculate(floor(plate.X()));
+    y = yMapper.Calculate(floor(plate.Y()));
+
+    xError = xSP - x;
+    yError = ySP - y;
+
+    alpha = P*xError + D*(xError-xPrevError);
+    beta = P*yError + D*(yError-yPrevError);
+
+    xPrevError = xError;
+    yPrevError = yError;
+
+    alpha = ( alpha > 10 ? 10 : (alpha < -10 ? -10 : alpha));
+    beta = ( beta > 10 ? 10 : (beta < -10 ? -10 : beta) );
+
+    xMotor.set(alpha);
+    yMotor.set(beta);
+
+    cycleTimer.stop();
+    measuredTs = cycleTimer.read_ms();
+    cycleTimer.reset();
+  }
+  else
+  {
+    xMotor.Off();
+    yMotor.Off();
   }
 
 }
@@ -228,6 +268,7 @@
         {
           while( test.read() );
 
+          //TODO Test calibration function
           calPoint++;
           calTimer.stop();
           calTimer.reset();