Forum: Mikrocontroller und Digitale Elektronik ICP_Pulsdauermessung - Timerkonfig?


von Lukas Z. (Firma: HTBLuVA - Salzburg) (lzopf)


Angehängte Dateien:

Lesenswert?

Hallo,

Ich habe als Matura Projekt die Aufgabe den Füllstand eines Bier 
Braukessels zu messen. Die Messschaltung funktioniert bereits und ich 
bekomme den Füllstand des Kessels als porportionale Frequenz.

Nun zu meinem Problem:

Ich habe mich bereits gründlich in die Pulsdauermessung über den ICP-Pin 
eingelesen.

Mein System: ATmega32 @ 16MHz

Der längste Pulsdauer bekomme ich wenn der Kessel voll ist --> Tp = 5ms
Die kürzeste Puldauer bekomme ich wenn der Kessel leer ist --> Tp = 
0,4ms

Ich verwende für die Messung der Pulsdauer den ICP - Pin und takte den 
Timer mit der fcpu / 2 (habe ich gelesen das das für extrerne Signale 
möglich sein sollte).

Meine frage ist nun da ich anschließend die Pulsdauer (Timerdifferenz) 
via PWM ausgeben muss. Reicht die Pulspause bzw. die Dauer um alles 
abzuarbeiten bzw. bekomme ich dann probleme dass der µP eine Flanke 
übersieht usw???


Weil Zeit ist ja nicht viel wenn der Kessel leer ist habe ich ja nur 
Tp=0,4ms zeit um die ganze ICP- INterrupt routine durchzugehen.

Falls das alles nicht realisierbar ist bzw. falls jemanden auffällt das 
etwas nicht funktionieren kann. Ich freue mich über jeden Hinweis.

MFG

Luks Zopf


PS:

Im Anhang habe ich meine Berechnung hinzugefügt hoffe sie hilft etwas 
weiter.

von Oliver (Gast)


Lesenswert?

In der ISR wirst du (hoffentlich) nicht viel mehr machen, als den 
Zählerstand und die Anzahl der Overflows abzuholen und ein Flag zu 
setzen. Die eigentlich Auswertung passiert dann im Hauptprogramm. Dabei 
geht dann keine Flanke verloren.

Wenn ich deine Notizen richtig verstehe, bekommst du ein Rechtecksignal 
mit einer Frequenz zwischen 100Hz und 1300Hz. Wenn du den ICP auf die 
steigende Flanke triggerst, kommt diese alle 10ms bis alle 0,77ms. Die 
Pulslänge ist dabei egal, die enthält ja keine zusätzliche Information, 
und braucht auch nicht ausgewertet zu werden.
Deine 8MHz Timertakt lösen das auf 125ns genau auf, das sollte doch mehr 
als ausreichend sein. Ein paar Mhz weniger tätens da wohl auch noch.

Oliver

von Lukas Zopf (Gast)


Lesenswert?

Hy,

vielen Dank Oliver. Stimmt also d.h ich löse den ICP nur bei steigender 
Flanke aus und bestimme nicht die Pulsdauer sondern eigentlich die 
Periodendauer somit müsste ich noch mehr Zeit für die PWM und weitere 
Funktionen haben.

MFG

Lukas

von avion23 (Gast)


Lesenswert?

Hallo Lukas,
noch zwei andere Ansätze die ich gerne benutze:
- Am Anfang und Ende der ISR  PORTB ^= (1 << PB0); o.ä. schreiben. Dann 
mit dem Oszi schauen wie lange der Bereich wirklich ist. Trägt nur zwei 
Zyklen dazu. Den Sprung muss man leider noch beachten, kann man aber 
abschätzen.
- Mit editor dein *.lss öffnen. Zur ISR springen. Zählen wieviele Zeilen 
der Code für deine ISR einnimmt. Mit Zwei und den der Zeit/Cycle 
multiplizieren, fertig.

Je nach Situation geht das eine oder das andere schneller.

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.