Forum: Compiler & IDEs Timmer und Interruptsteruerung


von David (Gast)


Lesenswert?

Hallo zusammen.
Könnten Sie mir bitte helfen diese Aufgabe zu programmieren.
Danke im voraus.

Aufgabe:  Mit dem STM32F107 soll ein Periodendauermessgerät realisiert 
werden, dass im Hintergrund zu einem Hauptprogramm interruptgesteuert 
die Periodendauer eines Rechtecksignals am Port A0 mit einer Auflösung 
von 100 us misst.

Dazu wird zuerst der Timer TIM2 mit einem Zähltakt von 10 kHz in 
aufwärtszählweise mit natürlicher (maximaler) Zählperiode ohne Interrupt 
initialisiert.

Anschließend wird der externe Interrupt mit positiver Flanke für Port A0 
initialisiert und freigegeben. Das Hauptprogramm endet dann in einer 
Endlosschleife.

Bei jedem Aufruf der ISR für den externen Interrupt wird das 
Zählregister des TIM2 ausgelesen und in der globalen Variablen long 
periode gespeichert. Das Zählregister wird dann sofort zu 0 gesetzt. Der 
gespeicherte Zählwert entspricht somit dem zeitlichen Abstand zur 
vorherigen positiven Flanke mit einer Auflösung von 100 us.

Um eine Fehlmessung bei zu langer Periodendauer auszuschließen wird dann 
in der ISR überprüft, ob der Timer zwischenzeitlich übergelaufen ist. In 
diesem Fall wird der gespeicherte Wert in periode durch eine -1 ersetzt. 
Die Überlaufanzeige muss rückgesetzt werden.
 a) Woran erkennt man, dass der Timer übergelaufen ist?

  b) Nennen Sie den Maximalwert des Timers bevor er überläuft.


 c) Welches ist die längste Periode, die gerade noch fehlerfrei gemessen 
werden kann?


 d) Welcher Vorteiler wird benötigt? (Timer Taktfreq. = 72 MHz)



e) Schreiben Sie die Initialisierung für TIM2 und legen Sie die globale 
Variable an.



 int main() {

von Falk B. (falk)


Lesenswert?

@ David (Gast)

>Könnten Sie mir bitte helfen diese Aufgabe zu programmieren.
>Danke im voraus.

Sicher, Hilfe zu Selbsthilfe.

>die Periodendauer eines Rechtecksignals am Port A0 mit einer Auflösung
>von 100 us misst.

Einfach.

>Dazu wird zuerst der Timer TIM2 mit einem Zähltakt von 10 kHz in
>aufwärtszählweise mit natürlicher (maximaler) Zählperiode ohne Interrupt
>initialisiert.

Gut.

>Anschließend wird der externe Interrupt mit positiver Flanke für Port A0
>initialisiert und freigegeben.

Ausreichend, aber nicht wirklich toll. Für genaue Zeitmessungen nutzt 
man die Input Capture Funktion. Bei 100us Zeitauflösung ist das aber 
nicht nötig, das geht auch ohne.

>Bei jedem Aufruf der ISR für den externen Interrupt wird das
>Zählregister des TIM2 ausgelesen und in der globalen Variablen long
>periode gespeichert. Das Zählregister wird dann sofort zu 0 gesetzt.

Kann man machen.

> Der
>gespeicherte Zählwert entspricht somit dem zeitlichen Abstand zur
>vorherigen positiven Flanke mit einer Auflösung von 100 us.

Bei höheren Zeitauflösungen, sprich höheren Timerfrequenzen, würde man 
den Timer besser durchlaufen lassen und die Differenz der Zählerstände 
berechnen. Das ist genauer und der Timer bleibt nie stehen.

>Um eine Fehlmessung bei zu langer Periodendauer auszuschließen wird dann
>in der ISR überprüft, ob der Timer zwischenzeitlich übergelaufen ist. In
>diesem Fall wird der gespeicherte Wert in periode durch eine -1 ersetzt.
>Die Überlaufanzeige muss rückgesetzt werden.

Klingt OK.

> a) Woran erkennt man, dass der Timer übergelaufen ist?

Na woran wohl?

  b) Nennen Sie den Maximalwert des Timers bevor er überläuft.

Welche Farbe hat das gelbe Schild? OMG!

> c) Welches ist die längste Periode, die gerade noch fehlerfrei gemessen
werden kann?

Dito

> d) Welcher Vorteiler wird benötigt? (Timer Taktfreq. = 72 MHz)

OMG^2! PISA ist überall!

>e) Schreiben Sie die Initialisierung für TIM2 und legen Sie die globale
>Variable an.

WOW!


> int main() {

Das ist ein bisschen wenig als Eigenleistung.

Beitrag "Einheitlicher Umgang mit faulen Schülern etc.?"

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.