ICP_Pulsdauermessung - Timerkonfig?

OP (Firma: HTBLuVA - Salzburg) #1930133
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.
Angehängte Dateien:
Gast #1930167
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
Gast #1930574
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
Gast #1930596
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.