classe ADC – conversion analogique-numérique

Utilisation

import pyb

adc = pyb.ADC("P6")
val = adc.read()

Voir pyb.ADCAll pour un accès simultané à tous les canaux ADC ainsi qu’aux capteurs internes du MCU mesurant la température de la puce, VBAT et VREFINT.

Constructeurs

class pyb.ADC(pin: int | str | Pin)

Crée un objet ADC associé à la broche donnée. Cela vous permet ensuite de lire des valeurs analogiques sur cette broche.

Méthodes

read() int

Lit la valeur sur la broche analogique et la renvoie. La valeur renvoyée est comprise entre 0 et 4095.

read_timed(buf: bytearray | 'array.array', timer: Timer | int) int

Lit des valeurs analogiques dans buf à une cadence définie par l’objet timer.

buf peut être par exemple un bytearray ou un array.array. Les valeurs de l’ADC ont une résolution de 12 bits et sont stockées directement dans buf si la taille de ses éléments est de 16 bits ou plus. Si buf n’a que des éléments de 8 bits (par exemple un bytearray), la résolution d’échantillonnage sera réduite à 8 bits.

timer doit être un objet Timer, et un échantillon est lu à chaque déclenchement du minuteur. Le minuteur doit déjà être initialisé et fonctionner à la fréquence d’échantillonnage souhaitée.

Pour conserver le comportement antérieur de cette fonction, timer peut aussi être un entier qui spécifie la fréquence (en Hz) d’échantillonnage. Dans ce cas, Timer(6) sera automatiquement configuré pour fonctionner à la fréquence donnée.

Exemple utilisant un objet Timer (méthode recommandée)

adc = pyb.ADC(pyb.Pin.board.P6)    # create an ADC on pin P6
tim = pyb.Timer(6, freq=10)        # create a timer running at 10Hz
buf = bytearray(100)               # buffer to hold the samples
adc.read_timed(buf, tim)           # sample 100 values, taking 10s

Exemple utilisant un entier pour la fréquence

adc = pyb.ADC(pyb.Pin.board.P6)    # create an ADC on pin P6
buf = bytearray(100)               # buffer of 100 bytes
adc.read_timed(buf, 10)            # read 100 samples at 10Hz (10s total)

for val in buf:
    print(val)

Cette fonction n’alloue aucune mémoire sur le tas. Elle a un comportement bloquant : elle ne rend pas la main au programme appelant tant que le tampon n’est pas plein.

static read_timed_multi(adcs: Tuple[ADC, ...], bufs: Tuple[bytearray | 'array.array', ...], timer: Timer) bool

Extrait des données de synchronisation relative ou de phase à partir de plusieurs ADC.

Lit des valeurs analogiques de plusieurs ADC dans des tampons à une cadence définie par l’objet timer. À chaque déclenchement du minuteur, un échantillon est lu rapidement de chaque ADC tour à tour.

Les instances d’ADC et de tampon sont passées dans des tuples, chaque ADC ayant un tampon associé. Tous les tampons doivent être du même type et de la même longueur, et le nombre de tampons doit être égal au nombre d’ADC.

Les tampons peuvent être par exemple un bytearray ou un array.array. Les valeurs de l’ADC ont une résolution de 12 bits et sont stockées directement dans le tampon si la taille de ses éléments est de 16 bits ou plus. Si les tampons n’ont que des éléments de 8 bits (par exemple un bytearray), la résolution d’échantillonnage sera réduite à 8 bits.

timer doit être un objet Timer. Le minuteur doit déjà être initialisé et fonctionner à la fréquence d’échantillonnage souhaitée.

Les OpenMV Cam basées sur STM32 n’exposent qu’une seule broche d’en-tête compatible ADC (P6), donc sur le matériel d’origine read_timed_multi n’est utile qu’avec un seul ADC. Câblez des entrées analogiques supplémentaires via des références cpu de pyb.Pin pour l’utiliser avec plus d’un ADC.

Exemple de lecture d’un ADC

import array

adc = pyb.ADC(pyb.Pin.board.P6)
tim = pyb.Timer(8, freq=100)
rx = array.array("H", (0 for i in range(100)))

# Sample 100 values at 100Hz (takes one second).
pyb.ADC.read_timed_multi((adc,), (rx,), tim)

for val in rx:
    print(val)

Cette fonction n’alloue aucune mémoire sur le tas. Elle a un comportement bloquant : elle ne rend pas la main au programme appelant tant que les tampons ne sont pas pleins.

La fonction renvoie True si tous les échantillons ont été acquis avec une synchronisation correcte. À des cadences d’échantillonnage élevées, le temps nécessaire pour acquérir un ensemble d’échantillons peut dépasser la période du minuteur. Dans ce cas, la fonction renvoie False, indiquant une perte de précision dans l’intervalle d’échantillonnage. Dans des cas extrêmes, des échantillons peuvent être manqués.

La cadence maximale dépend de facteurs tels que la largeur des données et le nombre d’ADC lus. Lors de tests, deux ADC ont été échantillonnés à une cadence de minuteur de 210 kHz sans dépassement. Des échantillons ont été manqués à 215 kHz. Pour trois ADC, la limite est d’environ 140 kHz, et pour quatre elle est d’environ 110 kHz. À des cadences d’échantillonnage élevées, désactiver les interruptions pendant l’opération peut réduire le risque de perte de données sporadique.