嵌入式Linux应用开发中,系统经常会连接通过PWM方式控制的设备,例如控制电机转速、控制灯的亮度等。
要在Linux应用层控制PWM输出,与GPIO类似,有两种方式:
与GPIO类似,sysfs中导出的与PWM控制相关的文件在/sys/class/pwm
目录下,根据芯片不同,分为多个芯片子目录pwmchipN
,例如在我使用的旭日X3pi中,有两个子目录pwmchip0
和pwmchip3
:
root@ubuntu:/sys/class/pwm# ls
pwmchip0 pwmchip3
root@ubuntu:/sys/class/pwm#
pwmchipN
目录中有类似GPIO的export
,unexport
等控制文件。
root@ubuntu:/sys/class/pwm/pwmchip0# ls
device export npwm power subsystem uevent unexport
root@ubuntu:/sys/class/pwm/pwmchip0#
查看npwm
,每个芯片有3个PWM,X3pi文档中,40pin引脚有两个PWM引脚PWM0
和PWM4
,推断为pwmchip0
的0号PWM和pwmchip3
的1号PWM,使用官方的例程测试证明正是如此。
要通过sysfs控制PWM,首先也要知道PWM的编号,将PWM编号写入export文件来导出PWM,使控制相应的PWM的文件可见。
root@ubuntu:/sys/class/pwm/pwmchip0# echo 0 >export
root@ubuntu:/sys/class/pwm/pwmchip0# ls
device export npwm power pwm0 subsystem uevent unexport
root@ubuntu:/sys/class/pwm/pwmchip0#
这里导出了pwmchip0的0号PWM,在pwmchip0目录下多出了一个子目录pwm0
,子目录中就是控制PWM的接口文件。
root@ubuntu:/sys/class/pwm/pwmchip0# cd pwm0/
root@ubuntu:/sys/class/pwm/pwmchip0/pwm0# ls
capture duty_cycle enable period polarity power uevent
root@ubuntu:/sys/class/pwm/pwmchip0/pwm0#
主要文件和功能:
使用流程:
我使用的系统并没有发现类似/usr/include/linux/pwm.h
的头文件和/dev/pwmchip0
的设备节点,没有提供可以通过fcntl
操作设备的接口,暂时没有找到用API控制PWM的方法。
注意:虽然内核头文件中有提供linux/pwm.h
,但并不能直接在应用编程中使用,无法通过编译。