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