Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
main.cpp@0:4ed9a8952ddc, 2019-04-30 (annotated)
- 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?
| User | Revision | Line number | New 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 | } |