Forum: Mikrocontroller und Digitale Elektronik PWM Signale auswerten


von Peter X. (vielfrass)


Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> 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

von Matthias (Gast)


Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> 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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.