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