跳到主要内容

PWM

介绍PWM的配置和调试方式

模块介绍

PWM控制器是一种通过改变电脉冲宽度来控制输出信号的电子元件。

功能介绍

pwm

内核通过 PWM框架层接口 使其他模块可以申请PWM控制器,并控制PWM信号的输出高低。 如:内核的风扇调速和背光亮度都可以用PWM来控制。

源码结构介绍

PWM控制器驱动代码在 drivers/pwm 目录下:

drivers/pwm  
|--core.c #内核pwm框架接口代码
|--pwm-sysfs.c #内核pwm框架注册到sysfs代码
|--pwm-pxa.c #k1 pwm驱动

关键特性

  • 可生成 200Hz6.4MHz 的PWM信号
  • K1平台支持 20路 可配置的PWM

配置介绍

主要包括 驱动使能配置dts配置

CONFIG配置

CONFIG_PWM 此为内核平台PWM框架提供支持,支持K1 PWM驱动情况下,应为 Y

Symbol: PWM [=y]
Device Drivers
-> Pulse-Width Modulation (PWM) Support (PWM [=y])

在支持平台层PWM框架后,配置 CONFIG_PWM_PXAY,支持 K1 PWM驱动

Symbol: PWM_PXA [=y]
->PXA PWM support (PWM_PXA [=y])

dts配置

由于20路PWM的使用方法和配置方法类似,这里以 pwm0 为例

pinctrl

可查看linux仓库的arch/riscv/boot/dts/spacemit/k1-x_pinctrl.dtsi,参考已配置好的PWM节点配置,如下:

      pinctrl_pwm0_1: pwm0_1_grp {
pinctrl-single,pins =<
K1X_PADCONF(GPIO_14, MUX_MODE3, (EDGE_NONE | PULL_UP | PAD_1V8_DS2)) /* pwm0 */
>;
};

dtsi配置示例

dtsi中配置PWM控制器基地址和时钟复位资源,正常情况无需改动

pwm0: pwm@d401a000 {
compatible = "spacemit,k1x-pwm";
reg = <0x0 0xd401a000 0x0 0x10>;
#pwm-cells = <1>;
clocks = <&ccu CLK_PWM0>;
resets = <&reset RESET_PWM0>;
k1x,pwm-disable-fd;
status = "disabled";
};

dts配置示例

dts完整配置,如下所示

 &pwm0 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_pwm0_1>;
status = "okay";
};

接口介绍

API介绍

linux内核实现了其他设备或框架如背光,led灯,背光等对PWM的引用和调节。 常用:

struct pwm_device *devm_pwm_get(struct device *dev, const char *con_id)
# 该接口实现了从pwm框架中获取pwm资源
int pwm_apply_state(struct pwm_device *pwm, const struct pwm_state *state)
# 该接口实现了对pwm状态的设置

Debug介绍

PWM通过sysfs提供给用户层一个非编程的使用方法,可以依据上述PWM对应pin外接可调速风扇进行测试,过程如下 以下基于 Bianbu Linux 系统 验证

# cd /sys/class/pwm/
# ls # 每个节点代表一个led灯
pwmchip0 pwmchip1 pwmchip2 pwmchip3 pwmchip4 pwmchip5 pwmchip6

# echo 0 > pwmchip0/export
# ls pwmchip0/pwm0/
capture enable polarity uevent
duty_cycle period power

# 设置PWM一个周期的时间,单位为ns,即一个周期为1KHZ
# echo 1000000 > pwmchip0/pwm0/period

# 设置PWM占空比
# echo 500000 > pwmchip0/pwm0/duty_cycle

# 使能PWM
# echo 1 > pwmchip0/pwm0/enable

# 调节占空比,此时风扇转速降低
# echo 50000 > pwmchip0/pwm0/duty_cycle

# 关闭PWM
# echo 0 > pwmchip0/pwm0/enable

注意: sysfs里可用的pwmchipx均为没有使用的PWM,若内核驱动中已将该PWM通过类似pwm_get的接口申请,则该PWM无法通过sysfs配置

测试介绍

PWM输出的信号 电平高低 可以通过控制占空比 来调节。
实际测试可使用sysfs下的PWM节点和可调速的PWM风扇进行测试。

FAQ