Verständnisproblem - STM32 Input Capture

Gast #6225294
Lesenswert?

Hallo ihr Lieben,

habe ein kleineres(?) Verständnisproblem bezüglich des Input Capture 
Modes meines STM32-Boards und bin leider auch noch sehr unerfahren 
innerhalb der Cube-Programmierung.

Was ich habe:

STM32F0DISCOVERY-Board mit einem STM32F051R8 onboard, demnach einen 
CPU-Takt von 48MHz.

Was ich möchte:

Die Pulsbreite eines EINMALIG einkommenden Signals ermitteln.
(Ist also ein nicht-periodisches Signal - Input Capture hierfür 
überhaupt geeignet?)

Grundsätzlich scheint das ja mittels der Konfiguration über steigende 
und fallende Flanke zu funktionieren, allerdings ist die Pulsbreite des 
einkommenden Signals </= 20us groß!

Ist das bei 48MHz und einem 16- bzw. 32-Bit Timer irgendwie 
realisierbei, eine solch kurze Pulsbreite zu messen?

Ich weiß bereits, dass sich die maximale Frequenz über TIMXCLK / ARR 
(also ARR = 2^16 oder 2^32) berechnen lässt, aber - und bitte 
entschuldigt mein Unwissen - es wundert mich irgendwie sehr, dass ich 
grundsätzlich einen Timer mit Zeitschritten von 1us hochzählen lassen 
kann, aber bei der Verwendung eines 16-Bit-Timers für den Input Capture 
Mode lediglich bis 48MHz / 2^16 = 732Hz = 1,4ms ermitteln kann? Stehe 
ich komplett auf dem Schlauch?

Falls das alles nicht klappen sollte: Alternativvorschläge eventuell?


Besten Dank!
Gast #6225311
Lesenswert?

Bin jetzt nicht sicher, ob der Timer auch mit 48Mhz oder nur mit 24 
getaktet werden kann. Aber bei 1µs hättest Du einen Zählerstand von 48.
Bei 20µs dann schon 960 Steps. Also fast 0.1% Auflösung. Ist doch 
bestimmt ausreichen, oder?
Gast #6226438
Lesenswert?

Therman schrieb:
> Bin jetzt nicht sicher, ob der Timer auch mit 48Mhz oder nur mit
> 24
> getaktet werden kann. Aber bei 1µs hättest Du einen Zählerstand von 48.
> Bei 20µs dann schon 960 Steps. Also fast 0.1% Auflösung. Ist doch
> bestimmt ausreichen, oder?

Ja, die Timer kann man mit 48MHz takten, aber wie kommst du denn bei 1us 
auf einen Zählerstand von 48.. Mir ist da wohl einfach die Rechnung 
nicht so klar? :/
Gast #6234299
Lesenswert?

Falls hier jemand in Zukunft auch Probleme haben sollte, habe nun meine 
Fragen beantworten können.

RedScorpio95 schrieb:

> Die Pulsbreite eines EINMALIG einkommenden Signals ermitteln.
> (Ist also ein nicht-periodisches Signal - Input Capture hierfür
> überhaupt geeignet?)

Ein grundsätzliches JA. Nach dem Auslesen der positiven Flanke am 
ausgewählten Input-Capture-Eingang kann der Flanken-Trigger einfach mit 
der HAL-Funktion __HAL_TIM_SET_CAPTUREPOLARITY auf negative Flanken 
umgestellt werden.

Eine gute Beschreibung findet man hier:
https://controllerstech.com/measure-pulse-width-using-input-capture-in-stm32/


> Ist das bei 48MHz und einem 16- bzw. 32-Bit Timer irgendwie
> realisierbei, eine solch kurze Pulsbreite zu messen?

Auch hier ein ja. Bei der Berechnung stand ich tatsächlich komplett auf 
dem Schlauch - bitte überlesen. Eine Pulsbreite von 20us kann man 
messen, indem man einen Timer jede us inkrementiert... bei einem 
Systemtakt von 48MHz, mit dem auch der Timer befeuert wird, ergibt sich 
für die gewünschte T_timetick von 1us eine f_timetick von 1MHz. Damit 
sollte sich der Prescaler + 1 zu 48MHz / 1MHz = 48 ergeben, also im 
Programmcode 48-1.
ARR sollte trotzdem auf den Maximalwert eingestellt werden, hat aber mit 
der Rechnung von gerade nichts zu tun.

Auch das ist mit obigem Link gut erklärt worden.

VG
Gast #6234308
Lesenswert?

Warum lässt du ihn nicht einfach mit 48 MHz laufen? dann ist deine 
Messung viel genauer....

Außerdem wenn du eh Cube benutzt kannst du den Timer direkt auf PWM 
Input stellen dann nutzte er 2 Timer Channel, einen direkt und einen 
indirekt. Damit hast du 2 capture Werte aus denen du direkt die 
Pulsbreite bekommst.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren