Forum: Mikrocontroller und Digitale Elektronik 32 Input Capture auf STM32


von Max M. (maxi123456)


Lesenswert?

Hallo,

ist es möglich auf einem STM32F4 ein 32bit input capture zu machen mit 
zwei kaskadierten Timern?

Danke!

von Walter T. (nicolas)


Lesenswert?

Was hast Du vor? Generell kannst Du in der ISR alles machen, wozu Du 
Lust hast.

von Christopher J. (christopher_j23)


Lesenswert?

Grundsätzlich kann man deine Frage mit "ja" beantworten. Die Gegenfrage 
ist aber ob du überhaupt zwei kaskadierte Timer benötigst, weil es ja 
Timer gibt, die von Haus aus 32bit mitbringen (z.B. Timer 2 und 5).

von Max M. (maxi123456)


Lesenswert?

Das mit Tim2 und Tim5 sehe ich ja erst jetzt, das wäre ja prima.

Ich möchte halt eine langsame Frequenz mit einer sehr hohen Genauigkeit 
messen. Also 32bit, ohne Prescaler.

Kann ich auch ein input capture eines anderen Timers als Event für 
TIM2/5 benutzen, so dass dieser ein Capure-EVent macht? Oder kann ich 
per DMA dann einfach das CNT Register des 32bit timers verwenden?

Das CNT Register bei TIM2/TIM5 wird mir aber im Datenblatt nur 16bit 
wertig angezeigt.

: Bearbeitet durch User
von Walter T. (nicolas)


Lesenswert?

Max M. schrieb:
> Kann ich auch ein input capture eines anderen Timers als Event für
> TIM2/5 benutzen, so dass dieser ein Capure-EVent macht?


Kennst Du das Timer-Kochbuch schon?

http://www.st.com/content/ccc/resource/technical/document/application_note/group0/91/01/84/3f/7c/67/41/3f/DM00236305/files/DM00236305.pdf/jcr:content/translations/en.DM00236305.pdf

von m.n. (Gast)


Lesenswert?

Max M. schrieb:
> Ich möchte halt eine langsame Frequenz mit einer sehr hohen Genauigkeit
> messen. Also 32bit, ohne Prescaler.

Dafür reicht ein 16 Bit breiter Timer und die Beachtung der Überläufe.
Hier wird zum Beispiel Timer 9 dafür verwendet: 
Beitrag "reziproker Frequenzzähler mit STM32F4Discovery"

von Max M. (maxi123456)


Lesenswert?

Ich habe es jetzt hinbekommen mit zwei Timern. TimerA generiert ein 
Input Capture, erzeugt jedoch nur einen Trigger. Der zweite 32bit TIM2 
Timer erzeugt auch bei genau diesem Trigger ein Input Capture und löst 
ein DMA aus.

Tolle Sache!

: Bearbeitet durch User
von Zeiger (Gast)


Lesenswert?

Max M. schrieb:
> Ich habe es jetzt hinbekommen mit zwei Timern. TimerA generiert
> ein
> Input Capture, erzeugt jedoch nur einen Trigger. Der zweite 32bit TIM2
> Timer erzeugt auch bei genau diesem Trigger ein Input Capture und löst
> ein DMA aus.
>
> Tolle Sache!

Zeig mal her.

von Max M. (maxi123456)


Lesenswert?

In TIMx_CR2_MMS auf 0b011(Compare Pulse) setzen, das erzeugt bei einem 
Inputcapture einen Trigger.

Dann in TIM2_SMCR_TS den Timer, welcher den Trigger erzeugt als Quelle 
auswählen.

Anschließend in TIM2_CCMR1_CC1 auf 0b11 setzen, das bewirkt, dass der 
Trigger einen Input Capture beim CC1 auslöst.

Der rest ist ja bekannt, DMA auslösen auf TIM2, ARR Register setzen, RCC 
und TEN.

Man kann bei dem Trigger-Quelle-Timmer auch Ch1-3 mit XOR verknüpfen, so 
dass  ein Input Capture auf einem dieser Kanäle einen Trigger auslöst.

von m.n. (Gast)


Lesenswert?

Max M. schrieb:
> In TIMx_CR2_MMS ....
>
> Dann in TIM2_SMCR_TS ....
>
> Anschließend in TIM2_CCMR1_CC1 ....
>
> Der rest ist ja bekannt ....
>
> Man kann ....

Und wozu soll das alles notwendig sein?

von Max M. (maxi123456)


Lesenswert?

Weil es dann per DMA voll parallel geht. Ich habe nun mal weder von TIM2 
noch TIM5 einen Channel an einem der Eingangspins. Und so wird das 
Signal des dort tatsächlich anliegenden Timers direkt an einen 32bit 
Timer weitergegeben, welcher dann per DMA den Input Capture durchführt.

Keine Interrupts und zerbrochene Capture Messung mit irgendeinem 
Überlauf Interrupt, welches noch eine zweite variable hochzählen muss.

: Bearbeitet durch User
von m.n. (Gast)


Lesenswert?

Du nimmst also lieber einen 2. Timer als eine Variable hochzuzählen?

Ich weiß nicht, was für Dich eine langsame Frequenz ist. Sind es 10 mHz?
Auch ein 32 Zähler hat irgendwann einen Überlauf. Was machst Du damit?

Na gut, Du löscht den Zähler immer wieder, aber was machst Du, wenn 
Löschsignal und Captureimpuls gleichzeitig eintreffen? Wenn Du Pech 
hast, hast Du nur fünf Fehlmessungen am Tag. Da kann man schon mal 
länger suchen.

Anstatt eines einzigen Timers brauchst Du derer zwei, noch einen 
DMA-Kanal und ein unausgegohrenes Vorgehen, wenn Ereignisse gleichzeitig 
eintreffen.
Aber vielleicht willst Du ja auch 10 kHz messen und brauchst 10000 
Ergebnisse/s?
Bei unbekannten Anforderungen kann ich aber auch nur mutmaßen.

von Max M. (maxi123456)


Lesenswert?

Ich persönlich denke, dass der Trigger schneller beim TIM2 ist, um einen 
korrekten 32bit Capture auszuführen, als ein Interrupt, welcher eine 
Variable auch noch hochzählen muss und beim Capture dem Ergebnis 
hinzufügen muss.

Sofern etwas in Hardware geht, tu ich das auch. Der minimale 
Stromverbrauch des zusätzlichen Timers ist unwichtig.

Zusätzlich verwende ich nicht nur ein Capturewert, sondern min. zwei 
(oder praktisch mehrere in Folge). Der Abstand zw. den Messwerten ist 
dann die Zeit. Ein Überlauf ist da unproblematisch.

: Bearbeitet durch User
von Noah (Gast)


Lesenswert?

Max M. schrieb:
> Anschließend in TIM2_CCMR1_CC1 auf 0b11 setzen, das bewirkt, dass der
> Trigger einen Input Capture beim CC1 auslöst.

Genau das was ich brauchte, bist ein Schatz?

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.