summaryrefslogtreecommitdiff
path: root/examples/rp2/pio_pwm.py
diff options
context:
space:
mode:
authorDamien George <damien@micropython.org>2021-01-21 00:34:08 +1100
committerDamien George <damien@micropython.org>2021-01-30 00:42:29 +1100
commit469345e7285128739e2934e7934e107ffda79fc1 (patch)
treea410ce2d427770a01d5b6f4d1b3ff2fb342cd94b /examples/rp2/pio_pwm.py
parentef3ee7aa1005cd1f15c2144d4b46feb792ab3185 (diff)
rp2: Add new port to Raspberry Pi RP2 microcontroller.
This commit adds a new port "rp2" which targets the new Raspberry Pi RP2040 microcontroller. The build system uses pure cmake (with a small Makefile wrapper for convenience). The USB driver is TinyUSB, and there is a machine module with most of the standard classes implemented. Some examples are provided in the examples/rp2/ directory. Work done in collaboration with Graham Sanderson. Signed-off-by: Damien George <damien@micropython.org>
Diffstat (limited to 'examples/rp2/pio_pwm.py')
-rw-r--r--examples/rp2/pio_pwm.py45
1 files changed, 45 insertions, 0 deletions
diff --git a/examples/rp2/pio_pwm.py b/examples/rp2/pio_pwm.py
new file mode 100644
index 000000000..8e87448ca
--- /dev/null
+++ b/examples/rp2/pio_pwm.py
@@ -0,0 +1,45 @@
+# Example of using PIO for PWM, and fading the brightness of an LED
+
+from machine import Pin
+from rp2 import PIO, StateMachine, asm_pio
+from time import sleep
+
+
+@asm_pio(sideset_init=PIO.OUT_LOW)
+def pwm_prog():
+ # fmt: off
+ pull(noblock) .side(0)
+ mov(x, osr) # Keep most recent pull data stashed in X, for recycling by noblock
+ mov(y, isr) # ISR must be preloaded with PWM count max
+ label("pwmloop")
+ jmp(x_not_y, "skip")
+ nop() .side(1)
+ label("skip")
+ jmp(y_dec, "pwmloop")
+ # fmt: on
+
+
+class PIOPWM:
+ def __init__(self, sm_id, pin, max_count, count_freq):
+ self._sm = StateMachine(sm_id, pwm_prog, freq=2 * count_freq, sideset_base=Pin(pin))
+ # Use exec() to load max count into ISR
+ self._sm.put(max_count)
+ self._sm.exec("pull()")
+ self._sm.exec("mov(isr, osr)")
+ self._sm.active(1)
+ self._max_count = max_count
+
+ def set(self, value):
+ # Minimum value is -1 (completely turn off), 0 actually still produces narrow pulse
+ value = max(value, -1)
+ value = min(value, self._max_count)
+ self._sm.put(value)
+
+
+# Pin 25 is LED on Pico boards
+pwm = PIOPWM(0, 25, max_count=(1 << 16) - 1, count_freq=10_000_000)
+
+while True:
+ for i in range(256):
+ pwm.set(i ** 2)
+ sleep(0.01)