乐趣区

关于树莓派3:树莓派硬件PWM的使用方法

最近折腾一个调光显示屏,厂商把调光的编程接口裸露成了 PWM,所以就折腾了一下树莓派的 PWM 输入能力。这外面有一些散落在不同文档中的内容,还有一些不晓得从什么文档里查到的货色,演绎在这里,以备后来者之需。

树莓派的 40 pin 通用引脚能够输入 PWM 信号,用于示意一个间断量以操作电机控制器、调光灯等设施。他的 PWM 输入有两种:软件 PWM 其实就是一般的 GPIO 输入,在一个线程里定时开关,长处是所有的 GPIO 引脚都能够做,毛病是工作频率、精度都比拟低(在新的 pigpio 库里应用高精度时钟改善了软件 PWM 的精度,以前老的 python 库实现超过几百 Hz 就齐全不准了)。而硬件 PWM 是应用树莓派 CPU 内置的 PWM 硬件,将它的信号导出到 40 pin 引脚,长处是精度和工作频率都很高,毛病是可用数量少,只有两路。

硬件 PWM 的配置

想要应用硬件 PWM,首先显然是确认有哪些引脚能够输入硬件 PWM。参考 /boot/overlays/README 的内容,只有 GPIO18 是在全副树莓派平台上都能作为硬件 PWM 输入脚的。其它引脚是否可用于此,能够应用 raspi-gpio 程序,例如在我的树莓派 3B 下面:

$ 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
$ 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 上。

硬件 PWM 的应用

Linux 内核通过 sysfs 反对硬件 PWM,所以这个局部的内容不仅限于树莓派,实际上所有实现了对应驱动的开发板都一样。

树莓派的 raspbian 零碎映像曾经提供了对应的驱动,能够间接应用。批改并保留 /boot/config.txt 之后重启设施,如果设置正确,能够在目录 /sys/class/pwm 中看到一些货色,比方:

$ ls /sys/class/pwm
pwmchip0
$ ls /sys/class/pwm/pwmchip0
device  export  npwm  power  pwm0  subsystem  uevent  unexport

这些伪文件就是 Linux 内核 PWM 驱动提供的操纵接口,在 shell 里能够通过 cat 读,通过 echo 重定向写。在任意编程语言里也能够通过读写文件的接口进行同样的操作。

首先创立一个 PWM 的导出,向 export 写几,就会创立对应的目录在 pwmchipX 外面:

$ echo 0 >/sys/class/pwm/pwmchip0/export
$ ls /sys/class/pwm/pwmchip0/pwm0
capture  duty_cycle  enable  period  polarity  power  uevent

这外面,period 是以纳秒计数的 PWM 周期,duty_cycle 是以纳秒计数的每周期高电平工夫。比方我想要一个 20KHz 的 PWM,占空比为 80%,那我就该当:

$ cd /sys/class/pwm/pwmchip0/pwm0
$ echo 50000 >period # 两万 Hz 的时长是五万纳秒
$ echo 10000 >duty_cycle # 占空比 80%,那么 20% 的时长就是一万纳秒

而后向 enable 写 0 或者 1 进行开关。

$ echo 1 >enable # 立刻开启

敞开之后不会清空原有设置,再次关上会以之前设置的参数运行 PWM。

如果须要开释资源,向 /sys/clas/pwm/pwmchipX/unexport 写对应的序号,会清空对应的 PWM 导出目录,并且删除配置。

退出移动版