共计 1863 个字符,预计需要花费 5 分钟才能阅读完成。
最近折腾一个调光显示屏,厂商把调光的编程接口裸露成了 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 导出目录,并且删除配置。