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] Description=Fan PWM Control Service After=multi-user.target Requires=sys-devices-platform-ffd84000.i2c-i2c-1-1-0018.device [Service] Type=simple ExecStart=/usr/local/bin/fan-control.sh Restart=always RestartSec=5 [Install] WantedBy=multi-user.target这里有几个关键点需要注意:
After参数确保依赖设备就绪后再启动服务Type=simple适用于持续运行的后台脚本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_temp=0 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小时运行的设备来说,合理的风扇控制策略确实能显著提升使用体验。