Calculate frequencey and pulse width?

Nov 01, 2024 Last reply: for 1 år siden 2 Replies

Hi, i have this code hos do i calculate the frquency and pulse width?



from machine import Pin from rp2 import PIO, StateMachine, asm_pio import time



led = Pin("LED", Pin.OUT, value=0)



@asm_pio(set_init=PIO.OUT_LOW) def square(): # Cycles: 1 + 1 + 6 + 32 * (30 + 1) = 1000 irq(rel(0)) set(pins, 1) set(x, 31) [5] label("delay_high") nop() [5] jmp(x_dec, "delay_high")



# Cycles: 1 + 7 + 32 * (30 + 1) = 1000 set(pins, 0) set(x, 31) [5] label("delay_low") nop() [1] jmp(x_dec, "delay_low")



sm = StateMachine(0, square, freq=2000, set_base=Pin(0))



sm.irq(lambda p: led.toggle())



sm.active(1)



Let’s see, cycle duration = 1 ÷ frequency, so pulse width must be duty cycle × cycle duration.

What do I win?

Sorry here are more info. The pico limits PWM 8 Hz and up pulse width 1 - 100 % . I have this program and i works i understand how it works.

my problem was understanding >> dup[delay] ?

===== # Example using PIO to blink an LED and raise an IRQ at 1Hz.

import time from machine import Pin import rp2

@rp2.asm_pio(set_init=rp2.PIO.OUT_LOW) def blink_1hz(): # Cycles: 1 + 1 + 6 + 32 * (30 + 1) = 1000 irq(rel(0)) set(pins, 1) set(x, 31) [5] label("delay_high") nop() [29] jmp(x_dec, "delay_high")

# Cycles: 1 + 7 + 32 * (30 + 1) = 1000 set(pins, 0) set(x, 31) [6] label("delay_low") nop() [29] jmp(x_dec, "delay_low")

# Create the StateMachine with the blink_1hz program, outputting on Pin(25). sm = rp2.StateMachine(0, blink_1hz, freq=2000, set_base=Pin(25))

# Set the IRQ handler to print the millisecond timestamp. sm.irq(lambda p: print(time.ticks_ms()))

# Start the StateMachine. sm.active(1)

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required