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!
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?
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? :/
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.