class DAC – המרה מדיגיטלי לאנלוגי

ה-DAC מוציא מתחים אנלוגיים בין 0 V ל-3.3 V באחד משני ערוצי DAC של STM32.

בכל OpenMV Cam מבוססת STM32 שחושפת את pyb.DAC (M4 / M7 / H7 / H7 Plus / Pure Thermal) הערוצים מחווטים באופן הבא:

ערוץ DAC

פין מחבר (header)

פין 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 בוחר את התנהגות חוצץ היציאה של מגבר ה-DAC (op-amp), שמטרתו להפחית את עכבת היציאה. הוא יכול להיות 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

התחלת התפרצות (burst) מ-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().