Forum: Mikrocontroller und Digitale Elektronik Lüfter Drehzahlmessung STM32


von Lüfterfreund (Gast)


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

von Teo D. (teoderix)


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.

von Gerd E. (robberknight)


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.

von Lüfterfreund (Gast)


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 ...

von Lüfterfreund (Gast)


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?

von Gerd E. (robberknight)


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.

von Lüfterfreund (Gast)


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?)

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Lüfterfreund schrieb:
> Ist das dann Input Capture? (TIMX_CC?)

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

von m.n. (Gast)


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.

von Lüfterfreund (Gast)


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.

von m.n. (Gast)


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.

von Lüfterfreund (Gast)


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
      
2
        /* (1) Select the active input TI1 (CC1S = 01),
3
        program the input filter for 8 clock cycles (IC1F = 0011),
4
        select the rising edge on CC1 (CC1P = 0, reset value)
5
        and prescaler at each valid transition (IC1PS = 00, reset value) */
6
        /* (2) Enable capture by setting CC1E */
7
        /* (3) Enable interrupt on Capture/Compare */
8
        /* (4) Enable counter */
9
10
TIMx->CCMR1 |= TIM_CCMR1_CC1S_0 | TIM_CCMR1_IC1F_0 |     TIM_CCMR1_IC1F_1; /* (1)*/
11
TIMx->CCER |= TIM_CCER_CC1E; /* (2) */
12
TIMx->DIER |= TIM_DIER_CC1IE; /* (3) */
13
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?

von m.n. (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.