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ộ, VBAT và VREFINT 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
buftheo tốc độ được thiết lập bởi đối tượngtimer.bufcó 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àobufnếu kích thước phần tử của nó là 16 bit trở lên. Nếubufchỉ 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.timerphả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,
timercũ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à
bytearrayhoặcarray.arraychẳ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ẩnread_timed_multichỉ 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ếucpucủapyb.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ề
Truenế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.