mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PWM Signale auswerten


Autor: Peter X. (vielfrass)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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/(t1-t0) = 250Hz                    
             t0                                                  t1
 PWM = 0    _|___________________________________________________|___
 
              ______                                              ___
 PWM = klein_|      |____________________________________________|

              _____________                                       ___
 PWM = 1/4  _|             |_____________________________________|

              __________________________                          ___
 PWM = halb _|                          |________________________|

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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
              ____          ____          ____          ____          ____          ____          
PWM = 2/5   _|    |________|    |________|    |________|    |________|    |________|    |________
            |_______|_______|_______|_______|_______|_______|_______|_______|_______|_______|____
1-Counter:  0       0       1       1       2       2       3       3       3       4       4    
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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.