Forum: Mikrocontroller und Digitale Elektronik Verständnisproblem - STM32 Input Capture


von RedScorpio95 (Gast)


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!

von Therman (Gast)


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?

von RedScorpio95 (Gast)


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? :/

von Tobias P. (hubertus)


Lesenswert?

Du kannst ja dein Signal auf 2 capture Eingänge geben. Den ersten 
triggerst du auf die steigende, den 2. auf die fallende Flanke, und der 
löst dann den Interrupt aus. Dann einfach die Differenz bestimmen.

von RedScorpio95 (Gast)


Lesenswert?

Das ist auch eine nette Lösung. Danke für den Tip!

von RedScorpio95 (Gast)


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

von Guest (Gast)


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.

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.