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