Topwo博客
首页
博客
项目
您现在的位置是:
Topwo博客
>>
单片机
文章
PWM详解
发布时间:2026-03-12
作者:Topwo
来源:原创
点击:77
在Linux中,使用PWM最直接、最常用的方法就是通过 **sysfs 接口**。这个接口会在`/sys/class/pwm/`目录下提供一系列文件和目录,你可以通过简单的命令行操作,像控制文件一样去配置和启用PWM输出。 下面,我将通过一个**控制舵机(SG90)**的详细例子,为你一步步演示整个过程。 ### 控制舵机:一个完整的PWM实战 舵机是一个非常典型的PWM控制对象。它的转动角度由PWM信号的高电平持续时间(也就是占空比)决定。SG90舵机的控制信号需要20毫秒(ms)的周期,其角度与高电平时间的对应关系如下: * **0°**:0.5 ms 高电平 * **45°**:1.0 ms 高电平 * **90°**:1.5 ms 高电平 * **135°**:2.0 ms 高电平 * **180°**:2.5 ms 高电平 我们将通过命令,让舵机转动到 **135°** 的位置。 ### 操作步骤详解 请打开你的Linux终端,按照以下步骤操作: 1. **找到PWM芯片**:首先,你需要知道你的PWM控制器对应哪个`pwmchip`。可以列出所有可用的PWM芯片: ```bash ls /sys/class/pwm/ ``` 你可能会看到`pwmchip0`、`pwmchip1`等目录。如果不确定哪个是你的目标,可以查看每个芯片下的`npwm`文件,它能告诉你该芯片支持几个PWM通道。 ```bash cat /sys/class/pwm/pwmchip0/npwm ``` 2. **导出PWM通道**:选定PWM芯片后(假设我们使用`pwmchip1`的第0通道),需要先将其“导出”到用户空间,这样才能操作它。 ```bash sudo echo 0 > /sys/class/pwm/pwmchip1/export ``` 如果成功,你会在`/sys/class/pwm/pwmchip1/`目录下看到一个名为`pwm0/`的新文件夹。 3. **设置PWM周期**:进入`pwm0/`目录,开始配置参数。首先设置周期,单位是纳秒(ns)。舵机需要的周期是20ms,即 `20 * 1,000,000 = 20,000,000` 纳秒。 ```bash cd /sys/class/pwm/pwmchip1/pwm0 sudo echo 20000000 > period ``` 4. **设置占空比**:接下来设置占空比,也就是高电平持续的时间。目标角度是135°,对应2ms高电平,即 `2 * 1,000,000 = 2,000,000` 纳秒。 ```bash sudo echo 2000000 > duty_cycle ``` 5. **设置极性**:设置极性为正常模式(`normal`),即高电平有效。 polarity 决定PWM信号的有效电平是HIGH还是LOW,在 normal 模式下,表示一个周期内高电平持续的时间(单位:纳秒),在 reversed 模式下,表示一个周期中低电平持续的时间(单位:纳秒) duty_cycle/period就是当前占空比 normal:占空比表示高电平占的比例,duty_cycle = 高电平时间 inversed:占空比表示低电平占的比例,duty_cycle = 低电平时间 修改极性前必须先禁用PWM ```bash sudo echo "normal" > polarity ``` 6. **使能PWM输出**:最后,启用PWM输出。此时,舵机就应该转动到135°的位置了。 ```bash sudo echo 1 > enable ``` **完整命令流回顾**: ```bash # 1. 导出通道 echo 0 > /sys/class/pwm/pwmchip1/export # 2. 进入通道目录 cd /sys/class/pwm/pwmchip1/pwm0 # 3. 设置周期 (20ms) echo 20000000 > period # 4. 设置占空比 (2ms,对应135°) echo 2000000 > duty_cycle # 5. 设置极性 echo "normal" > polarity # 6. 使能PWM echo 1 > enable ``` ### ⚠️ 注意事项 * **操作顺序**:一般来说,建议先配置好`period`、`duty_cycle`和`polarity`,最后再`enable`,以确保输出是你预期的波形。 * **数值关系**:任何时候,`duty_cycle`的值都不能大于`period`的值。 * **资源释放**:当你不再需要使用PWM时,可以通过向`unexport`文件写入通道号来释放资源,对应的`pwm0`目录也会被删除。 ```bash echo 0 > /sys/class/pwm/pwmchip1/unexport ``` * **前提准备**:这些操作的前提是你的内核已经配置了PWM驱动,并且对应的PWM引脚已经在设备树(Device Tree)中被正确地使能和配置。如果你的板卡上找不到`/sys/class/pwm`目录或者相应的`pwmchip`,可能需要先检查内核配置或设备树。 通过这个例子,你应该已经掌握了Linux下使用PWM的核心方法。除了控制舵机,调节屏幕背光亮度或控制电机转速也都是PWM的典型应用。如果你在操作中遇到“设备或资源不存在”之类的错误,或者想了解如何用C语言编程来控制,随时可以问我。
上一篇:
下一篇:
重装openwrt系统