class ADC – 아날로그-디지털 변환

사용법:

import pyb

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

모든 ADC 채널과 MCU 내부의 다이 온도, VBAT, VREFINT 센서에 동시에 접근하려면 pyb.ADCAll 을 참고하세요.

생성자

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

지정한 핀에 연결된 ADC 객체를 생성합니다. 이를 통해 해당 핀에서 아날로그 값을 읽을 수 있습니다.

메서드

read() int

아날로그 핀의 값을 읽어 반환합니다. 반환되는 값은 0에서 4095 사이입니다.

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

timer 객체가 설정한 속도로 아날로그 값을 buf 에 읽어들입니다.

buf 는 예를 들어 bytearray 또는 array.array 가 될 수 있습니다. ADC 값은 12비트 해상도를 가지며, buf 의 요소 크기가 16비트 이상이면 값이 그대로 거기에 저장됩니다. buf 의 요소가 8비트뿐이라면(예: bytearray) 샘플 해상도가 8비트로 줄어듭니다.

timer 는 Timer 객체여야 하며, 타이머가 트리거될 때마다 샘플이 하나씩 읽힙니다. 타이머는 이미 초기화되어 원하는 샘플링 주파수로 동작하고 있어야 합니다.

이 함수의 이전 동작을 지원하기 위해, timer 에 샘플링할 주파수(Hz 단위)를 지정하는 정수를 전달할 수도 있습니다. 이 경우 Timer(6)이 지정된 주파수로 동작하도록 자동으로 구성됩니다.

Timer 객체를 사용하는 예제(권장 방식):

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

주파수에 정수를 사용하는 예제:

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)

이 함수는 힙 메모리를 할당하지 않습니다. 차단(blocking) 방식으로 동작하며, 버퍼가 가득 찰 때까지 호출한 프로그램으로 반환되지 않습니다.

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

여러 ADC에서 상대적인 타이밍 또는 위상 데이터를 추출합니다.

timer 객체가 설정한 속도로 여러 ADC에서 아날로그 값을 버퍼로 읽어들입니다. 타이머가 트리거될 때마다 각 ADC에서 차례로 샘플을 빠르게 읽습니다.

ADC와 버퍼 인스턴스는 각 ADC가 연결된 버퍼를 갖는 튜플로 전달됩니다. 모든 버퍼는 동일한 타입과 길이를 가져야 하며, 버퍼의 개수는 ADC의 개수와 같아야 합니다.

버퍼는 예를 들어 bytearray 또는 array.array 가 될 수 있습니다. ADC 값은 12비트 해상도를 가지며, 버퍼의 요소 크기가 16비트 이상이면 값이 그대로 버퍼에 저장됩니다. 버퍼의 요소가 8비트뿐이라면(예: bytearray) 샘플 해상도가 8비트로 줄어듭니다.

timer 는 Timer 객체여야 합니다. 타이머는 이미 초기화되어 원하는 샘플링 주파수로 동작하고 있어야 합니다.

STM32 OpenMV Cam은 ADC 가능 헤더 핀(P6)을 하나만 노출하므로, 기본 하드웨어에서는 read_timed_multi 가 단일 ADC에서만 유용합니다. 둘 이상의 ADC와 함께 사용하려면 pyb.Pincpu 참조를 통해 추가 아날로그 입력을 연결하세요.

하나의 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)

이 함수는 힙 메모리를 할당하지 않습니다. 차단(blocking) 방식으로 동작하며, 버퍼들이 가득 찰 때까지 호출한 프로그램으로 반환되지 않습니다.

이 함수는 모든 샘플이 올바른 타이밍으로 획득되었으면 True 를 반환합니다. 높은 샘플링 속도에서는 한 세트의 샘플을 획득하는 데 걸리는 시간이 타이머 주기를 초과할 수 있습니다. 이 경우 함수는 False 를 반환하여 샘플 간격의 정밀도 손실을 나타냅니다. 극단적인 경우 샘플을 놓칠 수도 있습니다.

최대 속도는 데이터 폭과 읽는 ADC의 개수 등 여러 요인에 따라 달라집니다. 테스트에서 두 개의 ADC는 오버런 없이 210kHz의 타이머 속도로 샘플링되었습니다. 215kHz에서는 샘플을 놓쳤습니다. 세 개의 ADC의 경우 한계는 약 140kHz이고, 네 개의 경우 약 110kHz입니다. 높은 샘플링 속도에서는 해당 시간 동안 인터럽트를 비활성화하면 산발적인 데이터 손실 위험을 줄일 수 있습니다.