الفئة DAC -- التحويل من الرقمي إلى التناظري

يُخرج DAC جهداً تناظرياً يتراوح بين 0 فولت و3.3 فولت على إحدى قناتي DAC في STM32.

في كل OpenMV Cam قائمة على STM32 وتوفّر 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 سلوك مخزن خرج مكبر العمليات في DAC، والغرض منه هو خفض ممانعة الخرج. يمكن أن تكون None لاختيار الوضع الافتراضي (التخزين المؤقت مُفعَّل لـ DAC.noise() وDAC.triangle() وDAC.write_timed()، ومعطَّل لـ DAC.write())، أو False لتعطيل التخزين المؤقت كلياً، أو True لتفعيل التخزين المؤقت للخرج.

عند تفعيل التخزين المؤقت يمكن لدبوس DAC قيادة أحمال تصل إلى 5 كيلوأوم. وإلا فإن له ممانعة خرج تبلغ 15 كيلوأوم كحد أقصى: وبالتالي فإن تحقيق دقة 1% بدون تخزين مؤقت يتطلب أن يكون الحمل المطبّق أقل من 1.5 ميغاأوم. ويؤدي استخدام المخزن المؤقت إلى انخفاض في الدقة، خصوصاً قرب طرفي المدى.

الطرائق

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 بت، وكمصفوفة من أنصاف الكلمات غير المُوقَّعة (رمز نوع المصفوفة '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().