Hallo
ich habe vor, mich intensiver mit dem Einlesen eines PWM Signals
auseinanderzusetzen.
Ich habe bereits mehrere Beiträge gelesen und wie ich gesehen habe, wird
oft empfohlen Interrupts und Timer zu benutzen.
Es wurden folgende Vorschläge gemacht:
1. Variante:
- ICP
2. Variante:
- Interrupt Timer --> steigende flanke -->Timer Start
Timer --> fallende flanke --> Timer Stop ---> Timer Wert auswerten
3. Variante (wie 2. variante):
- ext. Interrupt auf steigende Flanke einstellen
- wenn der auslöst, auf fallende Flanke umstellen und passenden Timer
starten
- wenn der auslöst, Timer ablesen und auswerten
4.Variante:
>> Interrupt0 auf beide Flanken stellen.(geht z.B. beim Mega8)
In der Interuptroutine pin auf high testen, war steigende flanke.
Variable "X" auf null setzen.
ist der Portpin LOW, war es eine fallende Flanke, Variable "X"
auslesen und anzeigen.
Die Variable "X" wird im Timerinterrupt unabhängig vom Int0 langhin
hochgezählt. Die Genauigkeit/Auflösung hängt von der
Zählgeschwindigkeit des Timers ab. <<
Ich möchte gerne wissen (bevor ich mich an die Arbeit mache), welche
Variante ihr emfehlen würdet. Gibt es inzwischen bessere Methoden ein
veränderliches PWM Signal einzulesen?
Habt ihr bessere Vorschläge, wie man sowas angehen kann?
Wenn jemand sowas in der Richtung mal gemacht hat, wäre ich über Tipps
sehr dankbar?
Gruss und Danke
Variante 1 und 3 sind sich sehr ähnlich, wobei ICP das was man bei Variante 3 von Hand macht, mehr oder weniger automatisch erledigt. Atmel hat schon eine Application Note zu dem Thema herausgebracht. Da wird es per ICP erledigt...
Hallo ja, ich habe diese Fragmente aus vielen Beiträgen kopiert um mal diese vor augen zu haben. Kannst du mir den Link zur Application Note geben?
habe schon var 2 und 3 implementiert bis 2,5kHz, funktioniert beides gut, wobei die var 1 sehr sympatisch erscheint
Hallo, Teilst du deine Erfahrungen mit uns in Form deines Beispiel Codes oder ist es streng geheim? :) Als Richtschnur wäre es sehr hilfreich, besonders in Anlehnung an ICP. P.S.: Was müsste man machen, um Frequenzen in der Grössenordnung 20 kHz bis 60 kHz einzulesen? Sind die 2,5 kHz dadurch begrenzt, weil der verwendete Timer nicht mehr kann oder liegt es einfach an deiner Anforderung? Gruss
>Sind die 2,5 kHz dadurch begrenzt, weil der verwendete Timer nicht mehr >kann oder liegt es einfach an deiner Anforderung? Wenn dann ist die untere Grenzfrequenz die Beschränkung, weil der Timer nicht lange genug läuft, um es in einer "Runde" zu schaffen die komplette Periodendauer zu messen. Dann muß man den Timer manuell "verlängern". >P.S.: Was müsste man machen, um Frequenzen in der Grössenordnung 20 kHz >bis 60 kHz einzulesen? Die Frequenzen sind nicht unbedingt das Problem, sondern die Auflösung des Pulses. Man muß ja während des Pulses eine bestimmte Anzahl an Takten haben, um auf das Tastverhältnis schliessen zu können. Wenn man den Timer mit 120kHz betreibt, wird man nur ein Tastverhältnis von 0,5 bei einer Frequenz von 60kHz messen können. Nimmt man aber 600kHz, kann man schon 10 Pulsbreiten unterscheiden. Bei 6MHz wären es schon 100... (wenn ich mich jetzt nicht total vertan habe...).
den Code kann ich leider nicht rausgeben, war damals kundenspezifisch. Die Begrenzung 2,5kHz ist durch ext. Filter entstanden, wobei ich damals bis 5kHz getestet habe. Wenn es in Richtung 20-60 kHz geht, würde ich jegliche "Handarbeit" in ISR vermeiden wollen. Capture Einheit und geeignete Fensterung ist hier wohl geeignetere Methode.
Also ist die beste Methode: - ICP und mit möglichst hohem internem Takt (6MHz Osci), um eine Auflösung von 1% TV bei 60kHz PWM Freq. zu erhalten? Bessere/optimierende Vorschläge weiterhin erwünscht ;)
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.