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.
Gast
#1930167
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
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
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
Bitte melde dich an, um einen Beitrag zu schreiben.
