如果你的风扇没有pwm调速的线我建议就不要折腾了
一、物料
香橙派5 、一个带pwm调速功能的风扇(我这里是自己手焊的mos)
二、给风扇焊个mos用于调速
我用的si2302,nmos,淘宝很便宜。nmos接在风扇负极。
三、pwm生成
这个参考香橙派给的手册就行了。
下面是手册中写的怎么配置
在 linux 系统中,26pin 中的 pwm 默认都是关闭的,需要手动打开才能使用。
在/boot/ 中加入下面红色字体部分的配置,然后重启 Linux 系统就
可以同时打开 pwm0、pwm13、pwm14 和 pwm15,如果只需要打开一个,那么就
填写一个即可。
orangepi@orangepi:~$ sudo vim /boot/
overlays=pwm0-m1 pwm13-m2 pwm14-m1 pwm15-m2
选择 pwm1_m1 的设置如下所示,pwm1-m1 和 pwm1-m2 请不要同时打开:
orangepi@orangepi:~$ sudo vim /boot/
overlays=pwm1-m1
选择 pwm1_m2 的设置如下所示:
orangepi@orangepi:~$ sudo vim /boot/
overlays=pwm1-m2
选择 pwm3_m0 的设置如下所示,pwm3-m0 和 pwm3-m2 请不要同时打开:
orangepi@orangepi:~$ sudo vim /boot/
overlays=pwm3-m0
选择 pwm3_m2 的设置如下所示:
orangepi@orangepi:~$ sudo vim /boot/
overlays=pwm3-m2
我这里要用pwm13-m2。
sudo nano /boot/orangepiEnv.txt
在文件里面加上
overlays=pwm3-m2
然后重启!!!
2、配置频率,占空比,等参数
当打开一个 pwm 后,在/sys/class/pwm/中就会多出一个 pwmchipX(X 为具体的
的数字),比如打开 pwm13 后,查看/sys/class/pwm/下的 pwmchipX 会由两个变成了三个
之前只有pwmchip0 pwmchip1。
上面哪个 pwmchip 对应 pwm13呢,我们先查看下 ls /sys/class/pwm/ -l 命令的输出,如下所示:
- 然后由之前的表可知,pwm15 寄存器的基地址为 febf0010,再看 ls /sys/class/pwm/ -l
命令的输出,可以看到 pwmchip2 中链接到了 ,所以 pwm13 对应
pwmchip 为 pwmchip2。
下面开始输出pwm,pwm时钟的频率为1000000000hz,也就是1ns。
我这里输出1000hz,我也想输出20khz让人耳听不见,但是看看这个mos的手册的导通时间就懂了,基本不太可能输出20khz。
输入下面第一行后 会生成一个pwm0的文件,后面就是在pwm0上面炒作了
echo 0 > /sys/class/pwm/pwmchip2/export
echo 1000000 > /sys/class/pwm/pwmchip2/pwm0/period/*设置频率1khz*/
echo 100000 > /sys/class/pwm/pwmchip2/pwm0/duty_cycle//占空比10%
echo 1 > /sys/class/pwm/pwmchip2/pwm0/enable//启动
他默认的极性是高电平,下面这行给他换成低电平
/sys/class/pwm/pwmchip2/pwm0# echo normal >polarity
应该用三极管的,三极管频率响应高
最后用chatgpt生成了一个脚本可以*的调占空比10-100之前,占空比10以下有时候转有时候不转。0为不转
如图
脚本:
#!/bin/bash
PWM_PATH="/sys/class/pwm/pwmchip2/pwm0"
# 检查文件是否存在
if [ -e "$PWM_PATH" ]; then
echo "PWM 文件已存在,无需导出"
else
# 文件不存在,导出 PWM 通道
echo 0 > /sys/class/pwm/pwmchip2/export
sleep 1
echo "normal" > /sys/class/pwm/pwmchip2/pwm0/polarity
echo "PWM 通道已导出"
fi
# 通过命令行参数获取用户输入
user_input="$1"
temp=0
# 如果未提供参数,或者小于 10,将其设为默认值 10
if [ -z "$user_input" ] || [ "$user_input" -lt 10 ]; then
temp=10
else
temp="$user_input"
fi
# 如果输入为 0,则 var 为 0;否则,计算 var 的值,并乘以 10
if [ "$user_input" -eq 0 ]; then
temp=0
fi
var=$((temp * 10 * 10000))
# 设置 PWM 周期
echo 10000000 > "$PWM_PATH/period"
# 设置 PWM 占空比
echo $var > "$PWM_PATH/duty_cycle"
# 启用 PWM
echo 1 > "$PWM_PATH/enable"
echo "PWM 已配置,值为: $var"