Forum: Mikrocontroller und Digitale Elektronik Pulslänge messen


von Hannes Wagner (Gast)


Lesenswert?

Hallo,
ich möchte mit einem ATmega8 die Pulslänge einer 1kHz PWM-Frequenz 
messen. Mein Problem ist, dass ich keinen externen Interrupt mehr frei 
habe und die Messung selbst in einer Interruptroutine statt finden soll. 
Das heißt nur normale Pins und keine Interrupts vom Timer. Timer0 ist 
ebenfalls schon anderweitig in Benutzung. Wichtig ist eigentlich nur, 
dass mich nicht die eigentliche Länge des Impulses interessiert, sonder 
nur eine gewisse Längenüberschreitung.
Ich habe bereits über die Verwendung vom Timer1 und seiner 
Compare-Funktion nachgedacht, allerdings habe ich keine Flaggs dazu 
gefunden und Interrupts kann er nicht auslösen.

meine Idee:

- auf LOW-Pegel warten und Timer1 auf 0 setzen
- bei HIGH-Pegel Timer1 starten und immer wieder manuell mit Grenzwert 
vergleichen
- bei erreichen des Grenzwertes erneut Pegel abfragen
- Auswertung und Anzeige der Grenzwertüberschreitung

meine Fragen:
Kann man den Timer1 vielleicht doch mit der Compare-Funktion nutzen?
Ist der Vergleich zweier Register so schnell, dass der Timer nicht 
zufällig durchläuft?

Bitte um Meinungen!

MfG Hannes

von Wolfgang H. (frickelkram)


Lesenswert?

Hallo Hannes,

generell sollte das funktionieren. Der pure Vergleich eines Registers 
sollte bei 1kHz kein Problem sein. Es stellt sich viel mehr die Frage 
wie oft Du den Vergleich machen kannst. Du kannst den in der 
Hauptschleife machen, oder in Deiner Interrupt Routine. Sinnvoll fände 
ich es in der Interrupt Routine, dann kannst Du den Prozessor in der 
Hauptschleife schlafen legen.
Dann stellt sich aber die Frage wie oft Dein Interrupt pro Sekunde 
aufgerufen wird. Wenn Du mit der Interrupt Routine garantiert schneller 
bist als 2kHz sollte das alles funktionieren. Wenn Du sehr viel 
schneller bist als 2kHz dann könntest Du auch versuchen das 1kHz Signal 
komplett in Software zu zählen. Dazu würde ich genau so vorgehen wie 
beim Tasten entprellen, im Prinzip tust Du hier ja nichts anderes.
Ich formuliere es mal so;
Du möchtest einen Tastendruck erkennen der länger als 1/1kHz dauert ;-)

von Axel R. (Gast)


Lesenswert?


von Hannes Wagner (Gast)


Lesenswert?

naja, mein Problem ist nur, wenn ich die Register manuell vergleiche 
gibt es Takte in denen nicht verglichen wird sondern der Schleifensprung 
statt findet. und da ich mit 8MHz zähle und 1kHz PWM messen möchte, hab 
ich noch 8000 Schritte. ca. 100 würden ja reichen, aber wie garantiere 
ich das wärend des Schleifensprungs nicht grad zwei Zählschritte statt 
finden und somit kein positives Ergebnis beim Vergleich zu Stande kommt?
Wie lange dauert ein RJMP und ein CPSE?

von Michael L. (hasimaus)


Lesenswert?

Hallo Hannes,

auch wenn ich nicht der Experte für Atmega8 bin, scheint mir der 
Vorschlag von Axel sehr sinnvoll.

Mit welcher Auflösung soll denn diese Messung erfolgen ?
Es geht doch weiterhin um ein 1kHz PWM Signal, oder ?
Mit welchen Pulsbreiten ist den hier zu rechnen ? 0% - 100% ?

Eine 1kHz PWM hat eine Zykluszeit von 1ms, also kann der längste Impuls 
höchstens eine millisekunde sein. Dein Atmega8 läuft mit 8MHz.
Muß der Timer den auch mit 8MHz laufen. Das wäre eine Auflösung von 
125ns !

Mit den CompareRegistern würde vielleicht gehen, aber ist doch eher 
durch die-Brust-ins-Auge, wenn Du verstehst was ich meine.

Gruß

von Jobst M. (jobstens-de)


Lesenswert?

R-C Glied davor und mit einem AD-Wandler messen.
Spannung ist proportional zum Tastverhältnis.

Die Frage ist nur, ob Dir die Auflösung langt.


Gruß

Jobst

von Hannes Wagner (Gast)


Lesenswert?

also, zum PWM es wird sich zwischen 20%-80% HIGH-Pegel bewegen. es ist 
also immer ein HIGH und LOW Anteil in einer Periode (Grenzwert dann bei 
ca. 65%).
Die Idee mit den Compareregistern war nur, weil ich dann nach der 
Maximallänge die ich als Grenzwert festgelegt habe direkt im Programm 
weiter machen könnte ohne die ganze Periode zu messen. Allerdings ist 
das wie gesagt schwierig, da wärend der Abarbeitung des Int0 keine 
weiteren Interrupts möglich sind, aber das Triggern eines Pins könnte ja 
noch funktionieren. Eigentlich wollte ich eine Art Compareflagg für 
diese Sache nutzen, hab aber keins gefunden.
Die Geschichte mit dem RC-Glied gefällt mir nicht besonders, da der 
AD-Wandler schon in anderer Konfiguration verwendet wird und das 
Umschalten von Uref usw. zu viel Zeit und Mühe kostet. Außerdem könnte 
ich ja sonst gleich einen analogen Sensor nehmen.

kann es überhaupt passieren, dass bei

loop:
  CPSE "Timer1", "Grenzwert"
  RJMP loop

der Timer1 den Grenzwert überspringt?

LG Hannes

von Hannes Wagner (Gast)


Lesenswert?

kann ich dann eigentlich direkt in die Zählregister von Timer1 oder 
Timer2 schreiben, oder gibts da spezielle Befehle z.B. zum Löschen bzw. 
0 setzen?

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.