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_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. عند معدلات أخذ العينات العالية يمكن أن يقلل تعطيل المقاطعات طوال المدة من خطر فقدان البيانات المتقطع.