Forum: Mikrocontroller und Digitale Elektronik Pulse zählen


von Felix K. (Gast)


Lesenswert?

Hallo Leute,
ich versuche aktuell mit einem STM32F29ZI... Pulse zu zählen. Ich möchte 
nicht messen wie lang dieser ist, sondern nach jeder steigenden Flanke 
einen Counter inkrementieren.
Es sollte möglichst ohne Interrupts ablaufen.
Nun habe ich mich in dem Datenblatt bereits informiert. Dort finde ich 
den Punkt mit der External Clock (ETR - PIN) ziemlich interessant. 
Allerdings würde ich gerne 4 Pulse "parallel" erfassen und unabhängig 4 
COunter pro pos. Flanke inkrementieren. Mit dem ETR-PIN würde ich ganze 
4 Timer dafür brauchen. Gibt es eine weitere Möglichkeit mehrere Channel 
eines TImers für diese Aufgabe in betracht zu ziehen?

Ich Danke euch!

von Frank (Gast)


Lesenswert?

Mit was für Frequenzen musst du rechnen?
Kannst natürlich auch ganz normal pollen.

von Felix K. (Gast)


Lesenswert?

Hallo,
mit 400 - 600Hz rechne ich. Pollen ist recht schwierig, da die Pulse 
recht kurz sind. Das Hauptprogramm sollte außerdem nicht durch dieses 
pollen beeinträchtigt werden.

von Uwe K. (aerodactyl)


Lesenswert?

Wenn du nicht pollen willst UND deine Pulse kurz sind, kommst du um eine 
Interruptgeschichte wohl nicht herum.
Eine Möglichkeit wäre noch, dass du die Pulse per Monoflop verlängerst, 
aber da musst du mal genau nachrechnen, ob du das in der Haubtschleife 
noch mitbekommen kannst.

Gruß

Uwe

von Markus S. (acepilot)


Lesenswert?

Ich gehe mal davon aus als Controller verwendest du den STM32F429ZI. 
Dieser hat doch alleine 10 Standard Timer, was spricht gegen deren 
Einsatz, solange du diese nicht für was anderes brauchst.

Einfacher und unkomplizierter kannst du meiner Meinung nach diese 
Auswertung ohne Interrupts nicht machen.

von M. K. (sylaina)


Lesenswert?

Felix K. schrieb:
> Es sollte möglichst ohne Interrupts ablaufen.

Warum denn das? Das wäre die sicherste Lösung sodass du keinen Puls 
verpasst. Pollen ist wesentlich unzuverlässiger und erheblich 
aufwendiger.

von PittyJ (Gast)


Lesenswert?

Ich habe ein ähnliches Problem. Dabei habe ich mich für Interrupts 
entschieden. Die Interrupt-Funktion ist ja sehr kurz (Hochzählen einer 
Speicherzelle). Das braucht in der Summe weniger Rechenzeit, als wenn 
ich die ganze Zeit irgendetwas polle...

von H.Joachim S. (crazyhorse)


Lesenswert?

Interessanter Ansatz..
Alles, was dem Chip an passender Hardware mitgegeben wird, willst du 
nicht einsetzen, warum auch immer.
Bei der Alternative polling hast du Angst (zu Recht) was zu verpassen.

Dann bleibt wohl nur ein externer Zähler :-)

von Dietrich L. (dietrichl)


Lesenswert?

H.Joachim S. schrieb:
> Bei der Alternative polling hast du Angst (zu Recht) was zu verpassen.

Man könnte auch mit einem Timerinterrupt (und wie schon erwähnt mit 
Monoflops verlängerten Pulsen) pollen. Da müsste man mal rechnen, wie 
oft der Interrupt kommen muss und welche µC-Last das bewirkt.

von m.n. (Gast)


Lesenswert?

Dietrich L. schrieb:
> Da müsste man mal rechnen, wie
> oft der Interrupt kommen muss und welche µC-Last das bewirkt.

Na ja, laß die Interruptroutine 100 ns dauern. Dann wird der µC bei 600 
Impulsen/s mit rund 60 ppm belastet. Da bleibt dann nicht mehr viel Zeit 
für andere Sachen. Man müßte mal probieren, ob das mit vier Kanälen auch 
noch funktioniert.

Wo war noch mal das Problem?

von Thomas E. (picalic)


Lesenswert?

m.n. schrieb:
> Wo war noch mal das Problem?

Vielleicht ist im Hauptprogramm mit Hilfe von Delay-Schleifen eine Uhr 
Programmiert, und die geht ja dann durch die ISR-Zeiten später nach...

von Simpel (Gast)


Lesenswert?

Das Problem scheint darin zu liegen, dass der TO befürchtet, dass der 
Chip sich schneller abnutzt, wenn er die komfortablen Hardwarefeatures 
desselben nutzt...


Up to 17 timers: up to twelve 16-bit and two 32-bit timers up to 180 
MHz, each with up to 4 IC/OC/PWM or pulse counter and quadrature 
(incremental) encoder input

von Huh (Gast)


Lesenswert?

Thomas E. schrieb:
> Vielleicht ist im Hauptprogramm mit Hilfe von Delay-Schleifen eine Uhr
> Programmiert, und die geht ja dann durch die ISR-Zeiten später nach...

Wer mit Delays eine Uhr programmiert, hat es nicht anders verdient ;-)

von Felix K (Gast)


Lesenswert?

m.n. schrieb:
> Dietrich L. schrieb:
> Da müsste man mal rechnen, wie
> oft der Interrupt kommen muss und welche µC-Last das bewirkt.
>
> Na ja, laß die Interruptroutine 100 ns dauern. Dann wird der µC bei 600
> Impulsen/s mit rund 60 ppm belastet. Da bleibt dann nicht mehr viel Zeit
> für andere Sachen. Man müßte mal probieren, ob das mit vier Kanälen auch
> noch funktioniert.
>
> Wo war noch mal das Problem?

Genau das habe ich mir auch überlegt. Bei 4 Interrupts, die aller 600hz 
kommen ist die Belastung nicht ohne!
Ich verweigere den Einsatz von den Timern ja nicht... Ich wollte bloß 
nach einer effizienteren Lösung suchen, mehrere Kanäle eines Timers für 
diese Anwendung zu nutzen.
Abschließend ist also zu sagen, dass wohl 4 Timer mit jeweils externen 
clockmode am sinnvollsten für einen unterbrechungsfreien Ablauf des 
Hauptprogramms ist.

Ich danke euch

von Simpel (Gast)


Lesenswert?

Ein Hardwarezähler im µC braucht zum inkrementieren des Zählstandes 
keinen Interrupt. Auch das Vergleichen mit einem Sollwert benötigt 
keinen Int. Das geschieht über die Compareregister, welche nur beim 
Match einen Int generieren, falls gewünscht. Ansonsten kann das 
Match-Flag auch gepollt werden, da es i.d.R. nur mit einem Bruchteil der 
Zählfrequenz getriggert wird.

von Axel S. (a-za-z0-9)


Lesenswert?

Uwe K. schrieb:
> Wenn du nicht pollen willst UND deine Pulse kurz sind, kommst du um eine
> Interruptgeschichte wohl nicht herum.

Wie das? Hat ein STM32 keine Timer/Counter, die Impulse an einem Pin 
zählen können? Das ist also schonmal ein dritter Weg, der weder pollt, 
noch einen Interrupt braucht.

von ppm (Gast)


Lesenswert?

>Genau das habe ich mir auch überlegt. Bei 4 Interrupts, die aller 600hz
>kommen ist die Belastung nicht ohne!

@Felix: Du hast die Ironie im vorigen Beitrag nicht verstanden. 60 ppm.
Schmeiß mal google an. Der Zeitverbrauch ist ein Witz. Minimal. Ohne 
Interrupt mit Zählern noch weniger.

von m.n. (Gast)


Lesenswert?

Thomas E. schrieb:
> Vielleicht ist im Hauptprogramm mit Hilfe von Delay-Schleifen eine Uhr
> Programmiert, und die geht ja dann durch die ISR-Zeiten später nach...

Dafür gibt es ja DMA!

Felix K schrieb:
> Genau das habe ich mir auch überlegt. Bei 4 Interrupts, die aller 600hz
> kommen ist die Belastung nicht ohne!

Du hast wohl keinen Sinn für Ironie. Laß mich Deine Aussage korrigieren:
Bei 4 Interrupts, die mit 600 Hz kommen, ist der µC ohne Belastung.
Im Gegenteil: der ..429 langweilt sich ohne Ende - egal wie ungeschickt 
man es auch anstellt (mache würden auch dämlich schreiben ;-)

von PittyJ (Gast)


Lesenswert?

In meiner Jugend habe ich auch nicht gerne mit Interrupts programmiert. 
Das ist wie eine Blockade, die man erst einmal überwinden muss.
So wie der erste Sprung vom Dreier, oder das erste Ansprechen einer 
weiblichen Person.

Wir sollten dem TO gut zureden, und vielleicht mal ein Auge auf seinen 
Interrupt Code werfen, damit er die Scheu verliert.

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.