
RPi Pico PIO-ASM
Elektronik-Labor
Projekte
Mikrocontroller
Raspberry
Mit zu den interessantesten Eigenschaften der Picos gehören die
programmierbaren PIO-Blöcke. Ich versuche mich in diese Statemachines
einzuarbeiten, weil da viele interessante Möglichkeiten warten. Sehr
hilfreich war auch hier wieder das Pico-Buch von H.-J. Berndt, zusätzlich neben den Datenbüchern der Raspberry.org.
Da könnte man doch einen schnellen Binärteiler bauen, der bis über 100
MHz arbeitet. Die Idee war, dass der Pico mit 100 MHz getaktet wird.
Dieser Takt soll dann binär geteilt werden und an den Ports 0 bis 3 als
50 MHz, 25 MHz, 12,5 MHz und 6,25 MHz erscheinen. Ich habe dies und das
probiert, aber am Ende kam eine ganz primitive Lösung heraus.
# Teiler
import time
from machine import Pin
import rp2
@rp2.asm_pio(set_init=(rp2.PIO.OUT_LOW, rp2.PIO.OUT_LOW, rp2.PIO.OUT_LOW, rp2.PIO.OUT_LOW))
def f_devider():
set (pins, 0)
set (pins, 1)
set (pins, 2)
set (pins, 3)
set (pins, 4)
set (pins, 5)
set (pins, 6)
set (pins, 7)
set (pins, 8)
set (pins, 9)
set (pins, 10)
set (pins, 11)
set (pins, 12)
set (pins, 13)
set (pins, 14)
set (pins, 15)
machine.freq(100000000)
sm = rp2.StateMachine(0,_devider, freq=100000000, set_base=Pin(0))
sm.active(1)
#time.sleep (115)
#sm.active(0)
Wie geplant erscheint am Pin 3 ein symmetrisches Rechtecksignal mit
6,25 MHz. Der Frequenzzähler sieht eine Abweichung unter 5 Hz, was für
die Genauigkeit des Quarzoszillators auf dem Pico spricht.
Wenn ich die vier Signale durch ein R-2R-Netzwerk schicke, entsteht ein
Sägezahnsignal. Man erkennt hier Quantisierungsfehler des
4-Bit-DA-Wandlers durch gewisse Ungenauigkeiten der Widerstände.
Wenn es so einfach ist, einen schnellen Signalgenerator zu bauen, ist
der Weg zum Sinus auch nicht mehr weit. Es müssen nur noch die
ausgegebenen Zahlen angepasst werden. Für die deutliche Darstellung
wurde bei beiden Signalformen eine reduzierte Abtastfrequenz von 160
kHz verwendet, sodass die Ausgangsfrequenz 10 kHz betrug.
# Teiler
import time
from machine import Pin
import rp2
@rp2.asm_pio(set_init=(rp2.PIO.OUT_LOW, rp2.PIO.OUT_LOW, rp2.PIO.OUT_LOW, rp2.PIO.OUT_LOW))
def sinus():
set (pins, 7)
set (pins, 10)
set (pins, 12)
set (pins, 13)
set (pins, 14)
set (pins, 13)
set (pins, 12)
set (pins, 10)
set (pins, 7)
set (pins, 4)
set (pins, 2)
set (pins, 1)
set (pins, 0)
set (pins, 1)
set (pins, 2)
set (pins, 4)
machine.freq(125000000)
sm = rp2.StateMachine(0, sinus, freq=160000, set_base=Pin(0))
sm.active(1)
#time.sleep (60)
#sm.active(0)
Wenn ich den Pico und die Statemachine mit 80 MHz laufen lasse,
entsteht eine Sinusfrequenz von 5 MHz. Am Oszilloskop sieht das Signal
noch besser aus als es ist, weil mein Scope eine Grenzfrequenz von 20
MHz hat und damit nebenbei als Tiefpassfilter arbeitet. Auch 10 MHz
konnte noch erzeugt werden. Die Statemachine läuft dann mit 160 MHz.
Elektronik-Labor
Projekte
Mikrocontroller
Raspberry