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

DAC xuất điện áp tương tự từ 0 V đến 3,3 V trên một trong hai kênh DAC của STM32.

Trên mọi OpenMV Cam STM32 có pyb.DAC (M4 / M7 / H7 / H7 Plus / Pure Thermal), các kênh được nối như sau:

Kênh DAC

Chân header

Chân STM32

DAC(1)

(không có trên header)

PA4

DAC(2)

P6

PA5

OpenMV Cam N6 không có ngoại vi DAC; pyb.DAC không khả dụng trên bo mạch đó.

Ví dụ sử dụng:

from pyb import DAC

dac = DAC(1)            # create DAC channel 1
dac.write(128)          # write a value to the DAC (approximately 1.65 V)

dac = DAC(1, bits=12)   # use 12-bit resolution
dac.write(4095)         # output maximum value, 3.3 V

Để xuất sóng sine liên tục:

import math
from pyb import DAC

# create a buffer containing a sine-wave
buf = bytearray(100)
for i in range(len(buf)):
    buf[i] = 128 + int(127 * math.sin(2 * math.pi * i / len(buf)))

# output the sine-wave at 400Hz
dac = DAC(1)
dac.write_timed(buf, 400 * len(buf), mode=DAC.CIRCULAR)

Để xuất sóng sine liên tục ở độ phân giải 12-bit:

import math
from array import array
from pyb import DAC

# 128-sample sine wave, half-word samples centred at 2048 (12-bit mid).
N = 128
buf = array("H", (
    2048 + int(2047 * math.sin(2 * math.pi * i / N))
    for i in range(N)
))

# Output the sine wave at 400Hz.
dac = DAC(1, bits=12)
dac.write_timed(buf, 400 * len(buf), mode=DAC.CIRCULAR)

Hàm khởi tạo

class pyb.DAC(port: int | Pin, bits: int = 8, *, buffering: bool | None = None)

Tạo một đối tượng DAC mới.

port có thể là một đối tượng Pin, hoặc một số nguyên (1 hoặc 2) để chọn kênh DAC 1 hay 2. Chân vật lý mà mỗi kênh được dẫn tới phụ thuộc vào OpenMV Cam.

bits là số nguyên chỉ định độ phân giải, có thể là 8 hoặc 12. Giá trị tối đa được chấp nhận bởi write()write_timed()(2**bits) - 1 (255 với 8-bit, 4095 với 12-bit).

Tham số buffering chọn hành vi của bộ đệm op-amp đầu ra DAC, mục đích là giảm trở kháng đầu ra. Có thể là None để chọn mặc định (bộ đệm được bật cho DAC.noise(), DAC.triangle()DAC.write_timed(), và tắt cho DAC.write()), False để tắt hoàn toàn bộ đệm, hoặc True để bật bộ đệm đầu ra.

Khi bộ đệm được bật, chân DAC có thể dẫn tải xuống 5KΩ. Ngược lại, trở kháng đầu ra tối đa là 15KΩ: do đó để đạt độ chính xác 1% mà không có bộ đệm, tải đặt vào phải nhỏ hơn 1,5MΩ. Sử dụng bộ đệm làm giảm độ chính xác, đặc biệt ở các cực biên của dải đo.

Phương thức

init(bits: int = 8, *, buffering: bool | None = None) None

Khởi tạo lại DAC. bits có thể là 8 hoặc 12. buffering có thể là None, False hoặc True; xem hàm khởi tạo ở trên để biết ý nghĩa của tham số này.

deinit() None

Hủy khởi tạo DAC, giải phóng chân của nó để sử dụng cho mục đích khác.

noise(freq: int) None

Tạo tín hiệu nhiễu giả ngẫu nhiên. Một mẫu ngẫu nhiên mới được ghi vào đầu ra DAC theo tần số đã cho.

triangle(freq: int) None

Tạo sóng tam giác. Giá trị ở đầu ra DAC thay đổi theo tần số đã cho và tăng/giảm qua toàn bộ dải 12-bit (lên và xuống). Do đó tần số của chính sóng tam giác lặp lại nhỏ hơn 8192 lần.

write(value: int) None

Truy cập trực tiếp đầu ra DAC. Giá trị tối thiểu là 0; tối đa là (2**bits) - 1, trong đó bits được đặt khi tạo đối tượng DAC hoặc qua init().

write_timed(data: bytes | bytearray | 'array.array', freq: int | Timer, *, mode: int = DAC.NORMAL) None

Khởi tạo một chuỗi truyền từ RAM sang DAC sử dụng truyền DMA. Dữ liệu đầu vào được xử lý như mảng byte ở chế độ 8-bit, và mảng half-word không dấu (mã kiểu mảng 'H') ở chế độ 12-bit.

freq có thể là số nguyên chỉ định tần số ghi mẫu DAC, sử dụng Timer(6). Hoặc có thể là đối tượng Timer đã được khởi tạo dùng để kích hoạt mẫu DAC. Các timer hợp lệ là 2, 4, 5, 6, 7 và 8.

mode có thể là DAC.NORMAL hoặc DAC.CIRCULAR.

Ví dụ sử dụng cả hai DAC cùng lúc:

dac1 = DAC(1)
dac2 = DAC(2)
dac1.write_timed(buf1, pyb.Timer(6, freq=100), mode=DAC.CIRCULAR)
dac2.write_timed(buf2, pyb.Timer(7, freq=200), mode=DAC.CIRCULAR)

Hằng số

NORMAL: int

Chế độ NORMAL thực hiện một lần truyền dạng sóng trong bộ đệm dữ liệu.

CIRCULAR: int

Chế độ CIRCULAR truyền dạng sóng trong bộ đệm dữ liệu và quay vòng về đầu bộ đệm mỗi khi đến cuối, tạo ra vòng lặp liên tục cho đến khi deinit() được gọi.