mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Lüfter Drehzahlmessung STM32


Autor: Lüfterfreund (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Abend,

ich baue gerade einen "Ventilator" (12V-Lüfter) für meinen Schreibtisch 
und benutze dabei mein STM32F4 Discovery Board (habe ich seit gestern).

Der Lüfter, den ich mir bestellt habe, hat 3 Leitungen - also eine 
Leitung für die Drehzahl.

Diese möchte ich nun auslesen ...
Der Lüfter kann von 0 bis 2.500 1/min.

Nun würde mich eine gute Vorgehensweise interessieren.

Habe ich mir überlegt:

-> einen Timer auf einen externen Interrupt einstellen
-> in der Interrupt-Routine einen Variable hochzählen lassen

-> einen weiteren Timer immer nach einer bestimmten Zeit den Wert 
abfragen lassen
-> Drehzahl aus diesem Wert berechnen

Was meint Ihr, ist das ok so? Geht es besser/schneller?

LG, LF

Autor: Teo Derix (teoderix)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lüfterfreund schrieb:
> -> einen Timer auf einen externen Interrupt einstellen

Meinst Du damit einen Timer extern triggern (der Int kommt wenn dann vom 
Timerüberlauf)?
Ja klar is das ne gute Idee.

Autor: Gerd E. (robberknight)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lüfterfreund schrieb:
> STM32F4 Discovery Board
[...]
> Der Lüfter kann von 0 bis 2.500 1/min.

Der STM32F4 ist um mehrere Größenordnungen schneller als Dein Lüfter. Da 
ist es quasi egal wie Du das machst - mit 2 Timern oder nur mit EXTIs 
und dem Systick. Du musst nur aufpassen daß die Timer in der langen 
Wartezeit zwischen 2 Lüfterpulsen nicht überlaufen.

> -> einen Timer auf einen externen Interrupt einstellen
> -> in der Interrupt-Routine einen Variable hochzählen lassen

Für schnelle Signale und präzise Messung würde man den Timer so 
einstellen, daß er direkt in Hardware und ohne Interrupt bei einem 
externen Signal hochzählt. Siehe Refman.

Autor: Lüfterfreund (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, ich meinte der externe Interrupt wird durch eine Flanke des 
Drehzahlsignals ausgelöst. Und dann erhöhe ich eine Variable.
Diese Variable erhöhe ich so lange, bis der zweite Timer Interrupt 
auslöst (nach Zeit) und mit dem Wert rechnet. Dann alles wieder auf 0 
zurück ...

Autor: Lüfterfreund (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Gerd E

> Für schnelle Signale und präzise Messung würde man den Timer so
> einstellen, daß er direkt in Hardware und ohne Interrupt bei einem
> externen Signal hochzählt. Siehe Refman.

Meinst du damit, anstatt einer Variable slebst im Quellcode 
hochzuzählen, einen Timer zählen zu lassen?

Autor: Gerd E. (robberknight)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lüfterfreund schrieb:
> Meinst du damit, anstatt einer Variable slebst im Quellcode
> hochzuzählen, einen Timer zählen zu lassen?

genau.

Und gesteuert durch einen weiteren Timer liest Du dann irgendwann den 
Wert dieses durch das Signal hochgezählten Timers aus.

Autor: Lüfterfreund (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gerd E. schrieb:
> Und gesteuert durch einen weiteren Timer liest Du dann irgendwann den
> Wert dieses durch das Signal hochgezählten Timers aus.

Ist das dann Input Capture? (TIMX_CC?)

Autor: Matthias S. (Firma: matzetronics) (mschoeldgen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lüfterfreund schrieb:
> Ist das dann Input Capture? (TIMX_CC?)

Eher externe Timerclock, manchmal auch 'Counter' Mode genannt.

Autor: m.n. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lüfterfreund schrieb:
> Geht es besser/schneller?

Bei einem Timer mit Input Capture den Zählerstand festhalten und 
gleichzeitig den Zähler zurücksetzen. Beschreibung steht im Ref.-Manual 
unter PWM input mode.
Im Capture Register steht dann die Periodendauer.
1/Periode * 60 ergibt die Drehzahl.

Autor: Lüfterfreund (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
m.n. schrieb:
> Beschreibung steht im Ref.-Manual
> unter PWM input mode.

Danke für den Tipp!

Im Ref.-Manual steht nun dieser Satz:

Select the active input for TIMx_CCR1: write the CC1S bits to 01 in the 
TIMx_CCMR1 register (TI1 selected).

Kannst du mir diesen Satz in Quellcode zeigen? Das klingt etwas 
kompliziert für mich, habe da noch nicht die Erfahrung mit Registern 
setzen usw.

Autor: m.n. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier ein Quellcode: http://mino-elektronik.de/progs/STM32F4xx/f_mess.c

Sieh Dir unter init_t9() an, wie die Register beschrieben werden.
Das Programm macht zwar auch eine Frequenzmessung, ist aber für den 
einfachen Bedarf etwas umfangreicher, da das Meßverfahren genauer und 
aufwendiger ist.

Autor: Lüfterfreund (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
m.n. schrieb:
> Sieh Dir unter init_t9() an, wie die Register beschrieben werden.

Vielen Dank für das Beispiel!
Ich habe auch noch ein Beispiel gefunden.
      
        /* (1) Select the active input TI1 (CC1S = 01),
        program the input filter for 8 clock cycles (IC1F = 0011),
        select the rising edge on CC1 (CC1P = 0, reset value)
        and prescaler at each valid transition (IC1PS = 00, reset value) */
        /* (2) Enable capture by setting CC1E */
        /* (3) Enable interrupt on Capture/Compare */
        /* (4) Enable counter */

TIMx->CCMR1 |= TIM_CCMR1_CC1S_0 | TIM_CCMR1_IC1F_0 |     TIM_CCMR1_IC1F_1; /* (1)*/
TIMx->CCER |= TIM_CCER_CC1E; /* (2) */
TIMx->DIER |= TIM_DIER_CC1IE; /* (3) */
TIMx->CR1 |= TIM_CR1_CEN; /* (4) */

Nur verstehe ich nicht ganz, wie ich nun sagen kann, dass mein Signal 
vom Lüfter an bspw. Timer3 Channel3 anliegt. Geht das überhaupt?

Autor: m.n. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lüfterfreund schrieb:
> Nur verstehe ich nicht ganz, wie ich nun sagen kann, dass mein Signal
> vom Lüfter an bspw. Timer3 Channel3 anliegt.

Das steht auch im Datenblatt, oder besser, es steht dort nicht, da es 
nicht geht.
Wenn es unbedingt ein STM32F4xx sein muß, dann mußt Du auch das 
Datenblatt lesen und verstehen. Für die ersten Schritte wäre es 
sinnvoll, zunächst eine einfachere Aufgabe zu lösen.
Wie der Meßwert angezeigt werden soll, ist wohl auch noch nicht klar?

Viel einfacher wäre ein Drehzahl(Frequenz) -> Spannungswandler und 
Anzeige der Spannung analog oder digital.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.