🛠 Lire l'ADC 12 bits sans griller le SoC : la règle des 1,8 V
Objectifs
Utiliser l'ADC 8 canaux 12 bits de l'AM335x via le sous-système IIO de mainline, et surtout intégrer le piège n°1 de la BeagleBone Black côté analogique : les entrées AIN acceptent 1,8 V AU PLUS (alimentation analogique VDD_ADC = 1,8 V sur P9_32), alors que tout le reste de la carte est en 3,3 V. Au-delà de 1,8 V, on abîme le SoC.
Matériel
- 1 BeagleBone Black
- Canaux disponibles sur P9 : AIN0=P9_39, AIN1=P9_40, AIN2=P9_37, AIN3=P9_38, AIN4=P9_33, AIN5=P9_36, AIN6=P9_35 ; VDD_ADC (1,8 V) = P9_32 ; AGND = P9_34
- Pour mesurer un signal 0-3,3 V : pont diviseur (ex. R1=10 kΩ en série, R2=4,7 kΩ vers GND → facteur 0,32, soit max ~1,05 V)
- 1 potentiomètre alimenté en 1,8 V (P9_32) pour le test sans risque
Code complet
# Repérer le device IIO et les canaux activés
ls /sys/bus/iio/devices/iio:device0/
cat /sys/bus/iio/devices/iio:device0/in_voltage0_label # vérifier quel AIN
#!/usr/bin/env python3
"""Lit AIN4 (P9_33) sur une BBB mainline. Entrée MAX : 1,8 V !"""
import glob, time
dev = glob.glob("/sys/bus/iio/devices/iio:device*")[0] # "ti_am335x_adc"
# L'index N dépend des canaux activés dans le DT : vérifier les labels !
CHAN = "in_voltage0_raw"
while True:
raw = int(open(f"{dev}/{CHAN}").read) # code 12 bits : 0..4095
mv = raw * 1800 / 4095 # référence pleine échelle 1,8 V
print(f"raw={raw} {mv:.0f} mV (entrée directe ; diviseur ?)")
time.sleep(0.2)
Vérification attendue
Avec le curseur du potentiomètre entre P9_32 (1,8 V) et P9_34 (AGND) vers AIN4, la valeur brute suit 0 à 4095 et les millivolts calculés suivent 0 à 1800. Doigt sur la broche : la valeur dérive (entrée flottante) — preuve que la mesure est vivante.
Erreurs fréquentes
- Injecter 3,3 V (voire 5 V) directement sur un AIN : c'est la panne classique documentée par le SRM (« AIN (1.8V MAX) ») ; au-dessus de 1,8 V, dégâts sur le SoC. Toujours passer par un pont diviseur.
- Oublier de relier AGND (P9_34) à la masse de votre circuit : mesures qui dansent de plusieurs centaines de codes.
- Mauvais index in_voltageN_raw : l'index dépend des canaux activés dans le device tree ; vérifier les in_voltageN_label avant de câbler un signal réel.
- Croir à un ADC 3,3 V comme sur d'autres cartes : ici le rail analogique est 1,8 V, la résolution exploitable est 12 bits sur cette plage.
- Attendre une précision métrologique : bruit de quelques codes, moyenneur nécessaire pour du stable (moyenne sur 16 lectures).
Autres tutoriels pour cette carte
- Premier boot de la BeagleBone Black avec un seul câble mini-USB
- Comprendre les triggers en pilotant les 4 LED utilisateur
- Bouton et LED avec Adafruit_BBIO, la bibliothèque historique
- Ajouter une horloge temps réel sur le bus I2C des capes
- Micro-HDMI : exploiter les limites d'affichage de la BBB
- Capes historiques : capemanager, EEPROM d'identification et pièges des broches
Exemples de code pour cette carte
clignotante.pyPythonbouton-gpio.pyPythoncapteur-i2c.shBashsurveillance-temperature.shBashcapteur-dht11.pyPythonservo-pwm-sysfs.shBash