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_timed(buf: bytearray | 'array.array', timer: Timer | int) int¶
Lê valores analógicos para
bufa uma taxa definida pelo objetotimer.bufpode ser, por exemplo, um bytearray ou array.array. Os valores do ADC têm resolução de 12 bits e são armazenados diretamente embufse o tamanho de seus elementos for de 16 bits ou mais. Sebuftiver apenas elementos de 8 bits (por exemplo, um bytearray), a resolução da amostra será reduzida para 8 bits.timerdeve 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,
timertambé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,
bytearrayouarray.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, umbytearray), 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_multisó é útil com um único ADC. Conecte entradas analógicas adicionais por meio de referênciascpudepyb.Pinpara 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
Truese 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 retornaFalse, 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.