Libs for using Nucleo STM32F411 periphery

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers QUADRATURE.h Source File

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