คลาส DAC -- การแปลงสัญญาณดิจิทัลเป็นแอนะล็อก¶
DAC ส่งออกแรงดันแอนะล็อกระหว่าง 0 V ถึง 3.3 V บนช่องทาง DAC ของ STM32 หนึ่งในสองช่อง
บน STM32 OpenMV Cam ทุกรุ่นที่เปิดเผย pyb.DAC (M4 / M7 / H7 / H7 Plus / Pure Thermal) ช่องทางต่างๆ เชื่อมต่อดังนี้:
ช่องทาง DAC |
พินหัวต่อ |
พิน STM32 |
|---|---|---|
|
(ไม่มีบนหัวต่อ) |
|
|
|
|
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 Cambitsเป็นจำนวนเต็มที่ระบุความละเอียด และสามารถเป็น 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; ดูคอนสตรักเตอร์ข้างต้นสำหรับความหมายของพารามิเตอร์นี้
- 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 และ 8modeสามารถเป็น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)
ค่าคงที่¶