Libs for using Nucleo STM32F411 periphery
Embed:
(wiki syntax)
Show/hide line numbers
QUADRATURE.h
00001 #include "mbed.h" 00002 00003 #ifndef QUADRATURE_h 00004 #define QUADRATURE_h 00005 00006 /*! Die Klasse kann aus den Timern 1 bis 5 verschiedene Encoder generieren. Es kann zwischen verschiendenen Encodermodis gewählt werden. Für den STM32 gibt es für die einzelnen Timer verschiedene Kanäle die zu wählen sind: 00007 <CENTER> 00008 <table> 00009 <tr> 00010 <th>Eingang</th> 00011 <th>Timer 1</th> 00012 <th>Timer 2</th> 00013 <th>Timer 3</th> 00014 <th>Timer 4</th> 00015 <th>Timer 5</th> 00016 </tr> 00017 <tr style="text-align: center;"> 00018 <td><strong>CI 1</strong></td> 00019 <td>PA8</td> 00020 <td>PA0</td> 00021 <td>PA6</td> 00022 <td>PB6</td> 00023 <td>PA0</td> 00024 </tr> 00025 <tr style="text-align: center;"> 00026 <td><strong>CI 1</strong></td> 00027 <td>PE9</td> 00028 <td>PA5</td> 00029 <td>PB4</td> 00030 <td>PD12</td> 00031 <td>-</td> 00032 </tr> 00033 <tr style="text-align: center;"> 00034 <td><strong>CI 1</strong></td> 00035 <td>-</td> 00036 <td>PA15</td> 00037 <td>PC6</td> 00038 <td>-</td> 00039 <td>-</td> 00040 </tr> 00041 <tr style="text-align: center;"> 00042 <td><strong>CI 2</strong></td> 00043 <td>PA9</td> 00044 <td>PA1</td> 00045 <td>PB5</td> 00046 <td>PD13</td> 00047 <td>PA1</td> 00048 </tr> 00049 <tr style="text-align: center;"> 00050 <td><strong>CI 2</strong></td> 00051 <td>PE11</td> 00052 <td>PB3</td> 00053 <td>PA7</td> 00054 <td>PB7</td> 00055 <td>-</td> 00056 </tr> 00057 <tr style="text-align: center;"> 00058 <td><strong>CI 2</strong></td> 00059 <td>-</td> 00060 <td>-</td> 00061 <td>PC7</td> 00062 <td>-</td> 00063 <td>-</td> 00064 </tr> 00065 </table> 00066 </CENTER> 00067 <b>Achtung!</b> Es können Doppelbelegungen vorkommen! Bitte vorher prüfen, ob der Pin nicht schon verwendet wird. Zudem kann es passieren das mehrfach der gleiche Timer genutzt wird. Mit einer 00068 Neudeklaration des Timers wird dieser Überschrieben mit den zuletzt verwendeten Parametern. Zudem gibt es einen Interrupt Eventhandler der bei Über- und Unterlauf des Timers eine Timercarry Variable hoch bzw. runter zählt. 00069 So kann man bei Frequenzmessungen den Überlauf mit betrachten. 00070 00071 * @code 00072 * #include "mbed.h" 00073 * #include "QUADRATURE.h" 00074 * 00075 * int Event_Routine(){ .... } // Irgendeine Funktion die bei Timerüberlauf aufgerufen wird 00076 * 00077 * int main() { 00078 * 00079 * QUADRATURE encoder(1, 3, 'A', 8, 0, 'A', 9, 0); // Instanz mit Timer 1, Modus 3, 00080 * // CI1: Port A, CI1: Pin 8, rising edge 00081 * // CI2: Port A, CI2: Pin 9, rising edge 00082 * 00083 * encoder.setDownRes(); // Setzt die Pull Down Widerstände 00084 * 00085 * encoder.startTIM(); // Startet den Timer 00086 * 00087 * encoder.setIRQ_METHODE(Event_Routine); // Bei Timerüberlauf wird diese Routine aufgerufen 00088 * 00089 * while(1){ 00090 * printf("Value: %i\r\n", encoder.getTIM()); // Ausgabe des aktuellen Timerwerts als Integer 00091 * printf("Carry: %i\r\n", encoder.getCARRY()); // Ausgabe des aktuellen Timerüberlaufs als signed short 00092 * } 00093 * } 00094 * 00095 * @endcode 00096 */ 00097 00098 class QUADRATURE 00099 { 00100 00101 public: 00102 /*! Konstruktor zum Erstellen einer Instanz für einen bestimmten Timer und die Input Pins. Nach dem Erstellen der Instanz sollte der Timer nicht für andere 00103 Zwecke verwendet werden. Nach dem Erstellen sind die Encoder voll einsatzbereit und kann mit der "startTIM"-Funktion gestartet werden. */ 00104 /*! 00105 \param tim <b>Entsprechender Timer</b> (Die Funktion wird bei der STM32F-Serie nur von Timer 1-5 unterstützt). 00106 \param mode <b>Encoder Modus</b><br> 00107 - 1: Zählt hoch/runter auf CI2-Flanke unter Bedingung der Spannung an CI1<br> 00108 - 2: Zählt hoch/runter auf CI1-Flanke unter Bedingung der Spannung an CI2<br> 00109 - 3: Zählt hoch/runter auf CI1-Flanke und CI2-Flanke unter Bedinung der Spannung an den jeweiligen anderen Eingang<br> 00110 \param CI1_PORT <b>Capture Input 1 Port</b> Entsprechend den Port z.B. A,B,C,D,E des ausgewählten Eingangs aus der Tabelle entnehmen. 00111 \param CI1_PIN <b>Capture Input 1 Pin</b> Entsprechend den Pin zu dem ausgewählten Eingang aus der Tabelle entnehmen. 00112 \param CI1_POL <b>Capture Input 1 Polarität</b> Invertiert den Eingang CI1. Standartwert = steigende Flanke 00113 \param CI2_PORT <b>Capture Input 2 Port</b> Entsprechend den Port z.B. A,B,C,D,E des ausgewählten Eingangs aus der Tabelle entnehmen. 00114 \param CI2_PIN <b>Capture Input 2 Pin</b> Entsprechend den Pin zu dem ausgewählten Eingang aus der Tabelle entnehmen. 00115 \param CI2_POL <b>Capture Input 2 Polarität</b> Invertiert den Eingang CI2. Standartwert = steigende Flanke 00116 */ 00117 QUADRATURE (int tim, int mode, char _CI1_PORT, int _CI1_PIN, int CI1_POL, char _CI2_PORT, int _CI2_PIN, int CI2_POL); 00118 00119 00120 /*! Destruktor der Klasse */ 00121 ~QUADRATURE (){}; 00122 00123 /*! Startet den Timer und den IRQ Handler. */ 00124 void startTIM (); 00125 00126 /*! Stoppt den Timer und den IRQ Handler. */ 00127 void stopTIM (); 00128 00129 /*! Setzt die Pullup Widerstände beider CI Eingänge */ 00130 void setUpRes (); 00131 00132 /*! Setzt die Pulldown Widerstände beider CI Eingänge */ 00133 void setDownRes (); 00134 00135 /*! Gibt aktuellen Timerwert als Integer zurück */ 00136 unsigned int getTIM (); 00137 00138 /*! Gibt aktuellen Über bzw Unterlaufwert als signed short zurück */ 00139 signed short getCARRY (); 00140 00141 /*! Setzt für den Timer den Prescaler und das Autoload register */ 00142 /*! 00143 \param pre <b>Prescaler</b> Standartwert = (0x0000) + 1. Von 0x0000 bis 0xFFFF möglich 00144 \param arr <b>Auto Reload</b> Bei diesem Wert beginnt der Timer wieder bei 0x0000. Standartwert = 0xFFFF 00145 */ 00146 void setTIM (int pre, int arr); 00147 00148 /*! Setzt den entsprechenden GPIO auf die Alternative Funktion für den Timer Eingang. */ 00149 /*! 00150 \param port <b>GPIO Port</b> Port der geändert werden soll 00151 \param pin <b>GPIO Pin</b> Pin der geändert werden soll 00152 \param tim <b>Timer</b> Für die Auswahl zwischen den Alternativen Funktionen notwendig 00153 */ 00154 void setGPIO (char port, int pin, int tim); 00155 00156 00157 /*! Interrupt Routine bei Überlauf bzw. Unterlauf des Timers. */ 00158 void UPDATE_HANDLER (void); 00159 00160 /*! Setzt eine weitere Routine die verwendet werden kann, wenn der Timer Interrupthandler aufgerufen wird. */ 00161 /*! 00162 \param IRQ_HANDLER_METHODE Adresse zur weiteren Routine 00163 */ 00164 void setIRQ_METHODE (void (*IRQ_HANDLER_METHODE)(void)); 00165 00166 protected: 00167 00168 //! Caputure Input 1 Portname 00169 char CI1_PORT; 00170 //! Caputure Input 2 Portname 00171 char CI2_PORT; 00172 //! Caputure Input 1 Pin 00173 int CI1_PIN; 00174 //! Caputure Input 2 Pin 00175 int CI2_PIN; 00176 //! Pointer zum zuletzt definierten GPIO 00177 GPIO_TypeDef *portpo; 00178 //! Pointer zum aktuell definierten Timer 00179 TIM_TypeDef *tipo; 00180 //! Pointer zum aktuell definierten Interrupt Handler 00181 IRQn_Type temp_ITM; 00182 //! Freigabe zur Verwendung externer Funktionen 00183 bool extfct; 00184 //! Externe Funktion bei Timer Interrupt aufrufen 00185 void (*IRQ_HANDLER_EXTERN)(void); 00186 00187 //! Timer Über und Unterlauf Zähler (Wenn Unterlauf wird decrementiert, wenn Überlauf wird incrementiert) 00188 signed short TIMERCARRY; 00189 //! Funktion zum Zuweisen der ISR zum Handler der erstellten Instanz 00190 static void _UPDATE_HANDLER(void); 00191 //! Pointer zur Adresse der erstellte Instanz 00192 static QUADRATURE *instance; 00193 00194 00195 /*! Wählt das passende GPIO register aus und schreibt es in den Pointer portpo */ 00196 /*! 00197 \param port <b>Portname</b> Welcher Port gewählt werden soll z.B. A,B,... 00198 */ 00199 void GPIOchoose (char port); 00200 00201 00202 00203 00204 }; 00205 00206 #endif
Generated on Wed Jul 13 2022 17:06:12 by 1.7.2