Python Libary for Hardware PWM on Raspberry Pi using Linux kernel driver and /sys interface
This is a python library that allows control of the limited number of PWM pins available on most Raspberry Pi hardware. It does via a Linux kernel PWM driver that comes with recent kernels (at least version 4.9).
Using it to, for example, control servo motors leads to very smooth control, which I wasn't able to get with RPi.GPIO on a Raspberry Pi Zero W.
Enabling PWM driver:
- Edit /boot/config.txt and add the following:
dtoverlay=pwm-2chan
- Reboot
- Check that driver is loaded:
lsmod | grep pwm_bcm
- Output should be something like
pwm_bcm2835 2711 0
- Output should be something like
Using code:
Place syspwm.py
in the same directory as your code, and include it like from syspwm import SysPWM
The following code uses syspwm to smoothly turn a servo through its turning radius. Tweak the duty cycle values of S, E, and M to cause your servo to go to its start, end, and middle positions, respectively.
from syspwm import SysPWM
from time import sleep
import sys,os
import atexit
SLEE=0.02
PAUS=2
FREQ=20
S=0.65
E=2.30
M=1.40
#pwm0 is GPIO pin 18 is physical pin 12
pwm = SysPWM(0)
pwm.set_frequency(FREQ)
pwm.set_duty_cycle(S)
atexit.register(pwm.disable)
pwm.enable()
sleep(PAUS)
intS = int(S*100)
intE = int(E*100)
while True:
for i in range(intS,intE):
pwm.set_duty_cycle(i/100.0)
#print i-intS
sleep(SLEE)
sleep(PAUS)
for i in range(intE,intS,-1):
pwm.set_duty_cycle(i/100.0)
#print i-intS
sleep(SLEE)
sleep(PAUS)
I learned the /sys interface for hardware PWM from http://www.jumpnowtek.com/rpi/Using-the-Raspberry-Pi-Hardware-PWM-timers.html