Forum: Projekte & Code "ungenaue" Pulsweiten-Messung


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Mi N. (msx)


Angehängte Dateien:

Lesenswert?

Um die Pulsweite bzw. das Tastverhältnis eines Signals genau zu messen, 
benötigt man einen Timer, der die Periodendauer misst und einen Timer, 
der die Zeit des Signals misst, die es auf '1'-Pegel liegt. Mit 
schnellen Timern kann man unter 10 ns Auflösung erreichen.

Beschränkt man sich auf eine einzelne Periode, bekommt man bei hohen 
Frequenzen wegen der kleinen Zählerstände nur eine kleine Auflösung. 
Stehen nur 16 Bit breite Zähler zur Verfügung, bekommt man bei niedrigen 
Frequenzen Überläufe bei den Timern. Gut, beides kann man durch passende 
Programmierung kompensieren, was in der Regel allerdings den 
Frequenzbereich nach oben einschränkt.

Benötigt man nicht exakte Messwerte mit maximal möglicher Auflösung, 
bietet sich eine andere Messmethode an. Ein freier Timer erzeugt dafür 
eine Referenzfrequenz (Referenzimpulse) im Bereich 100 kHz - einige MHz. 
Dabei wird für eine ganze Anzahl von Perioden die Anzahl von 
Referenzimpulsen gezählt und mit einem weiteren Zähler die positiven 
Eingangssignalzustände zeitgleich zum Referenzimpuls. Wählt man die 
Frequenz der Referenzimpulse zum Beispiel mit 1 MHz und läßt die Messung 
1 s lang laufen, bekommt man eine Auflösung von gut 4-5 Stellen, was für 
viele Anwendungen ausreichend sein dürfte.
Das Tastverhältnis ergibt sich aus: Anzahl der +Impulse / Anzahl der 
Referenzimpulse. Multipliziert mit 100% erhält man das Tastverhältnis im 
Bereich von 0,0 – 100,0 %.

Um dieses Messverfahren zu testen, habe ich die vorhandene Schaltung 
eines reziproken Frequenzzählers (mit STM32H750) genommen: 
Beitrag "8-stelliger Frequenzzähler, reziprok, STM32F7xx"
Schaltung und Funktion sind dort hinreichend beschrieben.
Der Zähler macht von Hause aus eine Periodendauermessung synchron zum 
Eingangssignal, weshalb die Auswertung der PWM-Zählerstände besonders 
einfach ist. Es wird lediglich mit Timer7 eine zusätzliche Frequenz 
(Referenzimpulse) erzeugt, die das Eingangssignal abtastet. Siehe 
Programmteil "F2_messung_pwm.c".

Das Messverfahren hat aber noch einen Haken. Sind Eingangsfrequenz und 
Abtastfrequenz in einem ganzzahligen Verhältnis nahezu synchron 
zueinander, kann die Abtastung wiederholt zum "falschen" Zeitpunkt 
stattfinden, wenn zum Beipiel immer dann gezählt wird, wenn das 
Eingangssignal gerade '0'-Pegel hat. Um diesen Zustand zu vermeiden, 
wird die Abtastfrequenz mit dem Wert eines Zufallzahlengenerators 
moduliert. Beim hier verwendeten STM32H750 liegt sie im Bereich 1,678 – 
3,000 MHz. (Der Controller würde auch mit der doppelten Frequenz 
arbeiten.)

Anbei noch ein Foto der Anzeige von Eingangsfrequenz nebst zugehörigem 
Tastverhältnis. Das Projekt in der .zip-Datei ist mit einer Demoversion 
von IAR EWARM 8.x verwendbar.
Das Ganze als Vorschlag - viel Spaß bei eigenen Experimenten!

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Und hast Du mal geprüft, wie weit man den 8 bzw. 6 Digits überhaupt 
vertrauen kann?
Ich krieg da immer Bauchschmerzen, wenn die untersten Digits nur 
Lottozahlen sind. Ich würde da lieber nur so wenig Digits anzeigen, wie 
auch stimmen.

Bei meinem 33220A kann ich eh nur das Tastverhältnis in 0,1% Schritten 
einstellen.

von Mi N. (msx)


Angehängte Dateien:

Lesenswert?

Die 8-stellige Auflösung der Frequenzanzeige ergibt sich durch das 
Messverfahren; das ist ein alter Hut und an anderer Stelle hinreichend 
beschrieben. Für 8-stellige Genauigkeit braucht man eine entsprechend 
genaue 10 MHz Referenz, was auch nichts Neues ist.

Als Referenzsignal für 1 Hz habe ich ein GPS-Modul EM406A. Dieses 
liefert an seinem 1pps-Ausgang einen 1 µs Impuls mit 1 Hz. Das war für 
mich der Grund, so viele Stellen anzuzeigen, damit man auch dieses 
extreme Tastverhältnis erkennen kann. Das Foto zeigt, daß der lokale 
TCXO nicht exakt abgeglichen ist. Das Tastverhältnis ist 0,0001 %.
Bei Bedarf kann man die Stellenanzahl ja reduzieren; sprintf() liefert 
die passende Rundung der letzten Stelle.

Der verwendete STM32H750 ist ein recht schneller µC. Das Messverfahren 
dürfte aber auch mit einem ATmega zu realisieren sein, wenn man die 
Abtastrate für PWM per Timer2 erzeugt und auf z.B. 100 kHz reduziert. 
Für die Modulation der Abtastrate wäre eine analoge Rauschquelle am ADC 
denkbar.
Die 4. Welle kommt bestimmt ;-)

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]
  • [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.

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