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
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.
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.
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 ...
@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?
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.
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?)
Lüfterfreund schrieb: > Ist das dann Input Capture? (TIMX_CC?) Eher externe Timerclock, manchmal auch 'Counter' Mode genannt.
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.
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.
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.
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.