altb_pmic / Mbed 2 deprecated GRT_VC_PIDT1_musterloesung

Dependencies:   mbed

Committer:
altb2
Date:
Tue Apr 30 15:34:47 2019 +0000
Revision:
0:4ed9a8952ddc
Child:
1:314e2e3727f2
Musterloesung zu VC-Regler

Who changed what in which revision?

UserRevisionLine numberNew contents of line
altb2 0:4ed9a8952ddc 1 #include "mbed.h"
altb2 0:4ed9a8952ddc 2 #include "EncoderCounter.h"
altb2 0:4ed9a8952ddc 3 #include "LinearCharacteristics.h"
altb2 0:4ed9a8952ddc 4 #include "PID_Cntrl.h"
altb2 0:4ed9a8952ddc 5
altb2 0:4ed9a8952ddc 6 //------------------------------------------
altb2 0:4ed9a8952ddc 7 #define PI 3.1415927f
altb2 0:4ed9a8952ddc 8 //------------------------------------------
altb2 0:4ed9a8952ddc 9
altb2 0:4ed9a8952ddc 10 /* GRT, Control of voice-coil with PID-T1 - Controller
altb2 0:4ed9a8952ddc 11 */
altb2 0:4ed9a8952ddc 12 Serial pc(SERIAL_TX, SERIAL_RX); // serial connection via USB - programmer
altb2 0:4ed9a8952ddc 13 InterruptIn button(USER_BUTTON); // User Button, short presses: reduce speed, long presses: increase speed
altb2 0:4ed9a8952ddc 14 DigitalOut led1(LED1);
altb2 0:4ed9a8952ddc 15
altb2 0:4ed9a8952ddc 16 bool key_was_pressed = false;
altb2 0:4ed9a8952ddc 17 bool controller_active = false;
altb2 0:4ed9a8952ddc 18 AnalogOut out(PA_5); // Analog OUT on PA_5 1.6 V -> 0A 3.2A -> 2A (see ESCON)
altb2 0:4ed9a8952ddc 19 float out_value = 1.6f; // set voltage on 1.6 V (0 A current)
altb2 0:4ed9a8952ddc 20 float Ts = 0.0005f; // sample time of main loops
altb2 0:4ed9a8952ddc 21 void pressed(void); // user Button pressed
altb2 0:4ed9a8952ddc 22 void released(void); // user Button released
altb2 0:4ed9a8952ddc 23 // dt1-Regler with Kp = 0, Kd = 0.0109, Tf = 0.000625
altb2 0:4ed9a8952ddc 24 PID_Cntrl dt1(0.0f,0.0f,17.3780,0.000625f,Ts,-3.0,3.0);
altb2 0:4ed9a8952ddc 25 PID_Cntrl pi1(1.35f,13.5f,0,1.0f,Ts,-3.0,3.0);
altb2 0:4ed9a8952ddc 26 PID_Cntrl pidt1(-0.0019,4.72,0.4,0.005,Ts,-3.0,3.0);
altb2 0:4ed9a8952ddc 27 uint16_t kk=0;
altb2 0:4ed9a8952ddc 28 float w=1.0f;
altb2 0:4ed9a8952ddc 29 //------------------------------------------
altb2 0:4ed9a8952ddc 30 // ... here define variables like gains etc.
altb2 0:4ed9a8952ddc 31 //------------------------------------------
altb2 0:4ed9a8952ddc 32 LinearCharacteristics i2u(-4.0f,4.0f,0.0f,3.2f / 3.3f); // output is normalized output
altb2 0:4ed9a8952ddc 33 //------------------------------------------
altb2 0:4ed9a8952ddc 34 Ticker ControllerLoopTimer; // interrupt for control loop
altb2 0:4ed9a8952ddc 35 EncoderCounter counter1(PB_6, PB_7); // initialize counter on PB_6 and PB_7
altb2 0:4ed9a8952ddc 36 Timer ti; // define global timer
altb2 0:4ed9a8952ddc 37 Timer t_but; // define global timer
altb2 0:4ed9a8952ddc 38 //------------------------------------------
altb2 0:4ed9a8952ddc 39 // ----- User defined functions -----------
altb2 0:4ed9a8952ddc 40 void updateLoop(void); // loop for State machine (via interrupt)
altb2 0:4ed9a8952ddc 41 // ------ END User defined functions ------
altb2 0:4ed9a8952ddc 42
altb2 0:4ed9a8952ddc 43 //******************************************************************************
altb2 0:4ed9a8952ddc 44 //---------- main loop -------------
altb2 0:4ed9a8952ddc 45 //******************************************************************************
altb2 0:4ed9a8952ddc 46 int main()
altb2 0:4ed9a8952ddc 47 {
altb2 0:4ed9a8952ddc 48 pc.baud(115200); // for serial comm.
altb2 0:4ed9a8952ddc 49 counter1.reset(); // encoder reset
altb2 0:4ed9a8952ddc 50 out.write(i2u(0.0));
altb2 0:4ed9a8952ddc 51 ControllerLoopTimer.attach(&updateLoop, Ts); //Assume Fs = ...;
altb2 0:4ed9a8952ddc 52 ti.reset();
altb2 0:4ed9a8952ddc 53 ti.start();
altb2 0:4ed9a8952ddc 54 button.fall(&pressed); // attach key pressed function
altb2 0:4ed9a8952ddc 55 button.rise(&released); // attach key pressed function
altb2 0:4ed9a8952ddc 56
altb2 0:4ed9a8952ddc 57 } // END OF main
altb2 0:4ed9a8952ddc 58 //******************************************************************************
altb2 0:4ed9a8952ddc 59 //---------- main loop (called via interrupt) -------------
altb2 0:4ed9a8952ddc 60 //******************************************************************************
altb2 0:4ed9a8952ddc 61 void updateLoop(void){
altb2 0:4ed9a8952ddc 62 if(key_was_pressed)
altb2 0:4ed9a8952ddc 63 {
altb2 0:4ed9a8952ddc 64 controller_active = !controller_active;
altb2 0:4ed9a8952ddc 65 if(controller_active)
altb2 0:4ed9a8952ddc 66 {
altb2 0:4ed9a8952ddc 67 dt1.reset(0.0f);
altb2 0:4ed9a8952ddc 68 led1=true;
altb2 0:4ed9a8952ddc 69 }
altb2 0:4ed9a8952ddc 70 else
altb2 0:4ed9a8952ddc 71 led1=false;
altb2 0:4ed9a8952ddc 72 key_was_pressed = false;
altb2 0:4ed9a8952ddc 73 }
altb2 0:4ed9a8952ddc 74 float x = (float)(counter1)/1000.0; // get counts from Encoder
altb2 0:4ed9a8952ddc 75 float i_des = 0.0f; // set motor torque to zero (will be overwritten)
altb2 0:4ed9a8952ddc 76 if(controller_active)
altb2 0:4ed9a8952ddc 77 {
altb2 0:4ed9a8952ddc 78 //i_des = pi1(w-x) - dt1(x);
altb2 0:4ed9a8952ddc 79 i_des = pidt1(w-x);
altb2 0:4ed9a8952ddc 80 }
altb2 0:4ed9a8952ddc 81 if(++kk>1000){
altb2 0:4ed9a8952ddc 82 pc.printf("x/mm: %1.3f I/A: %1.3f\r\n",x,i_des);
altb2 0:4ed9a8952ddc 83 kk=0;
altb2 0:4ed9a8952ddc 84 w = -w;
altb2 0:4ed9a8952ddc 85 }
altb2 0:4ed9a8952ddc 86 out.write(i2u(i_des));
altb2 0:4ed9a8952ddc 87 } // END OF updateLoop(void)
altb2 0:4ed9a8952ddc 88
altb2 0:4ed9a8952ddc 89 //******************************************************************************
altb2 0:4ed9a8952ddc 90
altb2 0:4ed9a8952ddc 91
altb2 0:4ed9a8952ddc 92 // start timer as soon as Button is pressed
altb2 0:4ed9a8952ddc 93 void pressed()
altb2 0:4ed9a8952ddc 94 {
altb2 0:4ed9a8952ddc 95 t_but.start();
altb2 0:4ed9a8952ddc 96 key_was_pressed = false;
altb2 0:4ed9a8952ddc 97 }
altb2 0:4ed9a8952ddc 98
altb2 0:4ed9a8952ddc 99 // evaluating statemachine
altb2 0:4ed9a8952ddc 100 void released()
altb2 0:4ed9a8952ddc 101 {
altb2 0:4ed9a8952ddc 102 // readout, stop and reset timer
altb2 0:4ed9a8952ddc 103 float ButtonTime = t_but.read();
altb2 0:4ed9a8952ddc 104 t_but.stop();
altb2 0:4ed9a8952ddc 105 t_but.reset();
altb2 0:4ed9a8952ddc 106 if(ButtonTime > 0.05f)
altb2 0:4ed9a8952ddc 107 key_was_pressed = true;
altb2 0:4ed9a8952ddc 108 }