Naja, ich brauche ja immer die Zeit zwischen steigender Flanke und fallender Flanke und direkt darauf wieder die Zeit zur steigenden Flanke, wenn ich den Duty Cycle haben will. Oft muss ich die Messung nicht machen. So einmal die Sekunde würde reichen, aber ich brauche halt eben die Zeit zwischen diesen 3 Flanken, und die kommen beim Duty Cycle von 99% mit 2,8MHz an.
Bei meinem 16MHz Quarz sind das also keine 6 Takte zwischen den 2 Flankenwechseln.
Ich hatte da jetzt eine Idee, die ich wohl mal versuchen werde, welche darauf basiert, dass sich der Duty Cycle nicht sehr schnell ändert (unter 1 Dutzend mal pro Sekunde).
Als Erstes messe ich die Frequenz, also die Zeit zwischen 2 fallenden Flanken. Bei 30kHz wären das gut 571 Takte.
Wenn da in einem bestimmten Zeitraum keine Flanken gemessen werden, kann ich davon ausgehen, dass der Duty Cycle bei 100% oder 0% liegt. Dann Messe ich Pegel um zu entscheiden, was von beidem es ist.
Wenn da jedoch eine Frequenz gemessen wurde, dann mache ich mit dem Messen des Intervalls zwischen steigender und fallender Flanke weiter. Entweder kommt da dann ein Wert heraus, der kleiner als die Frequenz ist, oder die Zeit war zu kurz und der uC konnte den Timerwert aus dem Input Capture Register nicht rechtzeitig lesen, bevor dieser durch einen neuen Überschrieben wurde. In dem Fall wäre der Intervall dann ja größer als die Frequenz.
Das gleiche danach dann nochmal umgekehrt für den Intervall zwischen fallender und steigender Flanke.
Wenn der eine Intervall zu kurz zum Messen war, dann muss der andere lang genug gewesen sein. Sollte es da also einen Messfehler gegeben haben (einer der Intervalle größer als die Frequenz), dann wird einfach der richtig gemessene Intervall von der Frequenz subtrahiert und der zu kurze Intervall daraus berechnet.
Oder gibt es da noch andere Wege?
Lesezeichen