06 PWM 控制
1 PWM 介绍
1.1 PWM 基础知识
PWM(Pulse Width Modulation)是一种通过改变脉冲宽度来控制平均功率的技术:
- 周期(Period):一个完整PWM波形的时间长度
- 占空比(Duty Cycle):高电平时间占整个周期的百分比
- 频率:PWM信号的重复频率,频率 = 1/周期

1.2 板卡 PWM 外设接口总览
以 M4-R1 为例 1、在板卡的 40PIN 引脚上有 3 个具有 PWM 功能的 GPIO。 2、在板卡的有一个 FAN 接口提供了 1 个具有 PWM 功能的引脚。 其中 PWM5(PIN33) 已经被 MIPI1 屏幕背光所占用
板卡 | PIN12 | PIN32 | PIN33 | FAN |
---|---|---|---|---|
M4-R1 | pwm0 | pwm14 | pwm5 | pwm9 |
40PIN 引脚原理图如下:

FAN 接口如图所示:

备注
pwm0,pwm5,pwm9默认都已使能
2 PWM使用--命令行方式
2.1 检查PWM设备
在终端输入以下命令查看pwm是否使能
ls -l /sys/class/pwm/
如图:

pwmchip1,pwmchip2为屏幕的背光,系统默认开启。 当开启多个pwm设备树插件时,pwm控制器值越小,系统分配的pwmchip越小。
比如我同时开启了pwm0,pwm5,pwm14,那么会出现以下对应关系
pwm0->pwmchip0
pwm5->pwmchip2
pwm14->pwmchip3
2.2 导出并设置 PWM
下面以 PWM9 为例
接上风扇测试,接线图如图所示
接好线材后,PWM 引脚默认输出高电平,因此风扇会全速旋转。
白线-红线 | 紫线-蓝线 | 棕线-黑线 |
---|---|---|
VCC | PWM | GND |

#将 pwm9 导出到用户空间
echo 0 > /sys/class/pwm/pwmchip3/export
#设置 pwm 周期 单位为 ns
echo 1000000 > /sys/class/pwm/pwmchip3/pwm0/period
#设置占空比
echo 500000 > /sys/class/pwm/pwmchip3/pwm0/duty_cycle
#设置 pwm 极性
echo "inversed" > /sys/class/pwm/pwmchip3/pwm0/polarity #正常,有效电平为高电平
注意
示例风扇为 PWM 引脚有效电平为高电平。 M4R1板卡设置 PWM 极性为 inversed 时,有效电平为高电平,此时调整占空比可控制风扇转速,占空比越高转速越快
提示
当设置 period 与 duty_cycle 值时,需要注意在任何的情况下都得保证 period 的值大于等于 duty_cycle 的值。
2.3 使能 PWM
#使能 pwm
echo 1 > /sys/class/pwm/pwmchip3/pwm0/enable
输入上述指令时,风扇受 PWM 控制,按照 2.2 设置即高低电平各占50%。
2.4 禁用和取消导出 PWM
#禁用 pwm
echo 0 > /sys/class/pwm/pwmchip3/pwm0/enable
#取消将 pwm9 导出到用户空间
echo 0 > /sys/class/pwm/pwmchip3/unexport
3 PWM使用-NAPI方式
通过NAPI接口并修改文件权限的方式,实现北向应用控制南向设备的能力。
3.1 NAPI接口介绍
共提供以下四个 NAPI 接口供开发者使用。
setPwmPeriod
:设置PWM信号的周期setPwmDutyCycle
:设置PWM信号的占空比setPwmPolarity
:设置PWM信号的极性setPwmEnable
:启用或禁用PWM输出
详细接口介绍见下文:
1 setPwmPeriod - 设置PWM信号的周期
接口定义
export const setPwmPeriod: (period: string) => boolean;
功能描述: 设置PWM信号的周期
参数:
period
(string): PWM周期值,单位为纳秒(ns)
返回值:
boolean
: 操作成功返回true
使用示例:
// 设置PWM周期为1000000纳秒(1毫秒,频率1kHz)
const result = setPwmPeriod('1000000')
2、setPwmDutyCycle - 设置PWM信号的占空比
功能描述: 设置PWM信号的占空比
接口定义
export const setPwmDutyCycle: (dutyCycle: string) => boolean;
参数:
dutyCycle
(string): 占空比值,单位为纳秒(ns),必须小于或等于周期值
返回值:
boolean
: 操作成功返回true
使用示例:
// 设置占空比为500000纳秒(50%占空比,假设周期为1000000ns)
const result = setPwmDutyCycle('500000')
3、setPwmPolarity - 设置PWM信号的极性
功能描述: 设置PWM信号的极性
接口定义
export const setPwmPolarity: (polarity: string) => boolean;
参数:
polarity
(string): 极性值"normal"
: 正常极性(高电平有效)"inversed"
: 反转极性(低电平有效)
返回值:
boolean
: 操作成功返回true
使用示例:
// 设置为正常极性
const result = setPwmPolarity('normal')
// 设置为反转极性
const result = setPwmPolarity('inversed')
4、setPwmEnable - 启用或禁用PWM输出
功能描述: 启用或禁用PWM输出
接口定义
export const setPwmEnable: (enable: string) => boolean;
参数:
enable
(string): 启用状态"1"
: 启用PWM输出"0"
: 禁用PWM输出
返回值:
boolean
: 操作成功返回true
使用示例:
// 启用PWM输出
const result = setPwmEnable('1')
// 禁用PWM输出
const result = setPwmEnable('0')
3.2 步骤1:修改文件权限
注意
如果使用的是我们提供的固件镜像,可以直接跳过步骤1,固件中已经将文件权限进行修改
固件获取地址:
1)检查 pwm9 是否被正常导出
ls /sys/class/pwm/pwmchip3
正常导出会显示PWM0,如下图所示。

如果没有导出则通过下述指令导出
echo 0 > /sys/class/pwm/pwmchip3/export
2)检查 /sys/class/pwm/pwmchip3/pwm0 目录下的文件是否权限为 777
ls -al /sys/class/pwm/pwmchip3/pwm0/

如果如上图所示,则通过以下指令更改权限
chmod 777 /sys/class/pwm/pwmchip3/pwm0/*

注意
M4-R1 OH5.0 默认导出pwmchip3的pwm0,并更改pwm0目录中的所有权限。 如有需要,自行到百度云盘下载相关固件
3.3 步骤2:启动应用程序
1)获取 HAP 包资源
备注
pwm_fan.hap 获取路径:
2)将 HAP 包下载到板卡中
将从百度网盘中下载好的 HAP 包通过 hdc install 下载到板卡中。
示例中将百度网盘下载的 HAP 包放到 E 盘目录下,打开终端输入下列指令:
hdc install E:\pwm_fan.hap
执行结果如图所示,显示"install bundle successfully","APP finish",即表示应用安装完成。

此时 M4R1 的桌面上显示该应用图标

3) 应用该程序
点击桌面 [PWM控制] 图标,进入应用,应用界面如图所示:

UI界面介绍 点击 PWM 控制开关,启用 PWM 控制,风扇会初始化转速为0。 通过滑动条可以控制风扇转速。 下方四个按钮为简易控制,低速,中速,高速,最高分别对应25%,50%,75%,100%