49-InputCapture_Frq-Library (STM32F4)

Um eine (odere mehrere) externe Frequenzen mit dem STM32F4 messen zu können, kann diese Library(s) benutzt werden.
(es gibt auch noch eine extra LIB wenn noch der Dutycycle gemessen werden soll)

Ich habe wie bei der PWM-Lib für die vier Timer “TIM2, TIM3, TIM4, TIM5″ je eine Library geschrieben.

Die Timer werden im Input-Capture-Mode betrieben. Die Interrupt-Funktion wird also nur einmal pro Hi-Flanke vom externen Signal aufgerufen. Nach zwei Hi-Flanken wird der zeitliche Abstand zwischen den Flanken ermittelt und abgespeichert. Dieser Wert entspricht dann der Periodendauer.

Pro Timer können bis zu 4 verschiedene Eingangs-Signale gemessen werden.

Die Anzahl und Namen der Kanäle die benutzt werden sollen, müßen im H-File deklariert und im C-File den entsprechenden Port-Pins zugeordnet werden.
(bei den Beispielen hab ich immer nur zwei Kanäle pro Timer aktiviert)

Im H-File wird auch die Takt-Frequenz vom Timer eingestellt. Dieser gilt dann für alle Kanäle und beeinflusst die Auflösung und die minimale Frequenz die gemessen werden kann.

Hinweis : die Funktion zum auslesen der Frequenz übergibt nur den Timerwert der Periodendauer. Das umrechnen in eine Frequenz muss, wenn notwendig, extra gemacht werden. Falls kein Signal anliegt (oder die Messung noch nicht fertig ist) ist der Rückgabewert = 0. Damit kann ein fehlendes Signal erkannt werden.

Bild :

frq_in

Voraussetzungen :

1
2
Benutzte Module der CooCox-IDE : GPIO, TIM, MISC
Benutzte Librarys : keine

Enumerationen (für FRQ mit TIM2) :

1
2
3
4
5
typedef enum 
{
  ICFRQ_T2_PB11 = 0,  // FRQ-Messung per TIM2 an PB11
  ICFRQ_T2_PA2  = 1   // FRQ-Messung per TIM2 an PA2
}ICFRQ_TIM2_NAME_t;

Funktionen (für FRQ mit TIM2) :

1
2
void UB_ICFRQ_TIM2_Init(void);                           // um die FRQ-Messung mit TIM2 zu initialisieren
uint32_t UB_ICFRQ_TIM2_ReadFRQ(ICFRQ_TIM2_NAME_t vname); // zum auslesen der gemessenen Frequenz

Beispiel :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
//--------------------------------------------------------------
// File     : main.c
// Datum    : 10.07.2013
// Version  : 1.0
// Autor    : UB
// EMail    : mc-4u(@)t-online.de
// Web      : www.mikrocontroller-4u.de
// CPU      : STM32F4
// IDE      : CooCox CoIDE 1.7.0
// Module   : CMSIS_BOOT, M4_CMSIS_CORE
// Funktion : Demo der InputCapture FRQ-Library
// Hinweis  : Diese zwei Files muessen auf 8MHz stehen
//              "cmsis_boot/stm32f4xx.h"
//              "cmsis_boot/system_stm32f4xx.c"
//--------------------------------------------------------------
 
#include "main.h"
#include "stm32_ub_icfrq_tim2.h"
 
int main(void)
{
  uint32_t messwert=0,freuqenz=0;
 
  SystemInit(); // Quarz Einstellungen aktivieren
 
  // Init vom Timer2 zur FRQ-Messung
  UB_ICFRQ_TIM2_Init();
 
  while(1)
  {
    // gemessene FRQ an PB11 auslesen
    messwert=UB_ICFRQ_TIM2_ReadFRQ(ICFRQ_T2_PB11);
    if(messwert>0) {
      // wenn Messwert gueltig
      // frequenz ausrechnen
      freuqenz=(1000000/messwert);
    }
  }
}

Hier die Library zum Download :

ub_stm32f4_ic_frq_v100

Hier der komplette CooCox-Projektordner zum Download :

Demo_49_FRQ_IN

7 Antworten auf 49-InputCapture_Frq-Library (STM32F4)

  1. Simn sagt:

    Hallo,

    ich hab ein Problem in meinem Projekt.
    Ich messe über Chanel 2 und Chanel 3 je eine Frequenz,
    klappt alles auch prima.
    ABER: Ab und zu bricht die Frequenz ein für eine kurze Zeit und der Messwert wird verfälscht, also mess ich bsp. 200 Hz passiert es unregelmäßig und kurz dass ich für einen Moment nur bsp. 20 Hz messe und dann direkt wieder 200 Hz.

    Kann das problem an dem Interrupt liegen? Muss ich den Interrupt irgendwo dissablen??

    • Simn sagt:

      Thema erledigt,

      musste einfach die Priorität des Input-Capture Interrupt höher stellen as die Priorität des USART Interrupt!!

      • admin_ub sagt:

        ja, das ist ein Problem mit meinen Librarys. Ich kann nicht alle Kombinationen auf Funktion prüfen, da muß man schon selbst durch.

  2. A_min sagt:

    Hallo,

    ich möchte für ein Projekt Rechtecksignale mit Frequenzen zwischen 1 – 2 MHz messen.
    Bei Tests mit einem Frequenzgenerator waren Frequenzen bis zu ca. 300 kHz messbar. Ist es möglich das Programm dahin gehend anzupassen?

    • Joerg B. sagt:

      Du musst im -h file nur den prescaler weiter herunter setzen.

      Man muss sich nur mal ansehen was man benutzen will.

      • A_min sagt:

        Das mit dem prescaler habe ich schon probiert.
        Doch auch bei einem prescaler von 1 wird ab einer Frequenz von ca. 500kHz nur die halbe Frequenz angezeigt (darunter passen die Werte). Ab ca. 1 MHz geht dann nichts mehr.
        Ich benutze zusätzlich noch die UART-Librarys um mir das ganze auf dem PC anzuschauen. Das mit der Interrupt Priorität habe ich beachtet.
        Kann es sein, dass bei so hohen Frequenzen nicht mehr häufig genug abgetastet wird?

        • admin_ub sagt:

          falls du nur einen Eingang messen willst, würde ich alles aus der ISR rauswerfen was nicht gebraucht wird. (jede IF-Abfrage usw) die Berechnung der Differenz kannst du auch außerhalb der ISR machen (das kostet auch Zeit)…also versuch den IRQ_Handler so kurz wie möglich zu machen.
          Eine andere Möglichkeit ist das ganze komplett anderes zu machen : einen Counter per externem Clock (deinem Messisgnal) zählen lassen und diesen Counterwert zyklisch mit einem Timer auslesen (z.B. alle 1ms). Damit sollten “beliebig” große Frequenzen messbar sein.


Wie hat Dir dieser Artikel gefallen?

1 Stern2 Sterne3 Sterne4 Sterne5 Sterne (Noch keine Bewertungen)
Loading...

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert