Linux PWM 应用编程

Linux PWM 应用编程

嵌入式Linux应用开发中,系统经常会连接通过PWM方式控制的设备,例如控制电机转速、控制灯的亮度等。

要在Linux应用层控制PWM输出,与GPIO类似,有两种方式:

  1. 通过sysfs控制
  2. 通过API控制

通过sysfs控制PWM

与GPIO类似,sysfs中导出的与PWM控制相关的文件在/sys/class/pwm目录下,根据芯片不同,分为多个芯片子目录pwmchipN,例如在我使用的旭日X3pi中,有两个子目录pwmchip0pwmchip3

root@ubuntu:/sys/class/pwm# ls
pwmchip0  pwmchip3
root@ubuntu:/sys/class/pwm# 

pwmchipN目录中有类似GPIO的exportunexport等控制文件。

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引脚PWM0PWM4,推断为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# 

主要文件和功能:

  1. period: PWM周期,单位:ns;
  2. duty_cycle: 占空比,一个周期中高电平的时间,单位:ns;
  3. enable: 启用PWM,写入1启用,写入0禁用;
  4. polarity: 极性,可以控制正常还是反转高低电平,正常:吸入"normal",反转:写入"inversed"。注意,并不是所有系统的硬件和驱动都实现了这个功能,使用前需结合文档或测试进行确认。

使用流程:

  1. export指定的PWM
  2. 设置PWM周期和占空比,设置极性(可选)
  3. 启动PWM
  4. 使用过程中调整占空比(可选)
  5. 禁用PWM
  6. unexport指定的PWM

通过API控制PWM

我使用的系统并没有发现类似/usr/include/linux/pwm.h的头文件和/dev/pwmchip0的设备节点,没有提供可以通过fcntl操作设备的接口,暂时没有找到用API控制PWM的方法。

注意:虽然内核头文件中有提供linux/pwm.h,但并不能直接在应用编程中使用,无法通过编译。

参考

  1. https://blog.csdn.net/qq_24330911/article/details/132235089

你可能感兴趣的:(linux)