Without RMT, I've made other test to benchmark how fast I can do steps and with how many
Axis. Of course this does not take in consideration calculation required to do or not do steps.
@micropython.native has been used and compare to the same code without
@micropython.native.
Measure performed with an oscilloscope,
MicroPython V1.12 on an
ESP32-WROOM-32 @
160 MHz.
Here bellow
Test 14:
- 1 Axis: 89.54 kHz vs 27.18 kHZ without @micropython.native
- 2 Axis: 54.47 kHz vs 17.46 kHZ without @micropython.native
- 3 Axis: 39.14 kHz vs 12.86 kHZ without @micropython.native
- 4 Axis: 30.55 kHz vs 10.18 kHZ without @micropython.native
- 5 Axis: 25.05 kHz vs 8.524 kHZ without @micropython.native
- 6 Axis: 21.23 kHz vs 7.268 kHZ without @micropython.native
- 7 Axis: 18.41 kHz vs 6.336 kHZ without @micropython.native
- 8 Axis: 16.26 kHz vs 5.616 kHZ without @micropython.native
Code: Select all
# Test 14
# +Width = 3.85µs
from machine import Pin
from utime import sleep_us
ch1 = Pin(2, Pin.OUT)
ch2 = Pin(4, Pin.OUT)
ch3 = Pin(15, Pin.OUT)
ch4 = Pin(18, Pin.OUT)
ch5 = Pin(19, Pin.OUT)
ch6 = Pin(21, Pin.OUT)
ch7 = Pin(22, Pin.OUT)
ch8 = Pin(23, Pin.OUT)
@micropython.native
def steps(ch, loop, delay=0):
for _ in range(loop):
for c in ch:
c(1)
sleep_us(delay)
c(0)
steps((ch1,), 1000000) # 89.54 kHz vs 27.18 kHZ without @micropython.native
steps((ch1, ch2,), 100000) # 54.47 kHz vs 17.46 kHZ without @micropython.native
steps((ch1, ch2, ch3,), 1000000) # 39.14 kHz vs 12.86 kHZ without @micropython.native
steps((ch1, ch2, ch3, ch4,), 1000000) # 30.55 kHz vs 10.18 kHZ without @micropython.native
steps((ch1, ch2, ch3, ch4, ch5,), 1000000) # 25.05 kHz vs 8.524 kHZ without @micropython.native
steps((ch1, ch2, ch3, ch4, ch5, ch6,), 1000000) # 21.23 kHz vs 7.268 kHZ without @micropython.native
steps((ch1, ch2, ch3, ch4, ch5, ch6, ch7,), 1000000) # 18.41 kHz vs 6.336 kHZ without @micropython.native
steps((ch1, ch2, ch3, ch4, ch5, ch6, ch7, ch8,), 1000000) # 16.26 kHz vs 5.616 kHZ without @micropython.native
Here bellow
Test 16:
- 1 Axis: 62.70 kHz vs 25.04 kHZ without @micropython.native
- 2 Axis: 44.27 kHz vs 21.42 kHZ without @micropython.native
- 3 Axis: 34.21 kHz vs 18.72 kHZ without @micropython.native
- 4 Axis: 27.88 kHz vs 16.62 kHZ without @micropython.native
- 5 Axis: 23.53 kHz vs 14.94 kHZ without @micropython.native
- 6 Axis: 20.35 kHz vs 13.57 kHZ without @micropython.native
- 7 Axis: 17.93 kHz vs 12.44 kHZ without @micropython.native
- 8 Axis: 16.02 kHz vs 11.47 kHZ without @micropython.native
Code: Select all
# Test 16
from machine import Pin
from utime import sleep_us
ch1 = Pin(2, Pin.OUT)
ch2 = Pin(4, Pin.OUT)
ch3 = Pin(15, Pin.OUT)
ch4 = Pin(18, Pin.OUT)
ch5 = Pin(19, Pin.OUT)
ch6 = Pin(21, Pin.OUT)
ch7 = Pin(22, Pin.OUT)
ch8 = Pin(23, Pin.OUT)
@micropython.native
def steps(ch, loop, delay=0):
for _ in range(loop):
for c in ch:
c(1)
sleep_us(delay)
for c in ch:
c(0)
steps((ch1,), 1000000) # 62.70 kHz vs 25.04 kHZ without @micropython.native
steps((ch1, ch2,), 1000000) # 44.27 kHz vs 21.42 kHZ without @micropython.native
steps((ch1, ch2, ch3,), 1000000) # 34.21 kHz vs 18.72 kHZ without @micropython.native
steps((ch1, ch2, ch3, ch4,), 1000000) # 27.88 kHz vs 16.62 kHZ without @micropython.native
steps((ch1, ch2, ch3, ch4, ch5,), 1000000) # 23.53 kHz vs 14.94 kHZ without @micropython.native
steps((ch1, ch2, ch3, ch4, ch5, ch6,), 1000000) # 20.35 kHz vs 13.57 kHZ without @micropython.native
steps((ch1, ch2, ch3, ch4, ch5, ch6, ch7,), 1000000) # 17.93 kHz vs 12.44 kHZ without @micropython.native
steps((ch1, ch2, ch3, ch4, ch5, ch6, ch7, ch8,), 1000000) # 16.02 kHz vs 11.47 kHZ without @micropython.native
Conclusion:
sleep_us(delay) in
Test 14 and
Test 16 can be used to calculate next step. An other approach would be to
disable (to save calculation time) axis if they don't need to move.