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.
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.