Hallo, ich habe gleichzeitig von einem anderen Gerät 12 PWM-Signale. Die Frequenzen dieser Signale betragen 100Hz, 250Hz und 150Hz. Ich möchte das Puls zu Gesamtdauer messen. Welche Möglichkeit habe ich, das mit Digitaleingängen zu machen? Analog währe keine Option, dazu müsste ich die Signale jeweils mit einem Tiefpass "analogisieren" und dann brauche ich 12 Analogeingänge.
> Ich möchte das Puls zu Gesamtdauer messen. Welche Auflösung (8,10,16 Bit)? Wie werden die gewonnenen Daten weiterverarbeitet? > Welche Möglichkeit habe ich, das mit Digitaleingängen zu machen? Nimm die Digitaleingänge eines uC und lass auf dem einen Timerinterrupt mit (1/250Hz)/(gewünschte Auflösung) laufen (z.B. 4ms/8 Bit = 16us). In der Timer-Interruptroutine schaust du jetzt nach, ob du einen Low- oder High-Pegel am Pin hast und zählst einen entsprechenden Zähler hoch. An jeder steigenden Flanke übernimmst du die aktuellen Zählerwerte und berechnest das Tastverhältnis (n = thi/(thi+tlo)). Wie oft müssen aktuelle Daten bereitstehen (könnten die Kanäle evtl. nacheinander ausgewertet werden)? Dann könnten die Kanäle mit einem Mux auf Capture-Einheiten eines uC ausgewertet werden -> weniger Interruptlast, größere Genauigkeit möglich
Einen Timer ICP (input Capture) mit mind. 4-facher Frequenz der PWM Takten. Also bei 250Hz ca. 1 KHz. Alternativ zu Input Capture die Eingänge in der Timer ISR Pollen und entsprechend vermessen. Dafür würde ich dann die Timerfrequenz noch ein wenig erhöhen. Wobei weniger als 1 ms zw. zwei Interrupts etwas happig werden könnte, falls der benutzte Controller mit ca. 8-16 MHz läuft. Allerdings nur dann, wenn man noch ne Menge anderer Sachen erledigen muss. Je nachdem, wie genau das Messergebnis sein muss, muss auch die Timer Frequenz eingestellt werden.
> Einen Timer ICP (input Capture) mit mind. 4-facher Frequenz der PWM > Takten. Also bei 250Hz ca. 1 KHz. Die PWM hat eine Wiederholfrequenz von 250Hz. Während dieser Zeit spielt sich die mögliche Auflösung ab. Deshalb muß z.B. mit 250kHz abgetastet werden, um 10 Bit Genauigkeit zu erhalten. Ergo: der Faktor 4 ist viel zu klein.
1 | 1/(t1-t0) = 250Hz |
2 | t0 t1 |
3 | PWM = 0 _|___________________________________________________|___ |
4 | |
5 | ______ ___ |
6 | PWM = klein_| |____________________________________________| |
7 | |
8 | _____________ ___ |
9 | PWM = 1/4 _| |_____________________________________| |
10 | |
11 | __________________________ ___ |
12 | PWM = halb _| |________________________| |
13 | |
14 | _________________________________________________________ |
15 | PWM = max | | |
> Wobei weniger als 1 ms zw. zwei Interrupts etwas happig > werden könnte, falls der benutzte Controller mit ca. 8-16 MHz läuft. Ich kann durchaus einen Timer-Interrupt mit 16us laufen lassen und noch sinnvoll was tun (immerhin 256 theoretische Befehle zwischen zwei Ints bei 16MIPS). Nur darf ich dann keine Zeit mit Register-Sichern usw. verplempern.
Die andere Methode, die ich auch schon realisiert habe, geht so: - Lass einen Timer mit z.B. 990 ms laufen. Diese Zeit ist relativ unkritisch, muß aber so gewählt sein, dass der Abtastzeitpunkt sich nicht immer an der selben Stelle innerhalb des PWM-Signals befindet. Die Zeit zwischen 2 Interrupts sollte also kein geradzahliger Teiler der PWM-Frequenz sein. - In der Timer-ISR zählst du jetzt jeden '1' bzw. '0'-Pegel - wenn du das lange genug machst bekommst du die gewünschte Auflösung (nach 1 sec sind das dann 10 Bit, nach 4 sec 12 Bit usw.) Das Verfahren funktioniert dann etwa so:
1 | ____ ____ ____ ____ ____ ____ |
2 | PWM = 2/5 _| |________| |________| |________| |________| |________| |________ |
3 | |_______|_______|_______|_______|_______|_______|_______|_______|_______|_______|____ |
4 | 1-Counter: 0 0 1 1 2 2 3 3 3 4 4 |
5 | 0-Counter: 1 2 2 3 3 4 4 5 6 6 7 |
Bis hierher ist das Ergebnis jetzt: 4/(4+7) = 36% und das liegt schon gut in der Richtung von 2/5 = 40%.
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.