not working yet

Dependencies:   Motor_with_encoder MODSERIAL mbed HIDScope

Revision:
1:f3fe6d2b7639
Parent:
0:9167ae5d9927
Child:
2:7c6391c8ca71
--- a/main.cpp	Mon Oct 16 08:32:40 2017 +0000
+++ b/main.cpp	Mon Oct 16 09:43:57 2017 +0000
@@ -3,7 +3,6 @@
 #include "encoder.h"
 #include "math.h"
 
-
 MODSERIAL pc(USBTX,USBRX);
 PwmOut speed1(D5);
 DigitalOut dir1(D4);
@@ -16,16 +15,18 @@
 Ticker encoderreadout;
 Encoder motor1(PTD0,PTC4);
 
+float PwmPeriod = 0.0001f;
+
 double count = 0; //set the counts of the encoder
-double angle = 0;//set the angles
+volatile double angle = 0;//set the angles
 
-double setpoint = 100;//I am setting it to move through 180 degrees
-double Kp = 0.32;// you can set these constants however you like depending on trial & error
-double Ki = 0.1;
-double Kd = 0.3;
+double setpoint = 180;//I am setting it to move through 180 degrees
+double Kp = 0.15;// you can set these constants however you like depending on trial & error
+double Ki = 1;
+double Kd = 0.5;
 
 float last_error = 0;
-float error = 0;
+float error1 = 0;
 float changeError = 0;
 float totalError = 0;
 float pidTerm = 0;
@@ -33,44 +34,60 @@
 
 volatile double potvalue = 0.0;
 volatile double position = 0.0;
-void readpot(){
+/*void readpot()
+{
+    
+}
+*/
+void PIDcalculation()
+{
     potvalue = pot.read();
-    position = motor1.getPosition();
-    pc.printf("pos: %d, speed %f reference velocity = %.2f\r\n",motor1.getPosition(), motor1.getSpeed(), potvalue);
+    angle = motor1.getPosition()/4200.00*6.28;
     setpoint = potvalue*setpoint;
+    //pc.printf("pos: %d, speed %f reference position = %.2f\r ",motor1.getPosition(), motor1.getSpeed(), setpoint);
     //motorpid = PID(potvalue - position, M1_KP, M1_KI, M1_KD, M1_TS, m1_err_int, m1_prev_err, m1_f_v1, m1_f_v2, M1_F_A1, M1_F_A2, M1_F_B0, M1_F_B1, M1_F_B2);
-}
+    
+    if (angle <= setpoint) {
+        dir1 = 1;// Forward motion
+    } else {
+        dir1 = 0;//Reverse motion
+    }
     
-void PIDcalculation(){
-  
-  angle = (0.9 * position);//count to angle conversion
-  error = setpoint - angle;
-  
-  changeError = error - last_error; // derivative term
-  totalError += error; //accumalate errors to find integral term
-  pidTerm = (Kp * error) + (Ki * totalError) + (Kd * changeError);//total gain
-  pidTerm = constrain(pidTerm, -255, 255);//constraining to appropriate value
-  pidTerm_scaled = abs(pidTerm);//make sure it's a positive value
+    error1 = setpoint - angle;
+    if (error1 <= 0.2) {
+        speed1 = 0;
+    }
 
-  last_error = error;
+    changeError = error1 - last_error; // derivative term
+    totalError += error1; //accumalate errors to find integral term
+    pidTerm = (Kp * error1) + (Ki * totalError) + (Kd * changeError);//total gain
+    if (pidTerm >= 255) {
+        pidTerm = 255;
+    } else if (pidTerm <= -255) {
+        pidTerm = -255;
+    } else {
+        pidTerm = pidTerm;
+    }
+    //constraining to appropriate value
+    pidTerm_scaled = abs(pidTerm)/255;//make sure it's a positive value
+    last_error = error1;
 }
 
-void loop(){
-  
-  PIDcalculation();// find PID value
-  
-  if (angle < setpoint) {
-    dir1 = 1;// Forward motion
-  } else {
-    dir1 = 0;//Reverse motion
-  }
+int main()
+{
+    encoderreadout.attach(PIDcalculation,0.001f);
+    speed1.period(PwmPeriod);
+
+    while(true) {
+
 
-  speed1 = pidTerm_scaled;
+
+        speed1 = pidTerm_scaled;
 
-  pc.printf("WHEEL ANGLE:%d", angle);
+        pc.printf("WHEEL ANGLE:%d, PID_scaled = %f, error = %f\r", angle, pidTerm_scaled, error1);
 
-  delay(100);
+    }
+
 }
 
 
-  
\ No newline at end of file