PWM Signale auswerten

OP #1008171
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.
Moderator (Firma: Titel) Persönliche Seite
> 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
Gast
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.
Moderator (Firma: Titel) Persönliche Seite
> 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.
Moderator (Firma: Titel) Persönliche Seite
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%.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.