1

I need to control the PWM module on the raspberry pi. I’m now familiar with pigpio, and with hardware_PWM. However, I did not find anywhere where I can control the total duration of the PWM. Example: turn off after 50 clock cycles. Also, what would be the most accurate way in doing so using python?

My pulses can vary in duty cycle, and are between 0-1khz. I tried sing the software pwm but it couldn’t get to 1khz, but when I tried using the hardware_pwm it was honestly perfect. But I can’t control it.

asked Feb 14, 2020 at 3:48
8

1 Answer 1

0

If the pulses aren't very fast and you don't mind jitter you could do it in software. Untested Python.

def send_PWM(GPIO, pulses, frequency, dutycycle):
 # dutycycle expected to be in range 0.0 to 1.0
 duration = 1.0 / frequency
 on_period = duration * dutycycle
 off_period = duration - on_period
 for i in range(pulses):
 pi.write(GPIO, 1)
 time.sleep(on_period)
 pi.write(GPIO, 0)
 time.sleep(off_period)

If the pulses are fast (say the 100 kHz or less region) and you don't like jitter you could use a wave chain.

There are various examples of using waves at http://abyz.me.uk/rpi/pigpio/examples.html

Here is an example using waves and wave chains.

#!/usr/bin/env python
import time
import pigpio
def tx_pulses(pi, GPIO, frequency, num, dutycycle=0.5):
 assert 1 <= frequency <= 500000
 assert 1 <= num <= 65535
 assert 0.0 <= dutycycle <= 1.0
 duration = int(1000000/frequency)
 on_micros = int(duration * dutycycle)
 num_low = num % 256
 num_high = num // 256
 wf = []
 # on off time
 wf.append(pigpio.pulse(1<<GPIO, 0, on_micros))
 wf.append(pigpio.pulse( 0, 1<<GPIO, duration - on_micros))
 pi.wave_add_generic(wf)
 wid = pi.wave_create()
 if wid >= 0:
 pi.wave_chain([255, 0, wid, 255, 1, num_low, num_high])
 while pi.wave_tx_busy():
 time.sleep(0.01)
 pi.wave_delete(wid)
pi = pigpio.pi()
if not pi.connected:
 exit()
GPIO=19
pi.set_mode(GPIO, pigpio.OUTPUT)
tx_pulses(pi, GPIO, 100, 25) # 25 pulses @ 100 Hz 50% duty
tx_pulses(pi, GPIO, 1000, 250, 0.1) # 250 pulses @ 1000 Hz 10% duty
tx_pulses(pi, GPIO, 5000, 2391, 0.03) # 2391 pulses @ 5000 Hz 3% duty
pi.stop()
answered Feb 14, 2020 at 9:12
2
  • My pulses can vary in duty cycle, and are between 0-1khz. I tried sing the software pwm but it couldn’t get to 1khz, but when I tried using the hardware_pwm it was honestly perfect. But I can’t control it. The wave chain looks neat since I can looo it for an x amount, I’ll need to look more into that. It says it disables the hardwsre_PWM tho Commented Feb 14, 2020 at 13:16
  • Yes, waves use PWM and PCM so no audio from them. When I get time I will add a wave chain example to the answer. Commented Feb 14, 2020 at 14:22

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.