
Raspberry Pi Pico und PWM
Elektronik-Labor
Projekte
Mikrocontroller
Raspberry
Im Raspberry Pi Pico gibt es acht unabhängige PWM-Einheiten, die
jeweils ihre eigene Frequenz ausgeben können. Jeweils zwei Ports sind
einer Einheit zugeordnet. Im ersten Test wollte ich testen, wie genau
die Frequenzausgabe ist. Dazu habe ich die ersten sechs PWMs an den
Pins 0 bis 10 verwendet. Mit dem Frequenzzähler konnte ich dann
sehen, welche Genauigkeit erreicht wird.
#PWM
import time
from machine import Pin, PWM
pwm0 = PWM(Pin(0))
pwm0.freq(1000)
pwm0.duty_u16(32000)
pwm1 = PWM(Pin(2))
pwm1.freq(10000)
pwm1.duty_u16(32000)
pwm2 = PWM(Pin(4))
pwm2.freq(100000)
pwm2.duty_u16(32000)
pwm3 = PWM(Pin(6))
pwm3.freq(1000000)
pwm3.duty_u16(32000)
pwm4 = PWM(Pin(8))
pwm4.freq(10000000)
pwm4.duty_u16(32000)
pwm5 = PWM(Pin(10))
pwm5.freq(30000000)
pwm5.duty_u16(32000)
Die Ergebnisse zeigen, das tiefe Frequenzen sehr genau erzeugt werden, sehr hohe aber zunehmend ungenauer:
1 kHz > 999,998 Hz
10 kHz > 9,9992 kHz
100 kHz > 99,92 kHz
1 MHz > 992,1 kHz
10 MHz > 9,0909 MHz
30 MHz > 22,73 MHz
Mit den Abweichungen kann man leben, wenn man sie berücksichtigt.
Irgendwelche brauchbaren Frequenzen dabei? 992 liegt auf Mittelwelle.
Ein kleiner AM-Modulator sollte also möglich sein. Noch eine
Möglichkeit: Wenn ich 3,6 MHz programmiere, kommt 3584,2 kHz raus. Das
liegt im 80-m-Amateurfunkband und kann für CW oder für einen
Fuchsjagtsender benutzt werden. Die Frequenz liegt nahe bei den häufig
verwendeten 3579 kHz.
Einen AM-Prüfsender auf Mittelwelle kann man leicht
programmieren. Die Amplitude wird über den Duty-Wert zwischen 0 und
32000 eingestellt. Der unmodulierte Träger hat eine Amplitude von
16000. Die Endlosschleife erzeugt einen AM-Prüfton von 500 Hz bei einer
Modulationstiefe von 50%.
#PWM Amplitudenmodulation auf 992 kHz
import time
from machine import Pin, PWM
pwm0 = PWM(Pin(0))
pwm0.freq(1000000)
pwm0.duty_u16(16000)
while (True):
pwm0.duty_u16(8000)
time.sleep(0.001)
pwm0.duty_u16(24000)
time.sleep(0.001)
Das Signal ist mit einer induktiven Übertragung durch eine
Drahtschleife (siehe Foto oben) klar und deutlich in einem
Mittelwellenradio auf 992 kHz zu empfangen.
Bei diesem Versuch fällt auf, dass das Signal auf zwei nahe beieinander
liegenden Frequenzen im Mittelwellenbereich empfangen wird. Es gibt
eine stärkere und eine schwächere Empfangsstelle. Am Scope sieht man
ein leichtes Flattern des unmodulierten Rechtecksignals. Das liegt wohl
am fraktionalen Vorteiler der PWM. Versuche haben gezeigt, dass zum
Beispiel bei 650 kHz und bei 1300 kHz ein sauberes Signal entsteht.
Ganz klar, in dem Fall wird die Taktfrequenz des Controllers von 130
MHz glatt durch 200 oder durch 100 geteilt. Wenn ich 1,3 MHz vorgebe,
sagt der Frequenzzähler 1288,66 kHz. Das bedeutet, dass die
Taktfrequenz tatsächlich bei 128,866 MHz liegt, weil aus der
Quarzfrequenz von 12 MHz über die interne PLL keine genauen 130 MHz
werden können.
Siehe auch: PWM-Motorsteuerung ohne Motortreiber: https://youtu.be/S4WyFo9TUiM
Rpi Pico HF-Generator und Eichmarkengeber
Meine ersten Ergebnisse zur ungenauen PLL-Frequenz muss ich
revidieren. Neuere Versuche haben gezeigt, dass MicroPython den Pico
nicht mit 130 MHz, sondern mit 125 MHz taktet. Das Problem der
ungenauen PWM-Frequenzen liegt daran. dass nicht jede Frequenz sich
glatt aus dieser Taktrate teilen lässt. Die Taktrate kann aber sehr
frei eingestellt werden. Ein Blick ins Datenblatt zeigt die
Aufbereitung. Der VCO arbeitet in einem Bereich von 400 MHz bis 1600
MHz. Die Quarzfrequenz von 12 MHz wird zunächst heruntergeteilt und
dann der PLL zugeführt. Die VCO-Frequenz wird am Ende in zwei Stufen
auf die Systemfrequenz heruntergeteilt. Im Bereich bis 133 MHz kann man
damit jede Frequenz im Abstand 1 MHz einstellen.
Für höchste Genauigkeit einer Ausgangsfrequenz von 10 MHz muss man die
verwendete Systemfrequenz beachten. Im Normalfall verwendet MicroPython
die Taktfrequenz 125 MHz. Wählt man dagegen ein ganzzahliges Vielfaches
von 10 MHz, bekommt man genauere und reinere Signale. Hier wird
mit machine.freq(80000000) eine Taktfrequenz von 80 MHz gewählt.
Alle PWM-Frequenzen entstehen durch ganzzahlige Teilung von 80 MHz.
#HFgen.py Generator und Eichmarkengeber
from machine import Pin, PWM, Timer
import time
machine.freq(80000000)
pwm0 = PWM(Pin(0))
pwm0.freq(10000000) #10 MHz
pwm0.duty_u16(32000)
pwm1 = PWM(Pin(2))
pwm1.freq(1000000) #1 MHz
pwm1.duty_u16(5000)
pwm2 = PWM(Pin(4))
pwm2.freq(100000) #100 kHz
pwm2.duty_u16(5000)
An GP0 entstehen 10 MHz. Hier wurde bei einem Pico eine Abweichung von
nur 3 Hz gemessen. Das Signal lässt sich zur Überprüfung von
Frequenzzählern verwenden. Zwei weitere Signale mit 1 MHz und 100 kHz
dienen als Eichmarken. Die PWM-Impulse wurden dazu stark verkürzt.
Während ein symmetrisches Rechtecksignal nur ungerade Oberwellen
besitzt, die mit steigender Ordnungszahl schwächer werden, liefern die
kurzen Impulse auch gerade und ungerade Oberwellen bis zu sehr hohen
Frequenzen. Man erhält damit einen Lattenzaun mit Signalen im Abstand 1
MHz bzw. 100 kHz, die im ganzen Kurzwellenbereich bis mindestens 30 MHz
empfangen werden können. Damit lassen sich Empfänger überprüfen und
ihre Skalen eichen.
Elektronik-Labor
Projekte
Mikrocontroller
Raspberry