# PWM的使用

## 概述

PWM（Pulse Width Modulation）简称脉宽调制，是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术， 广泛应用在测量、通信、工控等方面。其中有几个术语需要注意：PWM的频率、占空比

1、频率:在1秒钟内，信号从高电平到低电平再回到高电平的次数，单位Hz

2、占空比：是一个脉冲周期内，高电平的时间与整个周期时间的比例，单位是% (0%-100%)

## DTS驱动配置

板级使能pwm-fan,配置位置：arch/arm64/boot/dts/rockchip/aukun-utx-rk3568jt.dtsi

```bash
aukun_run: board-run{
status = "okay";
fan: pwm-fan {
compatible = "pwm-fan";
cooling-min-state = ;
cooling-max-state = ;
#cooling-cells = ;
pwms = ;
cooling-levels = ;
    };
};
```

## 实验调用

本次实验通过PWM来控制风扇的转速，风扇的GPIO3\_B6固定输出电压为5V,即通过调节PWM占空比可以输出任意不大于最大电压值5V的模拟电压。

首先添加设备树，使能驱动然后重新编译烧录。

### PWM设备文件

#### 1、查看PWM

```bash
ls/sys/class/pwm/

cat/sys/kernel/debug/pwm
```

以下为刚刚添加的设备
![](/upload/public/wiki/markdown/63530d0a346644f7abfd5b4842df3395/1792993581924_image.png)

#### 2、文件属性

![](http://md.aukun.cn/uploads/projects/corerk3568jt/202506/184ac8d6b095e2e8.png)

duty\_cycle为PWM的占空比的周期

period为PWM周期

polarity为PWM极性，为有效电平的电平状态

#### 3、设置PWM

进入到/sys/class/pwm/pwmchip3目录下

**将pwm3导出到用户空间**

```bash
echo0>export
```

**设置pwm周期单位为ns**

```bash
echo 1000000>pwm0/period
```

**设置占空比**

```bash
echo 500000>pwm0/duty_cycle
```

**设置pwm极性**

```bash
echo "normal" >pwm0/polarity
```

**使能pwm**

```bash
echo 1 >pwm0/enable
```

### PWM的测试

以下通过检测CPU的温度来改变PWM的占空比，以改变风扇的转速，shell脚本如下：

```bash
while true
do
 vol_raw=$(cat /sys/class/thermal/thermal_zone1/temp)
 if [ "$vol_raw" -gt "30000" ]; then
  echo 300000 > pwm0/duty_cycle
 elif [ "$vol_raw" -gt "50000" ]; then
  echo 500000 > pwm0/duty_cycle
 elif [ "$vol_raw" -gt "60000" ]; then
  echo 600000 > pwm0/duty_cycle
 elif [ "$vol_raw" -gt "70000" ]; then
  echo 900000 > pwm0/duty_cycle
 fi
done
```

此时可以观察到风扇会随着CPU温度变化而改变
