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!