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’objettimer.bufpeut ê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 dansbufsi la taille de ses éléments est de 16 bits ou plus. Sibufn’a que des éléments de 8 bits (par exemple un bytearray), la résolution d’échantillonnage sera réduite à 8 bits.timerdoit ê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,
timerpeut 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
bytearrayou unarray.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 unbytearray), 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’origineread_timed_multin’est utile qu’avec un seul ADC. Câblez des entrées analogiques supplémentaires via des référencescpudepyb.Pinpour 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
Truesi 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 renvoieFalse, 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.