Control of VoiceCoil Lab#7

Dependencies:   mbed

Revision:
0:05dd1de8cc3f
Child:
1:92f175969d90
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Fri May 03 09:37:27 2019 +0000
@@ -0,0 +1,89 @@
+#include "mbed.h"
+#include "EncoderCounter.h"
+#include "LinearCharacteristics.h"
+//------------------------------------------
+#define PI 3.1415927f
+//------------------------------------------
+ 
+/* GRT: Control of voice-coil with PID-T1 - Controller
+ */
+Serial pc(SERIAL_TX, SERIAL_RX);        // serial connection via USB - programmer
+InterruptIn button(USER_BUTTON);        // User Button, short presses: reduce speed, long presses: increase speed
+AnalogOut out(PA_5);                    // Analog OUT on PA_5   1.6 V -> 0A 3.2A -> 4A (see ESCON)
+
+bool key_was_pressed = false;
+bool controller_active = false;
+void pressed(void);                     // user Button pressed
+void released(void);                    // user Button released
+  
+//------------------------------------------
+// ... here define variables like gains etc.
+//------------------------------------------
+LinearCharacteristics i2u(-4.0f,4.0f,0.0f,3.2f / 3.3f);         // output is normalized output
+//------------------------------------------
+Ticker  ControllerLoopTimer;            // interrupt for control loop
+EncoderCounter counter1(PB_6, PB_7);    // initialize counter on PB_6 and PB_7
+Timer t_but;                            // define timer for button
+// ----- User defined functions -----------
+void updateLoop(void);   // loop for State machine (via interrupt)
+float Ts = 0.0005f;                     // sample time of main loop
+uint16_t k = 0;
+//******************************************************************************
+//---------- main loop -------------
+//******************************************************************************
+int main()
+{   
+    pc.baud(115200);   // for serial comm.
+    counter1.reset();   // encoder reset
+    out.write(i2u(0.0));
+    button.fall(&pressed);          // attach key pressed function
+    button.rise(&released);         // attach key pressed function
+    pc.printf("Start controller now...\r\n");
+    ControllerLoopTimer.attach(&updateLoop, Ts); //Assume Fs = ...;
+    while(1);
+}   // END OF main
+//******************************************************************************
+//---------- main loop (called via interrupt) -------------
+//******************************************************************************
+void updateLoop(void){
+    float x = (float)(counter1)/1000.0f;  // get counts from Encoder
+    float i_des = 0.0f;         // default: set motor current to zero (will be overwritten)
+    if(controller_active)
+        {   
+        // here calculate controller's output
+            }
+    out.write(i2u(i_des));
+    if(++k>1000)
+    {
+        pc.printf("x: %1.3f, i: %1.4f\r\n",x,i_des);
+        k=0;
+        }    
+} // END OF updateLoop(void)
+ 
+//******************************************************************************
+ 
+ 
+// start timer as soon as Button is pressed
+void pressed()
+{
+    t_but.start();
+}
+// Falling edge of button: enable/disable controller 
+void released()
+{
+    // readout, stop and reset timer
+    float ButtonTime = t_but.read();
+    t_but.stop();
+    t_but.reset();
+    if(ButtonTime > 0.05f) 
+    {   
+        controller_active = !controller_active;
+        if(controller_active)
+            {
+            pc.printf("Controller active\r\n");
+            // reset controller here!!!        
+            }
+        else
+            pc.printf("Controller disabled\r\n");
+    }
+}