classe ADC – conversão analógico-digital

Uso:

import pyb

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

Consulte pyb.ADCAll para acesso simultâneo a todos os canais ADC, além dos sensores internos do MCU de temperatura do die, VBAT e VREFINT.

Construtores

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

Cria um objeto ADC associado ao pino fornecido. Isso permite que você leia valores analógicos nesse pino.

Métodos

read() int

Lê o valor no pino analógico e o retorna. O valor retornado 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, um bytearray ou array.array. Os valores do ADC têm resolução de 12 bits e são armazenados diretamente em buf se o tamanho de seus elementos for de 16 bits ou mais. Se buf tiver apenas elementos de 8 bits (por exemplo, um bytearray), a resolução da amostra será reduzida para 8 bits.

timer deve ser um objeto Timer, e uma amostra é lida cada vez que o timer dispara. O timer já deve estar inicializado e em execução na frequência de amostragem desejada.

Para dar suporte ao comportamento anterior desta função, timer também pode ser um inteiro que especifica a frequência (em Hz) na qual amostrar. Nesse caso, Timer(6) será configurado automaticamente para executar na frequência fornecida.

Exemplo usando um 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 usando um 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 nenhuma memória de heap. Ela tem comportamento bloqueante: não retorna ao programa chamador até que o buffer esteja 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. Cada vez que o timer dispara, uma amostra é lida rapidamente de cada ADC, um por vez.

As instâncias de ADC e de buffer são passadas em tuplas, com cada ADC tendo um buffer associado. 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 do ADC têm resolução de 12 bits e são armazenados diretamente no buffer se o tamanho de seus elementos for de 16 bits ou mais. Se os buffers tiverem apenas elementos de 8 bits (por exemplo, um bytearray), a resolução da amostra será reduzida para 8 bits.

timer deve ser um objeto Timer. O timer já deve estar inicializado e em execução na frequência de amostragem desejada.

As OpenMV Cams STM32 expõem apenas um pino de header com capacidade de ADC (P6), portanto, em hardware padrão, read_timed_multi só é útil com um único ADC. Conecte entradas analógicas adicionais por meio de referências cpu de pyb.Pin para usá-lo com mais de um ADC.

Exemplo lendo 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 nenhuma memória de heap. Ela tem comportamento bloqueante: não retorna ao programa chamador até que os buffers estejam cheios.

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

A taxa máxima depende de fatores que incluem a largura dos dados e o número de ADCs sendo lidos. Em testes, dois ADCs foram amostrados a uma taxa de timer de 210 kHz sem estouro. Amostras foram perdidas a 215 kHz. Para três ADCs, o limite fica em torno de 140 kHz, e para quatro, em torno de 110 kHz. Em altas taxas de amostragem, desabilitar as interrupções durante esse período pode reduzir o risco de perda esporádica de dados.