Libs for using Nucleo STM32F411 periphery

Introduction

Descruption: This lib uses the hardware peripherie from STM32F411 under serveral conditions. So you can use an quadraturencoder with different timers.

Requirement: Only tested with the nucleo F411. Include the mbed lib! Interfacing details are explained in the documentary of each class.

Overview

  1. timer modules
    1. Quadratur Encoder (Version 1.2 - C. Hoyer 12.8.2015)
  2. SPI modules
    1. AD5664 (Version 1.1 - C. Hoyer 23.7.2015)
  3. software modules
    1. Ringbuffer (Version 0.9 - C. Hoyer 18.8.2015)
    2. PID-Regler (Version 1.0 - C. Hoyer 17.9.2015)
Committer:
ChrisselH
Date:
Mon Nov 28 17:27:43 2016 +0000
Revision:
0:1acdcc576936
port from priv lib

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ChrisselH 0:1acdcc576936 1 #include "mbed.h"
ChrisselH 0:1acdcc576936 2
ChrisselH 0:1acdcc576936 3 #ifndef PIDControl_h
ChrisselH 0:1acdcc576936 4 #define PIDControl_h
ChrisselH 0:1acdcc576936 5
ChrisselH 0:1acdcc576936 6 /*! Diese Klasse erstellt einen PID-Regler. die einzelnen Regeranteile können bei der Initialisierung seperat einsgestellt werden.
ChrisselH 0:1acdcc576936 7 Bei der Initialisierung des Reglers bzw. der Klasse wird der Statusvektor resettet und die einzelnen Anteile werden auf null gesetzt und gesperrt.
ChrisselH 0:1acdcc576936 8 Solange die Variable Lock nicht wahr ist, kann über die Funktionen setKP(), setKI() und setKD() der Regler parametriert werden.
ChrisselH 0:1acdcc576936 9 Es ist zudem möglich die Regelgrenzen des Regelers festzulegen. Bei Überschreiten der Regelgrenzen wird ein Eintrag in dem Statusvektor erzeugt.
ChrisselH 0:1acdcc576936 10 Bei einer Änderung im Statusvektor kann eine externe Funktion aufgerufen werden, die dann den Statusvektor auswertet.
ChrisselH 0:1acdcc576936 11 Der Regeltask ctrltask sollte in regelmäßigen Abständen aufgerufen werden. Wichtig dabei ist eine Stänige Übergabe des Ist und Soll-Werts sowie die Regelzeit.
ChrisselH 0:1acdcc576936 12 \image html http://developer.mbed.org/media/uploads/ChrisselH/pid-controller.jpg "Schematischer Regleraufbau ohne Statusvektoren und Fehlermeldungen"
ChrisselH 0:1acdcc576936 13 * @code
ChrisselH 0:1acdcc576936 14 * #include "mbed.h"
ChrisselH 0:1acdcc576936 15 * #include "PIDControl.h"
ChrisselH 0:1acdcc576936 16 *
ChrisselH 0:1acdcc576936 17 * int16_t ist_value; // Ist-Wert der Strecke
ChrisselH 0:1acdcc576936 18 * int16_t soll_value; // Soll-Wert der Strecke
ChrisselH 0:1acdcc576936 19 * int16_t stell_value; // Stell-Wert der Strecke
ChrisselH 0:1acdcc576936 20 *
ChrisselH 0:1acdcc576936 21 * uint8_t statusvektor; // Statusvektor des Reglers
ChrisselH 0:1acdcc576936 22 *
ChrisselH 0:1acdcc576936 23 * int main() {
ChrisselH 0:1acdcc576936 24 *
ChrisselH 0:1acdcc576936 25 * PIDControl PIregler(1,50.8,1,0.5,0,0); // PI-Regler mit KP = 50,8 und KI = 0,5
ChrisselH 0:1acdcc576936 26 *
ChrisselH 0:1acdcc576936 27 * PIregler.setIlimits(1,6000,1000); // Aktivierung der maximale und minimale Größe des I-Anteils
ChrisselH 0:1acdcc576936 28 *
ChrisselH 0:1acdcc576936 29 * PIregler.setAWU(5); // Die Differenz zwischen I-Anteil und Limit wird mit
ChrisselH 0:1acdcc576936 30 * // Verstärkung zurückgeführt
ChrisselH 0:1acdcc576936 31 *
ChrisselH 0:1acdcc576936 32 * PIregler.setUlimits(7000,500); // Limitierung der Stellgröße
ChrisselH 0:1acdcc576936 33 *
ChrisselH 0:1acdcc576936 34 * PIregler.lock(); // Sperrt weitere Einstellung an dem Regler
ChrisselH 0:1acdcc576936 35 *
ChrisselH 0:1acdcc576936 36 * while(1){
ChrisselH 0:1acdcc576936 37 *
ChrisselH 0:1acdcc576936 38 * stell = PIregler.ctrltask(ist, soll, 1000); // Die Schleife wiederholt sich alle 1kHz
ChrisselH 0:1acdcc576936 39 *
ChrisselH 0:1acdcc576936 40 * statusvektor = PIregler.getStatus(); // Status des Reglers wird ausgelesen
ChrisselH 0:1acdcc576936 41 *
ChrisselH 0:1acdcc576936 42 * wait(0.001); // Regler wird alle 1kHz aufgerufen
ChrisselH 0:1acdcc576936 43 * }
ChrisselH 0:1acdcc576936 44 * }
ChrisselH 0:1acdcc576936 45 *
ChrisselH 0:1acdcc576936 46 * @endcode
ChrisselH 0:1acdcc576936 47 */
ChrisselH 0:1acdcc576936 48
ChrisselH 0:1acdcc576936 49 class PIDControl
ChrisselH 0:1acdcc576936 50 {
ChrisselH 0:1acdcc576936 51 public:
ChrisselH 0:1acdcc576936 52
ChrisselH 0:1acdcc576936 53 /*! Konstruktor zum Erstellen einer Instanz mit einer vom User festgelegten Größe */
ChrisselH 0:1acdcc576936 54 /*!
ChrisselH 0:1acdcc576936 55 \param P <b>P-Anteil</b> Aktivert den P-Anteil, wenn der Wert 1 ist
ChrisselH 0:1acdcc576936 56 \param KP <b>P-Anteil</b> Verstärkung des P-Anteils
ChrisselH 0:1acdcc576936 57 \param I <b>I-Anteil</b> Aktivert den I-Anteil, wenn der Wert 1 ist
ChrisselH 0:1acdcc576936 58 \param KI <b>I-Anteil</b> Verstärkung des I-Anteils
ChrisselH 0:1acdcc576936 59 \param D <b>D-Anteil</b> Aktivert den D-Anteil, wenn der Wert 1 ist
ChrisselH 0:1acdcc576936 60 \param KD <b>D-Anteil</b> Verstärkung des D-Anteils
ChrisselH 0:1acdcc576936 61 */
ChrisselH 0:1acdcc576936 62 PIDControl(bool P_usr, float KP_usr, bool I_usr, float KI_usr, bool D_usr, float KD_usr);
ChrisselH 0:1acdcc576936 63
ChrisselH 0:1acdcc576936 64 /*! Destruktor entfernt den Regler */
ChrisselH 0:1acdcc576936 65 ~PIDControl(){};
ChrisselH 0:1acdcc576936 66
ChrisselH 0:1acdcc576936 67 /*! Reglerprozess. Rückgabewert ist die Führungsgröße */
ChrisselH 0:1acdcc576936 68 /*!
ChrisselH 0:1acdcc576936 69 \param usoll <b>SOLL-Wert</b> Soll-Wert der Regelstrecke
ChrisselH 0:1acdcc576936 70 \param yist <b>IST-Wert</b> Ist-Wert der Regelstrecke
ChrisselH 0:1acdcc576936 71 \param time <b>Zeitkonstatnte</b> vergangene Zeit seit dem letzen Regeltask in ganzen Mirkosekunden (1ms = 1000µs)
ChrisselH 0:1acdcc576936 72 */
ChrisselH 0:1acdcc576936 73 int16_t ctrltask (int16_t wsoll, int16_t yist, uint16_t time);
ChrisselH 0:1acdcc576936 74
ChrisselH 0:1acdcc576936 75
ChrisselH 0:1acdcc576936 76 /*! Ermöglich Zugriff auf die Reglerparameter des P-Anteils. Rückgabe Wert ist eins, wenn die Reglerwerte gespeichert worden sind.*/
ChrisselH 0:1acdcc576936 77 /*!
ChrisselH 0:1acdcc576936 78 \param P <b>P-Anteil</b> Aktivert den P-Anteil, wenn der Wert 1 ist
ChrisselH 0:1acdcc576936 79 \param KP <b>P-Anteil</b> Verstärkung des P-Anteils
ChrisselH 0:1acdcc576936 80 */
ChrisselH 0:1acdcc576936 81 bool setKP(bool P_usr, float KP_usr);
ChrisselH 0:1acdcc576936 82
ChrisselH 0:1acdcc576936 83 /*! Ermöglich Zugriff auf die Reglerparameter des I-Anteils. Rückgabe Wert ist eins, wenn die Reglerwerte gespeichert worden sind.*/
ChrisselH 0:1acdcc576936 84 /*!
ChrisselH 0:1acdcc576936 85 \param I <b>I-Anteil</b> Aktivert den I-Anteil, wenn der Wert 1 ist
ChrisselH 0:1acdcc576936 86 \param KI <b>I-Anteil</b> Verstärkung des I-Anteils
ChrisselH 0:1acdcc576936 87 */
ChrisselH 0:1acdcc576936 88 bool setKI(bool I_usr, float KI_usr);
ChrisselH 0:1acdcc576936 89
ChrisselH 0:1acdcc576936 90 /*! Ermöglich Zugriff auf die Reglerparameter des D-Anteils. Rückgabe Wert ist eins, wenn die Reglerwerte gespeichert worden sind.*/
ChrisselH 0:1acdcc576936 91 /*!
ChrisselH 0:1acdcc576936 92 \param D <b>D-Anteil</b> Aktivert den D-Anteil, wenn der Wert 1 ist
ChrisselH 0:1acdcc576936 93 \param KD <b>D-Anteil</b> Verstärkung des D-Anteils
ChrisselH 0:1acdcc576936 94 */
ChrisselH 0:1acdcc576936 95 bool setKD(bool D_usr, float KD_usr);
ChrisselH 0:1acdcc576936 96
ChrisselH 0:1acdcc576936 97 /*! Ermöglich Zugriff auf den Anti-Windup zum begrenzen des I-Anteils*/
ChrisselH 0:1acdcc576936 98 /*!
ChrisselH 0:1acdcc576936 99 \param awu_gain <b>Anti-Windup Verstärkung</b> Rückführung der Differenz zwischen Stellgröße und Begrenzung mit einer Verstärkung in den I-Anteil
ChrisselH 0:1acdcc576936 100 */
ChrisselH 0:1acdcc576936 101 bool setAWU(float awu_gain_usr);
ChrisselH 0:1acdcc576936 102
ChrisselH 0:1acdcc576936 103 /*! Setzt die Limits der Stellgröße U bzw. des Ausgangs des Reglers*/
ChrisselH 0:1acdcc576936 104 /*!
ChrisselH 0:1acdcc576936 105 \param u_max <b>maximales Limit</b> maximale Ausgangsgröße
ChrisselH 0:1acdcc576936 106 \param u_min <b>minimales Limit</b> minimale Ausgangsgröße
ChrisselH 0:1acdcc576936 107 */
ChrisselH 0:1acdcc576936 108 void setUlimits(int16_t u_max_usr, int16_t u_min_usr);
ChrisselH 0:1acdcc576936 109
ChrisselH 0:1acdcc576936 110 /*! Setzt die Limits des Integralanteils */
ChrisselH 0:1acdcc576936 111 /*!
ChrisselH 0:1acdcc576936 112 \param integrallimiter <b>Aktiviert den Limiter</b> aktiviert eine seperate Begrenzung des I-Anteils
ChrisselH 0:1acdcc576936 113 \param i_max <b>maximales Limit</b> maximaler I-Anteil
ChrisselH 0:1acdcc576936 114 \param i_min <b>minimsler Limit</b> minimaler I-Anteil
ChrisselH 0:1acdcc576936 115 */
ChrisselH 0:1acdcc576936 116 void setIlimits(bool integrallimiter_usr, int16_t i_max_usr, int16_t i_min_usr);
ChrisselH 0:1acdcc576936 117
ChrisselH 0:1acdcc576936 118 /*! Sperrt den Zugriff auf die Reglerparameter */
ChrisselH 0:1acdcc576936 119 void lock();
ChrisselH 0:1acdcc576936 120
ChrisselH 0:1acdcc576936 121 /*! Erlaubt den Zugriff auf die Reglerparameter */
ChrisselH 0:1acdcc576936 122 void unlock();
ChrisselH 0:1acdcc576936 123
ChrisselH 0:1acdcc576936 124 /*! Liest den Status des Reglers aus */
ChrisselH 0:1acdcc576936 125 uint8_t getStatus();
ChrisselH 0:1acdcc576936 126
ChrisselH 0:1acdcc576936 127 /*! Setzt eine Routine die verwendet wird, wenn ein schwerwiegender Fehler im Statusvektor gesetzt wird.*/
ChrisselH 0:1acdcc576936 128 /*!
ChrisselH 0:1acdcc576936 129 \param BUFFER_HANDLER Adresse zur weiteren Routine
ChrisselH 0:1acdcc576936 130 */
ChrisselH 0:1acdcc576936 131 void setERFFCT(void (*CTRL_HANDLER)(void));
ChrisselH 0:1acdcc576936 132
ChrisselH 0:1acdcc576936 133 private:
ChrisselH 0:1acdcc576936 134 /*! Setzt ein Bit im Statusvektor. Wenn der Rückgabewert True ist, würde der Wert übernommen*/
ChrisselH 0:1acdcc576936 135 /*!
ChrisselH 0:1acdcc576936 136 \param bit Welches Bit der Zelle gesetzt werden soll
ChrisselH 0:1acdcc576936 137 */
ChrisselH 0:1acdcc576936 138 void setStatus(int bit);
ChrisselH 0:1acdcc576936 139
ChrisselH 0:1acdcc576936 140 /*!ResSetzt ein Bit im Statusvektor. Wenn der Rückgabewert True ist, würde der Wert übernommen*/
ChrisselH 0:1acdcc576936 141 /*!
ChrisselH 0:1acdcc576936 142 \param bit Welches Bit der Zelle zurück gesetzt werden soll
ChrisselH 0:1acdcc576936 143 */
ChrisselH 0:1acdcc576936 144 void resetStatus(int bit);
ChrisselH 0:1acdcc576936 145
ChrisselH 0:1acdcc576936 146 //! Zeitwert der letztes Berechnung des Verschiebungswerts
ChrisselH 0:1acdcc576936 147 int16_t time_last;
ChrisselH 0:1acdcc576936 148 //! Dazugehöriger Verschiebungswert
ChrisselH 0:1acdcc576936 149 int16_t time_last_result;
ChrisselH 0:1acdcc576936 150 //! Führungsgröße und Rückgabe des Reglertasks
ChrisselH 0:1acdcc576936 151 int16_t u;
ChrisselH 0:1acdcc576936 152 //! Freigabe zur Verwendung externer Funktionen
ChrisselH 0:1acdcc576936 153 bool extfct;
ChrisselH 0:1acdcc576936 154 //! Externe Funktion bei schwerwiegenden Fehlern
ChrisselH 0:1acdcc576936 155 void (*CTRL_HANDLER)(void);
ChrisselH 0:1acdcc576936 156 //! Reglereinstellungen können nicht mehr verändert werden.
ChrisselH 0:1acdcc576936 157 bool lockctrl;
ChrisselH 0:1acdcc576936 158 //! Limits für den Integralanteil aktiv
ChrisselH 0:1acdcc576936 159 bool integrallimiter;
ChrisselH 0:1acdcc576936 160 //! Vorheriger Ístwert des Regelfehlers
ChrisselH 0:1acdcc576936 161 int16_t e_last;
ChrisselH 0:1acdcc576936 162 //! Integral über alle bisherigern Werte
ChrisselH 0:1acdcc576936 163 int16_t e_sum;
ChrisselH 0:1acdcc576936 164 //! Antiwindup Wert mit Verstärkung awu_gain
ChrisselH 0:1acdcc576936 165 int16_t awu_value;
ChrisselH 0:1acdcc576936 166 //! Regleranteil des P-Regler
ChrisselH 0:1acdcc576936 167 int16_t P_var;
ChrisselH 0:1acdcc576936 168 //! Regleranteil des I-Regler
ChrisselH 0:1acdcc576936 169 int16_t I_var;
ChrisselH 0:1acdcc576936 170 //! Regleranteil des D-Regler
ChrisselH 0:1acdcc576936 171 int16_t D_var;
ChrisselH 0:1acdcc576936 172
ChrisselH 0:1acdcc576936 173 //! Funktion zum bestimmen der zweier Potenz
ChrisselH 0:1acdcc576936 174 /*!
ChrisselH 0:1acdcc576936 175 \param a 16-Bit Integer bei der die Zweierpotenz bestimmt werden soll
ChrisselH 0:1acdcc576936 176 */
ChrisselH 0:1acdcc576936 177 int16_t log2(int16_t a);
ChrisselH 0:1acdcc576936 178
ChrisselH 0:1acdcc576936 179
ChrisselH 0:1acdcc576936 180 protected:
ChrisselH 0:1acdcc576936 181
ChrisselH 0:1acdcc576936 182 //! Aktiviert den Proportional-Anteil
ChrisselH 0:1acdcc576936 183 bool P;
ChrisselH 0:1acdcc576936 184 //! Aktiviert den Integral-Anteil
ChrisselH 0:1acdcc576936 185 bool I;
ChrisselH 0:1acdcc576936 186 //! Aktiviert den Differnetial-Anteil
ChrisselH 0:1acdcc576936 187 bool D;
ChrisselH 0:1acdcc576936 188
ChrisselH 0:1acdcc576936 189 //! Verstärkung für den Proportional-Anteil
ChrisselH 0:1acdcc576936 190 float KP;
ChrisselH 0:1acdcc576936 191 //! Verstärkung für den Integral-Anteil
ChrisselH 0:1acdcc576936 192 float KI;
ChrisselH 0:1acdcc576936 193 //! Verstärkung für den Differnetial-Anteil
ChrisselH 0:1acdcc576936 194 float KD;
ChrisselH 0:1acdcc576936 195
ChrisselH 0:1acdcc576936 196 //! Maximale Führungsgröße
ChrisselH 0:1acdcc576936 197 int16_t u_max;
ChrisselH 0:1acdcc576936 198 //! Minimale Führungsgröße
ChrisselH 0:1acdcc576936 199 int16_t u_min;
ChrisselH 0:1acdcc576936 200 //! Maximaler Integralanteil
ChrisselH 0:1acdcc576936 201 int16_t i_max;
ChrisselH 0:1acdcc576936 202 //! Minimaler Integralanteil
ChrisselH 0:1acdcc576936 203 int16_t i_min;
ChrisselH 0:1acdcc576936 204 //! Anti-Windup Verstärkung
ChrisselH 0:1acdcc576936 205 float awu_gain;
ChrisselH 0:1acdcc576936 206
ChrisselH 0:1acdcc576936 207
ChrisselH 0:1acdcc576936 208 /*! 8-Bit Statusvektor:
ChrisselH 0:1acdcc576936 209 - [7] Regelgrenze max überschritten (<b>EXTFCT</b>)<br>
ChrisselH 0:1acdcc576936 210 - [6] Regelgrenze min unterschritten (<b>EXTFCT</b>)<br>
ChrisselH 0:1acdcc576936 211 - [5] Fehler bei der Berechnung (<b>EXTFCT</b>)<br>
ChrisselH 0:1acdcc576936 212 - [4] aktueller IST-Wert < Soll-Wert<br>
ChrisselH 0:1acdcc576936 213 - [3] aktueller IST-Wert > Soll-Wert<br>
ChrisselH 0:1acdcc576936 214 - [2] Regelabweichung ist null<br>
ChrisselH 0:1acdcc576936 215 - [1] I-Anteil Limit erreicht<br>
ChrisselH 0:1acdcc576936 216 - [0] Reglertask aktiv<br>
ChrisselH 0:1acdcc576936 217 Bei schwerwiegenden Fehlern wird eine externe Routine (<b>EXTFCT</b>) aufgerufen, falls diese angegeben wurde.
ChrisselH 0:1acdcc576936 218 */
ChrisselH 0:1acdcc576936 219 uint8_t status;
ChrisselH 0:1acdcc576936 220
ChrisselH 0:1acdcc576936 221 };
ChrisselH 0:1acdcc576936 222
ChrisselH 0:1acdcc576936 223
ChrisselH 0:1acdcc576936 224
ChrisselH 0:1acdcc576936 225
ChrisselH 0:1acdcc576936 226 #endif