lớp ADC -- chuyển đổi tương tự sang số

Cách dùng:

import pyb

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

Xem pyb.ADCAll để truy cập đồng thời mọi kênh ADC cùng với cảm biến nhiệt độ die nội bộ, VBATVREFINT của MCU.

Hàm khởi tạo

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

Tạo một đối tượng ADC liên kết với chân (pin) đã cho. Sau đó bạn có thể đọc các giá trị tương tự trên chân đó.

Phương thức

read() int

Đọc giá trị trên chân tương tự và trả về. Giá trị trả về nằm trong khoảng từ 0 đến 4095.

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

Đọc các giá trị tương tự vào buf theo tốc độ được thiết lập bởi đối tượng timer.

buf có thể là bytearray hoặc array.array chẳng hạn. Các giá trị ADC có độ phân giải 12-bit và được lưu trực tiếp vào buf nếu kích thước phần tử của nó là 16 bit trở lên. Nếu buf chỉ có các phần tử 8-bit (ví dụ bytearray) thì độ phân giải mẫu sẽ giảm xuống còn 8 bit.

timer phải là một đối tượng Timer, và một mẫu được đọc mỗi khi bộ định thời kích hoạt. Bộ định thời phải được khởi tạo và đang chạy ở tần số lấy mẫu mong muốn.

Để hỗ trợ hành vi trước đây của hàm này, timer cũng có thể là một số nguyên chỉ định tần số (tính bằng Hz) để lấy mẫu. Trong trường hợp này, Timer(6) sẽ được tự động cấu hình để chạy ở tần số đã cho.

Ví dụ sử dụng đối tượng Timer (cách được khuyến nghị):

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

Ví dụ sử dụng số nguyên cho tần số:

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)

Hàm này không cấp phát bộ nhớ heap. Nó có hành vi chặn: không trả về chương trình gọi cho đến khi bộ đệm đầy.

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

Trích xuất dữ liệu định thời tương đối hoặc pha từ nhiều ADC.

Đọc các giá trị tương tự từ nhiều ADC vào các bộ đệm theo tốc độ được thiết lập bởi đối tượng timer. Mỗi khi bộ định thời kích hoạt, một mẫu được đọc nhanh từng ADC một.

Các phiên bản ADC và bộ đệm được truyền vào trong các tuple, với mỗi ADC có một bộ đệm liên kết. Tất cả các bộ đệm phải cùng kiểu và độ dài, và số lượng bộ đệm phải bằng số lượng ADC.

Bộ đệm có thể là bytearray hoặc array.array chẳng hạn. Các giá trị ADC có độ phân giải 12-bit và được lưu trực tiếp vào bộ đệm nếu kích thước phần tử là 16 bit trở lên. Nếu bộ đệm chỉ có các phần tử 8-bit (ví dụ bytearray) thì độ phân giải mẫu sẽ giảm xuống còn 8 bit.

timer phải là một đối tượng Timer. Bộ định thời phải được khởi tạo và đang chạy ở tần số lấy mẫu mong muốn.

Các STM32 OpenMV Cam chỉ có một chân header hỗ trợ ADC (P6), vì vậy trên phần cứng tiêu chuẩn read_timed_multi chỉ hữu ích với một ADC duy nhất. Hãy kết nối thêm các đầu vào tương tự qua tham chiếu cpu của pyb.Pin để sử dụng với nhiều hơn một ADC.

Ví dụ đọc một 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)

Hàm này không cấp phát bộ nhớ heap. Nó có hành vi chặn: không trả về chương trình gọi cho đến khi các bộ đệm đầy.

Hàm trả về True nếu tất cả các mẫu được lấy đúng thời gian. Ở tốc độ lấy mẫu cao, thời gian cần để lấy một tập mẫu có thể vượt quá chu kỳ bộ định thời. Trong trường hợp này hàm trả về False, cho biết mất độ chính xác trong khoảng thời gian lấy mẫu. Trong các trường hợp cực đoan, các mẫu có thể bị bỏ qua.

Tốc độ tối đa phụ thuộc vào các yếu tố như độ rộng dữ liệu và số lượng ADC đang được đọc. Trong thử nghiệm, hai ADC được lấy mẫu ở tốc độ bộ định thời 210kHz mà không bị tràn. Các mẫu bị bỏ lỡ ở 215kHz. Với ba ADC, giới hạn là khoảng 140kHz, và với bốn ADC là khoảng 110kHz. Ở tốc độ lấy mẫu cao, vô hiệu hóa ngắt trong suốt quá trình có thể giảm nguy cơ mất dữ liệu ngẫu nhiên.