🛠 Surveillance thermique et fréquence : DVFS, seuils et bridage
Objetivos
Comprender la gestión térmica del Pi 4B: límite de hardware a 85 grados C, extrañamente ARM entre 80 y 85, ningún límite de software (a diferencia del 3B+), motor DVFS con escalones de 1500/1000/750/600 MHz. Construirás un monitor que registra la temperatura, la frecuencia y los bits de estrangulamiento (throttling).
Material
- Raspberry Pi 4B (disipador o ventilador muy recomendable)
- sudo apt install stress-ng
- Terminal o sesión SSH
Código completo
#!/usr/bin/env bash
# thermal-log.sh - journalise temperature, frequence DVFS et etat de bridage
while true; do
T=$(vcgencmd measure_temp | cut -d= -f2)
F=$(cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq)
TH=$(vcgencmd get_throttled | cut -d= -f2)
V=$(vcgencmd pmic_read_adc | grep EXT5V_V | awk '{print $NF}')
echo "$(date +%T) temp=$T freq=${F}Hz throttled=$TH 5V=${V}"
sleep 1
done
# Dans un autre terminal, monter en charge :
sudo stress-ng --cpu 4 --timeout 120s
# Decoder get_throttled : bit0 sous-tension, bit2 bridage thermique,
# bit3 frequence sous le max, bit16 sous-tension passee, bit20 bridage passe.
Verificación esperada
Bajo stress-ng, la frecuencia cae por escalones (1500 y luego 1000 MHz) cuando la temperatura se acerca a 80 grados, get_throttled pasa a ser 0x50005 (estrangulamiento térmico + frecuencia limitada), y luego vuelve a 0x0 al enfriarse. EXT5V_V debe permanecer cerca de 5.0 V.
Errores frecuentes
- Creer que hay un estrangulamiento de hardware a 80: el corte duro es a 85, la zona 80-85 es el estrangulamiento progresivo.
- No leer get_throttled: los bits 16/20 indican incidentes pasados que de otra forma serían invisibles.
- Caja cerrada sin disipador: el Pi 4 funciona caliente, esto está documentado.
- Confundir scaling_cur_freq (instantáneo) con la frecuencia máxima configurada arm_freq=1500.
- Subalimentar: una subtensión provoca el mismo estrangulamiento que el calor.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
led_blink.pyPythonbutton_led.pyPythonservo_sweep.pyPythondht_temp.pyPythonoled_i2c.pyPythonmcp3008_read.pyPython