class ADC -- التحويل من التناظري إلى الرقمي

الاستخدام:

import pyb

adc = pyb.ADC("P6")
val = adc.read()

راجع pyb.ADCAll للوصول المتزامن إلى كل قناة ADC إضافة إلى مستشعرات درجة حرارة شريحة الـ MCU الداخلية و VBAT و VREFINT.

المُنشئات

class pyb.ADC(pin: int | str | Pin)

إنشاء كائن ADC مرتبط بالدبوس المحدد. يتيح لك هذا قراءة القيم التناظرية على ذلك الدبوس.

الطرائق

read() int

قراءة القيمة على الدبوس التناظري وإرجاعها. ستكون القيمة المُرجعة بين 0 و 4095.

read_timed(buf: bytearray | 'array.array', timer: Timer | int) int

قراءة القيم التناظرية إلى buf بمعدل يحدده كائن timer.

يمكن أن يكون buf من النوع bytearray أو array.array على سبيل المثال. تتمتع قيم ADC بدقة 12 بت وتُخزَّن مباشرة في buf إذا كان حجم عنصره 16 بت أو أكثر. أما إذا كان buf يحوي عناصر بحجم 8 بت فقط (مثل bytearray) فستُخفَّض دقة العينة إلى 8 بت.

ينبغي أن يكون timer كائن Timer، وتُقرأ عينة في كل مرة يُطلق فيها المؤقت. يجب أن يكون المؤقت مُهيَّأً ويعمل بالفعل عند تردد أخذ العينات المطلوب.

لدعم السلوك السابق لهذه الدالة، يمكن أن يكون timer أيضاً عدداً صحيحاً يحدد التردد (بوحدة Hz) لأخذ العينات. في هذه الحالة سيُهيَّأ Timer(6) تلقائياً ليعمل عند التردد المحدد.

مثال باستخدام كائن Timer (الطريقة المُفضَّلة):

adc = pyb.ADC(pyb.Pin.board.P6)    # create an ADC on pin P6
tim = pyb.Timer(6, freq=10)        # create a timer running at 10Hz
buf = bytearray(100)               # buffer to hold the samples
adc.read_timed(buf, tim)           # sample 100 values, taking 10s

مثال باستخدام عدد صحيح للتردد:

adc = pyb.ADC(pyb.Pin.board.P6)    # create an ADC on pin P6
buf = bytearray(100)               # buffer of 100 bytes
adc.read_timed(buf, 10)            # read 100 samples at 10Hz (10s total)

for val in buf:
    print(val)

لا تخصص هذه الدالة أي ذاكرة كومة (heap). لها سلوك حاجب: فهي لا تعود إلى البرنامج المستدعي حتى يمتلئ المخزن المؤقت.

static read_timed_multi(adcs: Tuple[ADC, ...], bufs: Tuple[bytearray | 'array.array', ...], timer: Timer) bool

استخراج بيانات التوقيت أو الطور النسبية من عدة وحدات ADC.

تقرأ القيم التناظرية من عدة وحدات ADC إلى مخازن مؤقتة بمعدل يحدده كائن timer. في كل مرة يُطلق فيها المؤقت تُقرأ عينة بسرعة من كل ADC بالتتابع.

تُمرَّر نسخ ADC والمخزن المؤقت في صفوف (tuples) بحيث يكون لكل ADC مخزن مؤقت مرتبط به. يجب أن تكون جميع المخازن المؤقتة من النوع والطول نفسيهما، ويجب أن يساوي عدد المخازن المؤقتة عدد وحدات ADC.

يمكن أن تكون المخازن المؤقتة من النوع bytearray أو array.array على سبيل المثال. تتمتع قيم ADC بدقة 12 بت وتُخزَّن مباشرة في المخزن المؤقت إذا كان حجم عنصره 16 بت أو أكثر. أما إذا كانت المخازن المؤقتة تحوي عناصر بحجم 8 بت فقط (مثل bytearray) فستُخفَّض دقة العينة إلى 8 بت.

يجب أن يكون timer كائن Timer. يجب أن يكون المؤقت مُهيَّأً ويعمل بالفعل عند تردد أخذ العينات المطلوب.

تكشف كاميرات STM32 OpenMV Cam دبوس ترويسة واحداً فقط قادراً على ADC (وهو P6)، لذلك ففي العتاد الأصلي تكون read_timed_multi مفيدة مع ADC واحدة فقط. وصِّل مداخل تناظرية إضافية عبر مراجع cpu في pyb.Pin لاستخدامها مع أكثر من ADC واحدة.

مثال على قراءة ADC واحدة:

import array

adc = pyb.ADC(pyb.Pin.board.P6)
tim = pyb.Timer(8, freq=100)
rx = array.array("H", (0 for i in range(100)))

# Sample 100 values at 100Hz (takes one second).
pyb.ADC.read_timed_multi((adc,), (rx,), tim)

for val in rx:
    print(val)

لا تخصص هذه الدالة أي ذاكرة كومة (heap). لها سلوك حاجب: فهي لا تعود إلى البرنامج المستدعي حتى تمتلئ المخازن المؤقتة.

تُرجِع الدالة True إذا اكتُسبت جميع العينات بتوقيت صحيح. عند معدلات أخذ العينات العالية قد يتجاوز الوقت اللازم لاكتساب مجموعة من العينات فترة المؤقت. في هذه الحالة تُرجِع الدالة False، مما يشير إلى فقدان الدقة في فترة العينة. وفي الحالات القصوى قد تُفقَد عينات.

يعتمد المعدل الأقصى على عوامل تشمل عرض البيانات وعدد وحدات ADC المقروءة. في الاختبارات أُخِذت عينات من وحدتي ADC بمعدل مؤقت قدره 210kHz دون تجاوز. وفُقِدت عينات عند 215kHz. أما لثلاث وحدات ADC فالحد يقارب 140kHz، ولأربع يقارب 110kHz. عند معدلات أخذ العينات العالية يمكن أن يقلل تعطيل المقاطعات طوال المدة من خطر فقدان البيانات المتقطع.