ES2017 coursework 2

Dependencies:   PID

Fork of ES_CW2_Starter by Edward Stott

Revision:
24:4032857546f4
Parent:
23:d48d51e5db97
Child:
25:9e6e870821d8
diff -r d48d51e5db97 -r 4032857546f4 main.cpp
--- a/main.cpp	Fri Mar 10 19:53:08 2017 +0000
+++ b/main.cpp	Fri Mar 10 21:11:49 2017 +0000
@@ -4,7 +4,7 @@
 #include "PID.h"
 
 //PID controller configuration
-float PIDrate = 0.2;
+float PIDrate = 0.1;
 float Kc = 4.5;
 float Ti = 0.1;
 float Td = 0.5;
@@ -45,7 +45,13 @@
 7       -   -   -
 */
 //Drive state to output table
-const int8_t driveTable[6] = {0x38, 0x2C, 0x0E, 0x0B, 0x23, 0x32};
+//const int8_t driveTable[6] = {0x38, 0x2C, 0x0E, 0x0B, 0x23, 0x32};
+
+//const int8_t driveTable[] = {0x12,0x18,0x09,0x21,0x24,0x06,0x00,0x00};
+
+
+//Mapping from interrupter inputs to sequential rotor states. 0x00 and 0x07 are not valid
+//const int8_t stateMap[] = {0x07,0x05,0x03,0x04,0x01,0x00,0x02,0x07};
 
 const int8_t cwState[7] = {0x00, 0x23, 0x38, 0x32, 0x0E, 0x0B, 0x2C};
 const int8_t AcwState[7] = {0x00, 0x0E, 0x23, 0x0B, 0x38, 0x2C, 0x32};
@@ -72,7 +78,22 @@
 DigitalOut testpin(D13);
 
 //NOTE, BusOut declares things in reverse (ie, 0, 1, 2, 3) compared to binary represenation
-BusOut motor(L1Lpin, L1Hpin, L2Lpin, L2Hpin, L3Lpin, L3Hpin);
+BusOut motor(L1Hpin, L2Lpin, L2Hpin, L3Lpin, L3Hpin);//L1Lpin,
+PwmOut singpin(L1Lpin);
+
+//BusOut digitalpins(L1Hpin, L2Lpin, L2Hpin, L3Lpin, L3Hpin);
+//PwmOut motor[6] = {L1Lpin, L1Hpin, L2Lpin, L2Hpin, L3Lpin, L3Hpin};
+//PwmOut singpin(L1Lpin);
+
+//motor[] = (singpin, digitalpins);
+
+//PwmOut L1L(L1Lpin);
+//DigitalOut L1H(L1Hpin);
+//DigitalOut L2L(L2Lpin);
+//DigitalOut L2H(L2Hpin);
+//DigitalOut L3L(L3Lpin);
+//DigitalOut L3H(L3Hpin);
+
 
 //Timeout function for rotating at set speed
 Timeout spinTimer;
@@ -102,21 +123,27 @@
 void motorOut(int8_t driveState)
 {
 
-    //Set to zero
-    motor=0x2A;
+    motor = 0x2A;
 
     if(revtimer<33) {
         clk=1;
-        if(!spinCW) motor = FastStateACW[driveState];
-        else motor = FastStateCW[driveState];
+        if(!spinCW) {
+            motor = (FastStateACW[driveState]>>1);
+            singpin = float(FastStateACW[driveState]&&0x01)/2;
+        } else {
+            motor = (FastStateCW[driveState]>>1);
+            singpin = float(FastStateCW[driveState]&&0x01)/2;
+        }
     } else {
         clk=0;
-        //Go to next state
-        if(!spinCW) motor = AcwState[driveState];
-        else motor = cwState[driveState];
+        if(!spinCW) {
+            motor = (AcwState[driveState]>>1);
+            singpin = float(AcwState[driveState]&&0x01)/2;
+        } else {
+            motor = (cwState[driveState]>>1);
+            singpin = float(cwState[driveState]&&0x01)/2;
+        }
     }
-    //Lookup the output byte from the drive state.
-//    int8_t driveOut = driveTable[driveState & 0x07];
 }
 
 inline void motorStop()
@@ -139,6 +166,7 @@
 {
     //Put the motor in drive state 0 and wait for it to stabilise
     motor=cwState[1];
+//    motorOut(1);
     wait(1.0);
 
     position = 0;
@@ -153,7 +181,7 @@
     //timeout interrupt to call this function again and
     //keep the motor spinning at the right speed
     if(revsec) spinTimer.attach(&fixedSpeed, spinWait);
-    
+
     intState = readRotorState();
     //Increment state machine to next state
     motorOut(intState);
@@ -208,31 +236,31 @@
     }
 }
 
-void sing(float singFreq)
-{
-    motor = driveTable[1];
-    wait(5.0);
-    float singDelayus = 1000000/singFreq;
-    for(int count=0; count<singFreq; count++) {
-        motor = driveTable[2];
-        wait_us(singDelayus);
-        motor = driveTable[1];
-    }
-    singFreq = 15000;
-    singDelayus = 1000000/singFreq;
-    for(int count=0; count<singFreq; count++) {
-        motor = driveTable[2];
-        wait_us(singDelayus);
-        motor = driveTable[1];
-    }
-}
+//void sing(float singFreq)
+//{
+//    motor = driveTable[1];
+//    wait(5.0);
+//    float singDelayus = 1000000/singFreq;
+//    for(int count=0; count<singFreq; count++) {
+//        motor = driveTable[2];
+//        wait_us(singDelayus);
+//        motor = driveTable[1];
+//    }
+//    singFreq = 15000;
+//    singDelayus = 1000000/singFreq;
+//    for(int count=0; count<singFreq; count++) {
+//        motor = driveTable[2];
+//        wait_us(singDelayus);
+//        motor = driveTable[1];
+//    }
+//}
 
 
 //Main function
 int main()
 {
     pc.printf("spin\n\r");
-
+    spinWait = 0.01;
     motorStop();
 
     //Run the motor synchronisation
@@ -255,6 +283,9 @@
     I2.mode(PullNone);
     I2.fall(&rps);
 
+    singpin.period_us(100);
+
+
     VPIDthread.start(VPID);
 
     while(1) {
@@ -396,7 +427,7 @@
                     }
                     //Calculate the number of revolutions required
                     targetRevs = float(hdrds)*100 + float(tens)*10 + float(units) + float(decimals)/10;
-
+                    singpin.period_us(float(hdrds)*100 + float(tens)*10 + float(units) + float(decimals)/10);
                     //Print values for verification
                     pc.printf("Target revs: %2.4f\n\r", targetRevs);
 
@@ -463,7 +494,7 @@
                     controller.setBias(bias);
                     break;
                 case 'l':
-                    sing(261.63);
+//                    sing(261.63);
                     break;
                 default:
                     //Set speed variables to zero to stop motor spinning
@@ -474,8 +505,6 @@
                     break;
             }
         }
-//        printSpeed.attach(&speedo, 1.0);
-//        pc.printf("Revs / sec: %2.2f\r", revs);
     }
 
 }