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@3:477db0d9895e, 2019-05-10 (annotated)
- 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?
| User | Revision | Line number | New 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 | } |