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_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.Pin의cpu참조를 통해 추가 아날로그 입력을 연결하세요.하나의 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입니다. 높은 샘플링 속도에서는 해당 시간 동안 인터럽트를 비활성화하면 산발적인 데이터 손실 위험을 줄일 수 있습니다.