altb_pmic / Mbed 2 deprecated GRT_VC_PIDT1_musterloesung

Dependencies:   mbed

Committer:
pmic
Date:
Fri May 10 14:24:29 2019 +0000
Revision:
3:477db0d9895e
Parent:
2:0b64504024fe
Child:
4:37df0f6a1bc3
Few cosmetic improvements

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 1:314e2e3727f2 3 #include "PID_Cntrl.h"
altb2 0:4ed9a8952ddc 4 #include "LinearCharacteristics.h"
altb2 0:4ed9a8952ddc 5 //------------------------------------------
altb2 0:4ed9a8952ddc 6 #define PI 3.1415927f
altb2 0:4ed9a8952ddc 7 //------------------------------------------
pmic 3:477db0d9895e 8
altb2 1:314e2e3727f2 9 /* GRT: Control of voice-coil with PID-T1 - Controller
altb2 0:4ed9a8952ddc 10 */
altb2 0:4ed9a8952ddc 11 Serial pc(SERIAL_TX, SERIAL_RX); // serial connection via USB - programmer
altb2 0:4ed9a8952ddc 12 InterruptIn button(USER_BUTTON); // User Button, short presses: reduce speed, long presses: increase speed
altb2 1:314e2e3727f2 13 AnalogOut out(PA_5); // Analog OUT on PA_5 1.6 V -> 0A 3.2A -> 4A (see ESCON)
altb2 0:4ed9a8952ddc 14
altb2 0:4ed9a8952ddc 15 bool key_was_pressed = false;
altb2 0:4ed9a8952ddc 16 bool controller_active = false;
altb2 0:4ed9a8952ddc 17 void pressed(void); // user Button pressed
altb2 0:4ed9a8952ddc 18 void released(void); // user Button released
pmic 3:477db0d9895e 19
altb2 0:4ed9a8952ddc 20 //------------------------------------------
altb2 0:4ed9a8952ddc 21 // ... here define variables like gains etc.
altb2 0:4ed9a8952ddc 22 //------------------------------------------
pmic 3:477db0d9895e 23 LinearCharacteristics i2u(-4.0f, 4.0f, 0.0f, 3.2f/3.3f); // output is normalized output
altb2 0:4ed9a8952ddc 24 //------------------------------------------
altb2 0:4ed9a8952ddc 25 Ticker ControllerLoopTimer; // interrupt for control loop
altb2 0:4ed9a8952ddc 26 EncoderCounter counter1(PB_6, PB_7); // initialize counter on PB_6 and PB_7
altb2 1:314e2e3727f2 27 Timer t_but; // define timer for button
altb2 0:4ed9a8952ddc 28 // ----- User defined functions -----------
altb2 0:4ed9a8952ddc 29 void updateLoop(void); // loop for State machine (via interrupt)
altb2 1:314e2e3727f2 30 float Ts = 0.0005f; // sample time of main loop
altb2 1:314e2e3727f2 31 uint16_t k = 0;
pmic 3:477db0d9895e 32 // initiate PIDT1 controller objects
pmic 3:477db0d9895e 33 // PID_Cntrl dt1(0.0f, 0.0f, 0.0109f, 0.000625f, Ts, -3.0f, 3.0f);
pmic 3:477db0d9895e 34 // PID_Cntrl pi1(1.35f, 13.5f, 0.0f, 1.0f, Ts, -3.0f, 3.0f);
pmic 3:477db0d9895e 35 PID_Cntrl dt1(0.0f, 0.0f, 0.0126f, 0.00067f, Ts, -3.0f, 3.0f);
pmic 3:477db0d9895e 36 PID_Cntrl pi1(3.16f, 15.1f, 0.0f, 1.0f, Ts, -3.0f, 3.0f);
pmic 3:477db0d9895e 37 float w = 0.5f;
altb2 0:4ed9a8952ddc 38 //******************************************************************************
altb2 0:4ed9a8952ddc 39 //---------- main loop -------------
altb2 0:4ed9a8952ddc 40 //******************************************************************************
altb2 0:4ed9a8952ddc 41 int main()
pmic 3:477db0d9895e 42 {
altb2 0:4ed9a8952ddc 43 pc.baud(115200); // for serial comm.
altb2 0:4ed9a8952ddc 44 counter1.reset(); // encoder reset
altb2 0:4ed9a8952ddc 45 out.write(i2u(0.0));
altb2 0:4ed9a8952ddc 46 button.fall(&pressed); // attach key pressed function
altb2 0:4ed9a8952ddc 47 button.rise(&released); // attach key pressed function
pmic 3:477db0d9895e 48 pc.printf("Start controller now or reset...\r\n");
altb2 1:314e2e3727f2 49 ControllerLoopTimer.attach(&updateLoop, Ts); //Assume Fs = ...;
altb2 1:314e2e3727f2 50 while(1);
altb2 0:4ed9a8952ddc 51 } // END OF main
altb2 0:4ed9a8952ddc 52 //******************************************************************************
altb2 0:4ed9a8952ddc 53 //---------- main loop (called via interrupt) -------------
altb2 0:4ed9a8952ddc 54 //******************************************************************************
pmic 3:477db0d9895e 55 void updateLoop(void)
pmic 3:477db0d9895e 56 {
altb2 1:314e2e3727f2 57 float x = (float)(counter1)/1000.0f; // get counts from Encoder
altb2 1:314e2e3727f2 58 float i_des = 0.0f; // default: set motor current to zero (will be overwritten)
pmic 3:477db0d9895e 59 if(controller_active) {
pmic 3:477db0d9895e 60 // controller update
pmic 3:477db0d9895e 61 i_des = pi1(w - x) - dt1(x);
pmic 3:477db0d9895e 62 }
altb2 1:314e2e3727f2 63 out.write(i2u(i_des));
pmic 3:477db0d9895e 64 if(++k>1000) {
altb2 1:314e2e3727f2 65 pc.printf("x: %1.3f, i: %1.4f\r\n",x,i_des);
pmic 3:477db0d9895e 66 k = 0;
pmic 3:477db0d9895e 67 w = -w;
pmic 3:477db0d9895e 68 }
altb2 0:4ed9a8952ddc 69 } // END OF updateLoop(void)
pmic 3:477db0d9895e 70
altb2 0:4ed9a8952ddc 71 //******************************************************************************
pmic 3:477db0d9895e 72
pmic 3:477db0d9895e 73
altb2 0:4ed9a8952ddc 74 // start timer as soon as Button is pressed
altb2 0:4ed9a8952ddc 75 void pressed()
altb2 0:4ed9a8952ddc 76 {
altb2 0:4ed9a8952ddc 77 t_but.start();
altb2 0:4ed9a8952ddc 78 }
pmic 3:477db0d9895e 79 // Falling edge of button: enable/disable controller
altb2 0:4ed9a8952ddc 80 void released()
altb2 0:4ed9a8952ddc 81 {
altb2 0:4ed9a8952ddc 82 // readout, stop and reset timer
altb2 0:4ed9a8952ddc 83 float ButtonTime = t_but.read();
altb2 0:4ed9a8952ddc 84 t_but.stop();
altb2 0:4ed9a8952ddc 85 t_but.reset();
pmic 3:477db0d9895e 86 if(ButtonTime > 0.05f) {
altb2 1:314e2e3727f2 87 controller_active = !controller_active;
pmic 3:477db0d9895e 88 if(controller_active) {
pmic 3:477db0d9895e 89 pc.printf("Controller actived\r\n");
pmic 3:477db0d9895e 90 // reset controller here!!!
pmic 3:477db0d9895e 91 dt1.reset(0.0);
altb2 2:0b64504024fe 92 pi1.reset(0.0);
pmic 3:477db0d9895e 93 } else
altb2 1:314e2e3727f2 94 pc.printf("Controller disabled\r\n");
altb2 1:314e2e3727f2 95 }
altb2 0:4ed9a8952ddc 96 }