classe ADC – conversão analógico-digital

Utilização:

import pyb

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

Consulte pyb.ADCAll para acesso simultâneo a todos os canais ADC, bem como aos sensores internos do MCU para temperatura do chip, VBAT e VREFINT.

Construtores

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

Cria um objeto ADC associado ao pino indicado. Permite depois ler valores analógicos nesse pino.

Métodos

read() int

Lê o valor no pino analógico e devolve-o. O valor devolvido estará entre 0 e 4095.

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

Lê valores analógicos para buf a uma taxa definida pelo objeto timer.

buf pode ser, por exemplo, bytearray ou array.array. Os valores ADC têm resolução de 12 bits e são armazenados diretamente em buf se o tamanho dos seus elementos for de 16 bits ou superior. Se buf tiver apenas elementos de 8 bits (por exemplo, um bytearray), a resolução de amostragem será reduzida para 8 bits.

timer deve ser um objeto Timer, e uma amostra é lida sempre que o temporizador dispara. O temporizador deve estar previamente inicializado e a funcionar à frequência de amostragem pretendida.

Para suportar o comportamento anterior desta função, timer pode também ser um inteiro que especifica a frequência (em Hz) de amostragem. Nesse caso, Timer(6) será configurado automaticamente para funcionar à frequência indicada.

Exemplo com objeto Timer (forma preferida):

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

Exemplo com inteiro para a frequência:

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)

Esta função não aloca memória no heap. Tem comportamento bloqueante: não regressa ao programa chamador até o buffer estar cheio.

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

Extrai dados de temporização relativa ou de fase de múltiplos ADCs.

Lê valores analógicos de múltiplos ADCs para buffers a uma taxa definida pelo objeto timer. Sempre que o temporizador dispara, é lida rapidamente uma amostra de cada ADC em sequência.

As instâncias de ADC e de buffer são passadas em tuplos, com cada ADC associado a um buffer. Todos os buffers devem ser do mesmo tipo e comprimento, e o número de buffers deve ser igual ao número de ADCs.

Os buffers podem ser, por exemplo, bytearray ou array.array. Os valores ADC têm resolução de 12 bits e são armazenados diretamente no buffer se o tamanho dos seus elementos for de 16 bits ou superior. Se os buffers tiverem apenas elementos de 8 bits (por exemplo, um bytearray), a resolução de amostragem será reduzida para 8 bits.

timer deve ser um objeto Timer. O temporizador deve estar previamente inicializado e a funcionar à frequência de amostragem pretendida.

As OpenMV Cams STM32 expõem apenas um pino de cabeçalho com capacidade ADC (P6), pelo que no hardware de série read_timed_multi só é útil com um único ADC. Ligue entradas analógicas adicionais através de referências cpu de pyb.Pin para utilizá-lo com mais de um ADC.

Exemplo de leitura de um 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)

Esta função não aloca memória no heap. Tem comportamento bloqueante: não regressa ao programa chamador até os buffers estarem cheios.

A função devolve True se todas as amostras foram adquiridas com temporização correta. A taxas de amostragem elevadas, o tempo necessário para adquirir um conjunto de amostras pode exceder o período do temporizador. Nesse caso, a função devolve False, indicando perda de precisão no intervalo de amostragem. Em casos extremos, amostras podem ser perdidas.

A taxa máxima depende de fatores como a largura dos dados e o número de ADCs a ler. Em testes, dois ADCs foram amostrados a uma taxa de temporizador de 210 kHz sem sobreposição. As amostras começaram a ser perdidas a 215 kHz. Para três ADCs, o limite é de cerca de 140 kHz, e para quatro é de cerca de 110 kHz. A taxas de amostragem elevadas, desativar as interrupções durante a aquisição pode reduzir o risco de perda esporádica de dados.