Forum: Mikrocontroller und Digitale Elektronik Pulslänge mit STM32 Timer vermessen


von J. V. (janvi)


Lesenswert?

momentan probiere ich (ohne Erfolg) mit einem General Purpose Timer 
eingehende Impulslängen zu vermessen. Soweit ich sehe (?) sind alle 
Beispiele in HAL und Cube immer nur zur Frequenzmessung, als zwischen 
zwei Flanken in gleicher Richtung. Die Impulslänge müsste doch 
theoretisch gehen indem man nach einer Flanke einen Interrupt kriegt und 
darin die Flankenrichtung zum nächsten Signal umdreht. Oder gibt es dazu 
einen anderen Trick oder vielleicht sogar ein Beispiel?

Momentan liegt das Signal auf einem Timer der im Quadratur Mode 
arbeitet. Das funktioniert gut und auch bei der HW könnte ich das Signal 
zusätzlich auf einen ETR oder einen der Kanäle eines weiteren Timers 
verdrahten. Ich möchte neben der Position auch die Geschwindigkeit in 
einer möglichst kurzen Zeit (1 Impuls) möglichst genau erfassen. Daß 
dafür vermutlich weitere Eingangspins belegt werden, habe ich mich schon 
abgefunden.

von Walter T. (nicolas)


Lesenswert?

Das Timer-Cookbook AN4776 sagt dazu (und zu maximalen und minimalen 
Input-Länge) auf Seite 29 folgendes:

https://www.st.com/resource/en/application_note/dm00236305-generalpurpose-timer-cookbook-for-stm32-microcontrollers-stmicroelectronics.pdf

von Erich (Gast)


Lesenswert?

Dein Problem ist unklare Ausdrucksweise, sowie fehlende Angaben zu 
minimalen und maximalen Werten. Einmalige Messung "nächster Impuls", 
Polorität. Oder fortlaufende Messung, wie lange, welche Mittelung? Evtl. 
Skizze.
Gruss

von m.n. (Gast)


Lesenswert?

J. V. schrieb:
> mit einem General Purpose Timer
> eingehende Impulslängen zu vermessen

dafür kann man den "PWM input mode" verwenden.

von Uwe B. (Firma: TU Darmstadt) (uwebonnes)


Lesenswert?

Ich wuerde den Zaehler mit geeigneter Aufloesung durchlaufen lassen und 
mit einer Flanke des zu messenden Impulses ein Capture ausloesen und im 
Capture Interrupt den vorher "gecapturten" Wert abziehen.

von Janvi (Gast)


Lesenswert?

kürzeste Pulslängen werden mit 4mS erwartet. Es ist also genug Zeit, 
hier was auf andere Flankenrichtung umzuinitialisieren oder einen 
vorhergehenden Capture Wert abzuholen.

> auf Seite 29 folgendes:

auch das scheint mir eine Frequenzmessung ?

> dafür kann man den "PWM input mode" verwenden.

der scheint zwei Kanäle eines Timers zu verwenden. Kanal 1 macht Capture 
bei der steigenden der Kanal 2 bei der Fallenden Flanke was eigentlich 
ein guter Ansatz sein solle...

von Rolf M. (rmagnus)


Lesenswert?

Erich schrieb:
> Dein Problem ist unklare Ausdrucksweise, sowie fehlende Angaben zu
> minimalen und maximalen Werten. Einmalige Messung "nächster Impuls",
> Polorität. Oder fortlaufende Messung, wie lange, welche Mittelung? Evtl.
> Skizze.

All das brauchst du, um dem TO mitteilen zu können, wie man einen Timer 
so einstellt, dass er die Dauer von einer Flanke zur dazugehörigen 
umgekehrten Flanke ermittelt?

von Walter T. (nicolas)


Lesenswert?

Janvi schrieb:
> auch das scheint mir eine Frequenzmessung ?

Was unterscheidet Dein Anliegen von einer Frequenzmessung? Wills Du 
jeweils einen Einzelwert für den Abstand zwischen steigener und 
fallender Flanke und umgekehrt?



J. V. schrieb:
> f einen ETR oder einen der Kanäle eines weiteren Timers
> verdrahten. Ich möchte neben der Position auch die Geschwindigkeit in
> einer möglichst kurzen Zeit (1 Impuls) möglichst genau erfassen.

Quadratur Decoder klingt nach Drehgeber oder Glasmassstab. In diesem 
Fall wird das Ergebnis eines direkten Samplings extrem jitterbehaftet 
sein und ohne tiefpassfilterung absolut unbrauchbar - und dann hat man 
nichts von der Einzelflankendetektion. Und das auch nur, wenn das 
mechanische System nicht zittert. Kommt das auch noch, addiert sich das 
mechanische Zittern zum Jitter der Abtastung. That's a moiré.

Unterm Strich ist das wohl eine der Ideen, die man einmal im Leben 
ausprobiert haben muss, bis man merkt, dass das wohl eine Schnappsidee 
war.

von Manfred T. (mth09)


Lesenswert?

Hallo janvi
Ich programmiere PIC MCU‘s u. Kenne den STM32 nicht aber vielleicht 
hilft Dir meine Idee weiter.
Hier meine Idee:
Viele PIC MCU‘s haben einen 16Bit Timer (z. B. Timer1) mit Gate control. 
Wenn man am CLK Eingang eine Frequ. von z. B. 1Mhz anlegt u. den zu 
messenden Puls am Gate anlegt dann erhält man die Pulsbreite in μs 
(siehe Skizze in Anhang).
Beim PIC kann man im Timer1 Gate auch die Polarität wählen. Damit könnte 
man auch negative Pulse messen.
Schau mal in Dein Datenblatt, vielleicht hat der STM32 so einen Timer.

von Manfred T. (mth09)


Angehängte Dateien:

Lesenswert?

Irgendwie funktionierte der Dateianhang nicht.
Hier ein neuer Versuch.

von m.n. (Gast)


Lesenswert?

Manfred T. schrieb:
> Ich programmiere PIC MCU‘s u. Kenne den STM32 nicht aber vielleicht
> hilft Dir meine Idee weiter.

Ich kenne PIC MCU''''s nicht, aber vielleicht hilft Dir meine Idee 
weiter.
Nimm eine Handvoll SN74LS161, ein paar ....
Noch jemand mit 8051 o.ä.?

Janvi schrieb:
>> dafür kann man den "PWM input mode" verwenden.
>
> der scheint zwei Kanäle eines Timers zu verwenden. Kanal 1 macht Capture
> bei der steigenden der Kanal 2 bei der Fallenden Flanke

Es scheint nicht nur, sondern ist auch so. Neben der Erkennung beider 
Flanken, wird der Zähler auch wieder "geriehzettet".
Die notwendigen Befehle für die Initialisierung stehen im Ref.-Handbuch.

von Peter D. (peda)


Lesenswert?

m.n. schrieb:
> Noch jemand mit 8051 o.ä.?

Damit habe ich mal den SMT160 (neu: SMT172) Temperature sensor 
ausgelesen, geht prima.
Ein Timer durchlaufend, den anderen im Gate-Mode und schon hat man das 
Tastverhältnis.

von m.n. (Gast)


Lesenswert?

Einen einzelnen Impuls so zu messen - so hatte ich die Frage des TO 
verstanden - ist nicht so geschickt. Die Hardware eines STM32 zu nutzen, 
macht die Sache deutlich einfacher. Insbesondere bei sehr kleinen 
Tastverhältnissen muß man aufpassen, wenn Flanken per ISR umgeschaltet 
werden sollen.

Wenn es um ein andauerndes Signal geht, gibt es natürlich viele 
Möglichkeiten. Für STM32 zum Beispiel:
Beitrag "Frequenz- und Pulsweitenmessung mit STM32F407"
oder
Beitrag ""ungenaue" Pulsweiten-Messung"
oder wenn es ein ATmega sein soll 
Beitrag "Stoppuhr – Geschwindigkeit – Pulsweite mit Atmega88"

Aber vielleicht erbarmt sich ja jemand, dem TO die Einstellungen für HAL 
zu nennen. Was dort anzuklicken ist, ist ja weder zündend noch 
einleuchtend ;-)

von Erich (Gast)


Lesenswert?

Rolf M. schrieb:
> Erich schrieb:
>> Dein Problem ist unklare Ausdrucksweise, sowie fehlende Angaben zu
>> minimalen und maximalen Werten. Einmalige Messung "nächster Impuls",
>> Polorität. Oder fortlaufende Messung, wie lange, welche Mittelung? Evtl.
>> Skizze.
>
> All das brauchst du, um dem TO mitteilen zu können, wie man einen Timer
> so einstellt, dass er die Dauer von einer Flanke zur dazugehörigen
> umgekehrten Flanke ermittelt?

Ja, schon.
Muss ja erst KLAR sein, WAS man messen möchte.
Und Zeiten gibt es von Mikrosekunden (und kleiner) bis zum 2. Durchlauf 
des Jupitertransits (und größer).
Denke aber die Frage hat sich inzwischen erledigt, wie auch immer.

von J. V. (janvi)


Lesenswert?

Die Pulslänge funktioniert jetzt im PWM input mode mit zwei 
verschiedenen Capture Registern. Tatsächlich ist für die zwei Signale 
InkA und InkB ein dritter HW-pin zu belegen, damit man neben der 
Positionserfassung (aktuell T2) auf einen weiteren Timer (T21) zur 
Geschwindigkeitsmessung kommt.

Da es in der Anwendung darauf ankommt die Drehzahl möglichst rasch zu 
erfassen, möchte ich jetzt umgekehrt versuchen T21 als Positionszähler 
und T2 zur Geschwindigkeitsermittlung zu verwenden. T2 hat bei CH1 und 
CH2 ein XOR am Eingang welches eine Impulsvervierfachung erlauben 
könnte. D.h. es wird der Abstand zwischen zwei Flanken von zwei Signalen 
vermessen. In diesem Fall müssten dann 4 pins für 2 Signale belegt 
werden was bei einem 14 pin oder 20 pin STM32L schon ziemlich weh tut. 
Ideal wäre eine Chip-interne Verbindung aber ich sehe keine Möglichkeit 
wie die einzurichten wäre.

: Bearbeitet durch User
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.