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. Linux PWM 应用编程

    2023-12-17 02:34:02       53 阅读
  2. Linux GPIO 应用编程

    2023-12-17 02:34:02       52 阅读
  3. Linux应用编程:定时器

    2023-12-17 02:34:02       48 阅读
  4. 【Linux应用编程笔记】GPIO

    2023-12-17 02:34:02       54 阅读
  5. CAN Linux C应用编程

    2023-12-17 02:34:02       29 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-17 02:34:02       91 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-17 02:34:02       97 阅读
  3. 在Django里面运行非项目文件

    2023-12-17 02:34:02       78 阅读
  4. Python语言-面向对象

    2023-12-17 02:34:02       88 阅读

热门阅读

  1. LeetCode 70. 爬楼梯

    2023-12-17 02:34:02       69 阅读
  2. MySQL_12.Innodb存储引擎参数

    2023-12-17 02:34:02       55 阅读
  3. 掌握 Go 的计时器

    2023-12-17 02:34:02       62 阅读
  4. Cmake基础(2)

    2023-12-17 02:34:02       47 阅读
  5. 网格布局 Grid

    2023-12-17 02:34:02       57 阅读
  6. ES的字段更改字段类型

    2023-12-17 02:34:02       59 阅读
  7. springBoot使用threadPoolTaskExecutor多线程

    2023-12-17 02:34:02       56 阅读
  8. spring 笔记二 spring配置数据源和整合测试功能

    2023-12-17 02:34:02       45 阅读
  9. Springboot Minio最新版大文件下载

    2023-12-17 02:34:02       63 阅读
  10. C 标准库 - <string.h>

    2023-12-17 02:34:02       47 阅读
  11. echarts 柱形图、折线图点击事件

    2023-12-17 02:34:02       53 阅读
  12. Docker笔记:简单部署 nodejs 项目和 golang 项目

    2023-12-17 02:34:02       55 阅读
  13. Python中的名称空间和作用域

    2023-12-17 02:34:02       58 阅读
  14. NLP中的Seq2Seq与attention注意力机制

    2023-12-17 02:34:02       55 阅读