คลาส DAC -- การแปลงสัญญาณดิจิทัลเป็นแอนะล็อก

DAC ส่งออกแรงดันแอนะล็อกระหว่าง 0 V ถึง 3.3 V บนช่องทาง DAC ของ STM32 หนึ่งในสองช่อง

บน STM32 OpenMV Cam ทุกรุ่นที่เปิดเผย pyb.DAC (M4 / M7 / H7 / H7 Plus / Pure Thermal) ช่องทางต่างๆ เชื่อมต่อดังนี้:

ช่องทาง DAC

พินหัวต่อ

พิน STM32

DAC(1)

(ไม่มีบนหัวต่อ)

PA4

DAC(2)

P6

PA5

OpenMV Cam N6 ไม่มีอุปกรณ์ต่อพ่วง DAC จึงไม่สามารถใช้ pyb.DAC บนบอร์ดนั้นได้

ตัวอย่างการใช้งาน:

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

เพื่อส่งออกคลื่นไซน์ต่อเนื่อง:

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)

เพื่อส่งออกคลื่นไซน์ต่อเนื่องที่ความละเอียด 12 บิต:

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)

คอนสตรักเตอร์

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

สร้างออบเจ็กต์ DAC ใหม่

port สามารถเป็นออบเจ็กต์ Pin หรือจำนวนเต็ม (1 หรือ 2) เพื่อเลือกช่องทาง DAC 1 หรือ 2 พินฟิสิคัลที่แต่ละช่องทางถูกเส้นทางไปนั้นขึ้นอยู่กับ OpenMV Cam

bits เป็นจำนวนเต็มที่ระบุความละเอียด และสามารถเป็น 8 หรือ 12 ได้ ค่าสูงสุดที่ write() และ write_timed() ยอมรับคือ (2**bits) - 1 (255 สำหรับ 8 บิต, 4095 สำหรับ 12 บิต)

พารามิเตอร์ buffering เลือกพฤติกรรมของบัฟเฟอร์เอาต์พุต op-amp ของ DAC ซึ่งมีจุดประสงค์เพื่อลดอิมพีแดนซ์เอาต์พุต สามารถเป็น None เพื่อเลือกค่าเริ่มต้น (เปิดใช้บัฟเฟอร์สำหรับ DAC.noise(), DAC.triangle() และ DAC.write_timed() และปิดใช้สำหรับ DAC.write()), False เพื่อปิดใช้บัฟเฟอร์ทั้งหมด หรือ True เพื่อเปิดใช้บัฟเฟอร์เอาต์พุต

เมื่อเปิดใช้บัฟเฟอร์ พิน DAC สามารถขับโหลดได้ถึง 5KΩ มิฉะนั้นจะมีอิมพีแดนซ์เอาต์พุตสูงสุด 15KΩ ดังนั้นเพื่อให้ได้ความแม่นยำ 1% โดยไม่ใช้บัฟเฟอร์ต้องการให้โหลดที่ใช้งานน้อยกว่า 1.5MΩ การใช้บัฟเฟอร์มีค่าใช้จ่ายด้านความแม่นยำ โดยเฉพาะในบริเวณใกล้กับขอบช่วงค่า

เมธอด

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

เริ่มต้น DAC ใหม่ bits สามารถเป็น 8 หรือ 12 buffering สามารถเป็น None, False หรือ True; ดูคอนสตรักเตอร์ข้างต้นสำหรับความหมายของพารามิเตอร์นี้

deinit() None

ยกเลิกการเริ่มต้น DAC และทำให้พินของมันพร้อมใช้งานเพื่อวัตถุประสงค์อื่น

noise(freq: int) None

สร้างสัญญาณสุ่มเสียงแบบเทียม ตัวอย่างสุ่มใหม่จะถูกเขียนไปยังเอาต์พุต DAC ที่ความถี่ที่กำหนด

triangle(freq: int) None

สร้างคลื่นสามเหลี่ยม ค่าบนเอาต์พุต DAC จะเปลี่ยนแปลงที่ความถี่ที่กำหนดและขยับผ่านช่วง 12 บิตเต็ม (ขึ้นและลง) ดังนั้นความถี่ของคลื่นสามเหลี่ยมที่ซ้ำเองจะเล็กกว่า 8192 เท่า

write(value: int) None

เข้าถึงเอาต์พุต DAC โดยตรง ค่าต่ำสุดคือ 0; ค่าสูงสุดคือ (2**bits) - 1 โดยที่ bits ถูกตั้งค่าเมื่อสร้างออบเจ็กต์ DAC หรือผ่าน init()

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

เริ่มต้นการส่งข้อมูลจาก RAM ไปยัง DAC โดยใช้การถ่ายโอน DMA ข้อมูลนำเข้าถูกจัดการเป็นอาร์เรย์ของไบต์ในโหมด 8 บิต และอาร์เรย์ของครึ่งคำแบบไม่มีเครื่องหมาย (typecode อาร์เรย์ 'H') ในโหมด 12 บิต

freq สามารถเป็นจำนวนเต็มที่ระบุความถี่ในการเขียนตัวอย่าง DAC โดยใช้ Timer(6) หรือสามารถเป็นออบเจ็กต์ Timer ที่เริ่มต้นแล้วซึ่งใช้เป็นตัวทริกเกอร์ตัวอย่าง DAC ตัวจับเวลาที่ใช้ได้คือ 2, 4, 5, 6, 7 และ 8

mode สามารถเป็น DAC.NORMAL หรือ DAC.CIRCULAR

ตัวอย่างการใช้ DAC ทั้งสองพร้อมกัน:

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)

ค่าคงที่

NORMAL: int

โหมด NORMAL ทำการส่งคลื่นในบัฟเฟอร์ข้อมูลเพียงครั้งเดียว

CIRCULAR: int

โหมด CIRCULAR ส่งคลื่นในบัฟเฟอร์ข้อมูลและวนกลับไปยังจุดเริ่มต้นของบัฟเฟอร์ทุกครั้งที่ถึงจุดสิ้นสุด ผลิตลูปต่อเนื่องจนกว่าจะเรียก deinit()