1. Rock5B风扇控制基础入门第一次拿到Rock5B开发板时最让我头疼的就是那个呼呼作响的小风扇。它要么全速运转吵得人心烦要么完全停转导致芯片温度飙升。后来我发现通过PWM调速可以完美解决这个问题。PWM脉冲宽度调制就像给风扇装了个智能开关通过快速开关来控制平均功率输出。Rock5B的PWM控制接口位于/sys/class/pwm/pwmchip0目录下。要启用PWM控制首先需要导出对应的pwm通道echo 0 /sys/class/pwm/pwmchip0/export这个操作会在/sys/class/pwm/pwmchip0/pwm0目录下生成控制文件。我刚开始操作时经常遇到Device or resource busy错误后来发现是因为通道已经被其他进程占用。这时候可以尝试其他通道或者先取消导出再重新操作。2. PWM参数详解与实战调优2.1 核心参数解析PWM调速有三个关键参数周期period、占空比duty_cycle和使能enable。周期决定了PWM信号的频率单位是纳秒。对于风扇控制我建议设置在20kHz左右对应50000纳秒的周期值echo 50000 /sys/class/pwm/pwmchip0/pwm0/period占空比决定了风扇转速范围从0停止到周期值全速。设置50%转速的命令如下echo 25000 /sys/class/pwm/pwmchip0/pwm0/duty_cycle2.2 温度联动调速方案单纯的固定转速不够智能我设计了一个根据温度自动调节的脚本。首先需要获取CPU温度temp$(cat /sys/class/thermal/thermal_zone0/temp)然后根据温度区间设置不同的占空比。我的经验值是低于50℃20%转速50-70℃线性增加超过70℃全速运转完整脚本可以参考这个结构#!/bin/bash TEMP_FILE/sys/class/thermal/thermal_zone0/temp PWM_PATH/sys/class/pwm/pwmchip0/pwm0 while true; do temp$(cat $TEMP_FILE) if [ $temp -lt 50000 ]; then echo 10000 $PWM_PATH/duty_cycle elif [ $temp -lt 70000 ]; then duty$((10000 (temp - 50000) * 150 / 200)) echo $duty $PWM_PATH/duty_cycle else echo 50000 $PWM_PATH/duty_cycle fi sleep 10 done3. systemd服务深度配置3.1 单元文件编写要点为了让风扇控制脚本开机自启需要创建systemd服务文件。我建议放在/etc/systemd/system/fan-control.service[Unit] DescriptionFan PWM Control Service Aftermulti-user.target Requiressys-devices-platform-ffd84000.i2c-i2c-1-1-0018.device [Service] Typesimple ExecStart/usr/local/bin/fan-control.sh Restartalways RestartSec5 [Install] WantedBymulti-user.target这里有几个关键点需要注意After参数确保依赖设备就绪后再启动服务Typesimple适用于持续运行的后台脚本Restart策略可以防止脚本意外退出3.2 服务调试技巧服务配置好后我习惯用这套命令调试sudo systemctl daemon-reload sudo systemctl start fan-control sudo systemctl status fan-control查看日志也很重要journalctl -u fan-control -f常见问题包括权限不足确保脚本有执行权限路径错误使用绝对路径依赖未就绪调整After参数4. 生产环境优化实践4.1 硬件保护机制在实际部署中我增加了过热保护逻辑。当温度超过85℃时除了全速运转风扇外还会触发系统警报if [ $temp -gt 85000 ]; then echo 50000 $PWM_PATH/duty_cycle wall 警告CPU温度过高 fi4.2 性能与功耗平衡通过长期测试我发现将空闲转速设为25%可以在静音和散热间取得良好平衡。同时增加了响应速度参数当温度快速上升时调速灵敏度会提高last_temp0 while true; do current_temp$(cat $TEMP_FILE) temp_diff$((current_temp - last_temp)) if [ $temp_diff -gt 5000 ]; then adjust_step$((temp_diff / 1000)) new_duty$((current_duty adjust_step)) echo $new_duty $PWM_PATH/duty_cycle fi last_temp$current_temp sleep 10 done这套方案在我的媒体服务器上稳定运行了半年多CPU温度始终控制在安全范围内同时噪音几乎不可闻。对于需要24小时运行的设备来说合理的风扇控制策略确实能显著提升使用体验。
【实践指南】Rock5B风扇PWM调速与systemd服务配置全解析
发布时间:2026/5/15 18:07:17
1. Rock5B风扇控制基础入门第一次拿到Rock5B开发板时最让我头疼的就是那个呼呼作响的小风扇。它要么全速运转吵得人心烦要么完全停转导致芯片温度飙升。后来我发现通过PWM调速可以完美解决这个问题。PWM脉冲宽度调制就像给风扇装了个智能开关通过快速开关来控制平均功率输出。Rock5B的PWM控制接口位于/sys/class/pwm/pwmchip0目录下。要启用PWM控制首先需要导出对应的pwm通道echo 0 /sys/class/pwm/pwmchip0/export这个操作会在/sys/class/pwm/pwmchip0/pwm0目录下生成控制文件。我刚开始操作时经常遇到Device or resource busy错误后来发现是因为通道已经被其他进程占用。这时候可以尝试其他通道或者先取消导出再重新操作。2. PWM参数详解与实战调优2.1 核心参数解析PWM调速有三个关键参数周期period、占空比duty_cycle和使能enable。周期决定了PWM信号的频率单位是纳秒。对于风扇控制我建议设置在20kHz左右对应50000纳秒的周期值echo 50000 /sys/class/pwm/pwmchip0/pwm0/period占空比决定了风扇转速范围从0停止到周期值全速。设置50%转速的命令如下echo 25000 /sys/class/pwm/pwmchip0/pwm0/duty_cycle2.2 温度联动调速方案单纯的固定转速不够智能我设计了一个根据温度自动调节的脚本。首先需要获取CPU温度temp$(cat /sys/class/thermal/thermal_zone0/temp)然后根据温度区间设置不同的占空比。我的经验值是低于50℃20%转速50-70℃线性增加超过70℃全速运转完整脚本可以参考这个结构#!/bin/bash TEMP_FILE/sys/class/thermal/thermal_zone0/temp PWM_PATH/sys/class/pwm/pwmchip0/pwm0 while true; do temp$(cat $TEMP_FILE) if [ $temp -lt 50000 ]; then echo 10000 $PWM_PATH/duty_cycle elif [ $temp -lt 70000 ]; then duty$((10000 (temp - 50000) * 150 / 200)) echo $duty $PWM_PATH/duty_cycle else echo 50000 $PWM_PATH/duty_cycle fi sleep 10 done3. systemd服务深度配置3.1 单元文件编写要点为了让风扇控制脚本开机自启需要创建systemd服务文件。我建议放在/etc/systemd/system/fan-control.service[Unit] DescriptionFan PWM Control Service Aftermulti-user.target Requiressys-devices-platform-ffd84000.i2c-i2c-1-1-0018.device [Service] Typesimple ExecStart/usr/local/bin/fan-control.sh Restartalways RestartSec5 [Install] WantedBymulti-user.target这里有几个关键点需要注意After参数确保依赖设备就绪后再启动服务Typesimple适用于持续运行的后台脚本Restart策略可以防止脚本意外退出3.2 服务调试技巧服务配置好后我习惯用这套命令调试sudo systemctl daemon-reload sudo systemctl start fan-control sudo systemctl status fan-control查看日志也很重要journalctl -u fan-control -f常见问题包括权限不足确保脚本有执行权限路径错误使用绝对路径依赖未就绪调整After参数4. 生产环境优化实践4.1 硬件保护机制在实际部署中我增加了过热保护逻辑。当温度超过85℃时除了全速运转风扇外还会触发系统警报if [ $temp -gt 85000 ]; then echo 50000 $PWM_PATH/duty_cycle wall 警告CPU温度过高 fi4.2 性能与功耗平衡通过长期测试我发现将空闲转速设为25%可以在静音和散热间取得良好平衡。同时增加了响应速度参数当温度快速上升时调速灵敏度会提高last_temp0 while true; do current_temp$(cat $TEMP_FILE) temp_diff$((current_temp - last_temp)) if [ $temp_diff -gt 5000 ]; then adjust_step$((temp_diff / 1000)) new_duty$((current_duty adjust_step)) echo $new_duty $PWM_PATH/duty_cycle fi last_temp$current_temp sleep 10 done这套方案在我的媒体服务器上稳定运行了半年多CPU温度始终控制在安全范围内同时噪音几乎不可闻。对于需要24小时运行的设备来说合理的风扇控制策略确实能显著提升使用体验。