1. 使用PWM控制sysfs接口
直接使用ls /sys/class/pwm
命令得到的结果为空
因此要想使用硬件PWM,首先得确认哪些引脚可以输出硬件PWM。在/boot/overlays/README中提到,只有GPIO18是在全树莓派平台上都能作为硬件PWM输出脚的。其他引脚是否可用于PWM输出,可以使用raspi-gpio查看。例如:
pi@raspberrypi:~ $ raspi-gpio funcs 12
GPIO, DEFAULT PULL, ALT0, ALT1, ALT2, ALT3, ALT4, ALT5
12, DOWN, PWM0, SD4, DPI_D8, AVEOUT_VID8, AVEIN_VID8, ARM_TMS
pi@raspberrypi:~ $ raspi-gpio funcs 41
GPIO, DEFAULT PULL, ALT0, ALT1, ALT2, ALT3, ALT4, ALT5
41, DOWN, PWM1, SD5, TE0, SD1_DAT5, SPI2_MOSI, RXD1
可以看到GPIO12的第零号替代功能是PWM0,而GPIO41的第零号替代功能是PWM1。
然后需要在树莓派的启动配置文件/boot/config.txt
里面加载对应的设备树overlay,并设置参数,比如:
dtoverlay=pwm,pin=12,func=4
就会将PWM开启在12号GPIO上。注意此处的func号必须与引脚的alt功能序号匹配,有个很奇怪的顺序:
Func 0 = Input
Func 1 = Output
Func 2 = Alt 5
Func 3 = Alt 4
Func 4 = Alt 0
Func 5 = Alt 1
Func 6 = Alt 2
Func 7 = Alt 3
所以这里func设为4,对应alt0,因为raspi-gpio
告诉我们12号GPIO的PWM功能在alt0上。
1.1 硬件PWM的使用
Linux内核通过sysfs支持硬件PWM,所以这个部分的内容不仅限于树莓派,实际上所有实现了对应驱动的开发板都一样。
树莓派的raspbian系统映像已经提供了对应的驱动,可以直接使用。修改并保存/boot/config.txt
之后重启设备,如果设置正确,可以在目录/sys/class/pwm
中看到一些东西,比如:
pi@raspberrypi:~ $ ls /sys/class/pwm
pwmchip0
pi@raspberrypi:~ $ ls /sys/class/pwm//pwmchip0
device export npwm power subsystem uevent unexport
这些伪文件就是Linux内核PWM驱动提供的操纵接口,在shell里可以通过cat
读,通过echo
重定向写。在任意编程语言里也可以通过读写文件的接口进行同样的操作。
每个控制器的通道数可以在 npwm 中读取(只读)
pi@raspberrypi:~ $ cat /sys/class/pwm//pwmchip0/npwm
2