جدول المحتويات:

Arduino و PCF8591 ADC DAC IC: 7 خطوات
Arduino و PCF8591 ADC DAC IC: 7 خطوات

فيديو: Arduino و PCF8591 ADC DAC IC: 7 خطوات

فيديو: Arduino و PCF8591 ADC DAC IC: 7 خطوات
فيديو: New Products 7/15/20 featuring Adafruit PCF8591 Quad 8-bit ADC + 8-bit DAC - STEMMA QT / Qwiic! 2024, شهر نوفمبر
Anonim
اردوينو و PCF8591 ADC DAC IC
اردوينو و PCF8591 ADC DAC IC

هل سبق لك أن أردت المزيد من دبابيس الإدخال التناظرية في مشروع Arduino الخاص بك ، لكنك لم ترغب في الخروج من أجل Mega؟ أو هل ترغب في توليد إشارات تناظرية؟ ثم تحقق من موضوع البرنامج التعليمي الخاص بنا - NXP PCF8591 IC.

إنه يحل هاتين المشكلتين لأنه يحتوي على محول DAC واحد (رقمي إلى تماثلي) بالإضافة إلى أربعة ADCs (تناظرية إلى محولات رقمية) - يمكن الوصول إليها جميعًا عبر ناقل I2C. يتوفر PCF8591 في DIP وتركيب السطح وشكل الوحدة ، مما يجعل من السهل تجربته.

قبل الانتقال ، قم بتنزيل ورقة البيانات. يمكن أن يعمل PCF8591 على كل من 5V و 3.3V ، لذا إذا كنت تستخدم Arduino Due أو Raspberry Pi أو لوحة تطوير أخرى 3.3 V ، فلا بأس بذلك. الآن سنشرح أولاً DAC ، ثم ADCs.

الخطوة 1: استخدام DAC (المحول الرقمي إلى التناظري)

استخدام DAC (المحول الرقمي إلى التناظري)
استخدام DAC (المحول الرقمي إلى التناظري)

تتميز DAC الموجودة على PCF8591 بدقة 8 بت - بحيث يمكنها إنشاء إشارة نظرية بين صفر فولت والجهد المرجعي (Vref) في 255 خطوة. لأغراض التوضيح ، سنستخدم Vref بجهد 5 فولت ، ويمكنك استخدام Vref أقل مثل 3.3 فولت أو ما تريد أن تكون القيمة القصوى … ومع ذلك يجب أن تكون أقل من جهد الإمداد.

لاحظ أنه عندما يكون هناك حمل على الخرج التناظري (حالة حقيقية) ، سينخفض الحد الأقصى لجهد الخرج - تُظهر ورقة البيانات (التي قمت بتنزيلها) انخفاضًا بنسبة 10٪ لحمل 10kΩ. الآن لدائرة مظاهرة لدينا.

لاحظ استخدام مقاومات سحب 10kΩ في ناقل I2C ، ومكثف 10μF بين 5V و GND. يتم تعيين عنوان ناقل I2C بواسطة مجموعة من المسامير A0 ~ A2 ، ومعهم جميعًا إلى GND يكون العنوان 0x90. يمكن أخذ الإخراج التناظري من الدبوس 15 (وهناك GND تناظري منفصل على الطرف 13. أيضًا ، قم بتوصيل الدبوس 13 بـ GND ، ودائرة GND بـ Arduino GND.

للتحكم في DAC نحتاج إلى إرسال اثنين بايت من البيانات. الأول هو بايت التحكم ، والذي ينشط ببساطة DAC وهو 1000000 (أو 0x40) والبايت التالي هو القيمة بين 0 و 255 (مستوى الإخراج). هذا موضح في الرسم التخطيطي التالي:

// مثال 52.1 عرض توضيحي PCF8591 DAC

# تضمين "Wire.h" #define PCF8591 (0x90 >> 1) // إعداد باطل عنوان ناقل I2C () {Wire.begin ()؛ } void loop () {for (int i = 0؛ i <256؛ i ++) {Wire.beginTransmission (PCF8591)؛ // استيقظ PCF8591 Wire.write (0x40) ؛ // control byte - قم بتشغيل DAC (ثنائي 1000000) Wire.write (i) ؛ // القيمة المراد إرسالها إلى DAC Wire.endTransmission () ؛ // end tranmission}

لـ (int i = 255 ؛ i> = 0 ؛ --i)

{Wire.beginTransmission (PCF8591) ؛ // استيقظ PCF8591 Wire.write (0x40) ؛ // control byte - قم بتشغيل DAC (ثنائي 1000000) Wire.write (i) ؛ // القيمة المراد إرسالها إلى DAC Wire.endTransmission () ؛ // end tranmission}}

هل لاحظت تحول البت في عنوان الناقل في العبارة #define؟ يرسل Arduino عناوين 7 بت ولكن PCF8591 يريد 8 بت ، لذلك نحول البايت بمقدار بت واحد.

الخطوة 2:

صورة
صورة

تظهر نتائج الرسم في الصورة ، لقد قمنا بتوصيل Vref بـ 5V ومسبار الذبذبات و GND بالإخراج التناظري و GND على التوالي.

الخطوه 3:

صورة
صورة

إذا كنت تحب المنحنيات ، يمكنك إنشاء موجات جيبية بالرسم أدناه. يستخدم جدول بحث في مصفوفة يحتوي على نقاط البيانات الضرورية المحسوبة مسبقًا:

// مثال 52.2 PCF8591 DAC تجريبي - موجة جيبية

# تضمين "Wire.h" # تعريف PCF8591 (0x90 >> 1) // عنوان ناقل I2C uint8_t sine_wave [256] = {0x80 ، 0x83 ، 0x86 ، 0x89 ، 0x8C ، 0x90 ، 0x93 ، 0x96 ، 0x99 ، 0x9C ، 0x9F ،::::: 0x67 ، 0x64 ، 0x61 ، 0x5E ، 0x5B ، 0x58 ، 0x55 ، 0x52 ، 0x4F ، 0x4D ، 0x4A ، 0x47 ، 0x44 ، 0x41 ، 0x3F ، 0x 3C ، 0x39 ، 0x37 ، 0x34 ، 0x32 ، 0x2F ، 0x2D ، 0x2B ، 0x28 ، 0x26 ، 0x24 ، 0x22 ، 0x20 ، 0x1E ، 0x1C ، 0x1A ، 0x18 ، 0x16 ، 0x15 ، 0x13 ، 0x11 ، 0x10 ، 0x0F ، 0x0D ، 0x0C ،::: 0x70 ، 0x74 ، 0x77 ، 0x7A ، 0x7D} ؛ إعداد باطل () {Wire.begin () ؛ } void loop () {for (int i = 0؛ i <256؛ i ++) {Wire.beginTransmission (PCF8591)؛ // استيقظ PCF8591 Wire.write (0x40) ؛ // control byte - قم بتشغيل DAC (ثنائي 1000000) Wire.write (sine_wave ) ؛ // القيمة المراد إرسالها إلى DAC Wire.endTransmission () ؛ // end tranmission}}

الخطوة الرابعة:

صورة
صورة

بالنسبة لتفريغ صورة DSO التالي ، قمنا بتغيير Vref إلى 3.3V - لاحظ التغيير في الحد الأقصى على الموجة الجيبية.

يمكنك الآن تجربة DAC لعمل مؤثرات صوتية أو إشارات أو التحكم في الدوائر التناظرية الأخرى.

الخطوة 5: استخدام ADCs (المحولات التناظرية إلى الرقمية)

إذا كنت قد استخدمت الوظيفة analogRead () على Arduino (طريق العودة في الفصل الأول) ، فأنت بالفعل على دراية بـ ADC. باستخدام PCF8591 ، يمكننا قراءة جهد بين الصفر و Vref وسيعيد قيمة تتراوح بين صفر و 255 والتي تتناسب طرديًا مع الصفر و Vref.

على سبيل المثال ، يجب أن يؤدي قياس 3.3 فولت إلى إرجاع 168. دقة (8 بت) من ADC أقل من Arduino (10 بت) ولكن يمكن لـ PCF8591 القيام بشيء لا تستطيع ADC الخاص بـ Arduino القيام به. لكننا سنصل إلى ذلك بعد قليل. أولاً ، لقراءة قيم كل دبوس ADC ببساطة ، نرسل بايت تحكم لإخبار PCF8591 أي ADC نريد قراءته. بالنسبة إلى ADCs من صفر إلى ثلاثة ، يكون بايت التحكم هو 0x00 و 0x01 و ox02 و 0x03 على التوالي.

ثم نطلب اثنين بايت من البيانات مرة أخرى من ADC ، ونخزن البايت الثاني للاستخدام. لماذا اثنين بايت؟ يقوم PCF8591 بإرجاع القيمة التي تم قياسها مسبقًا أولاً - ثم البايت الحالي. (انظر الشكل 8 في ورقة البيانات). أخيرًا ، إذا كنت لا تستخدم جميع دبابيس ADC ، فقم بتوصيل تلك غير المستخدمة بـ GND. يسترد الرسم التخطيطي المثال التالي القيم من كل دبوس ADC واحدًا تلو الآخر ، ثم يعرضها في الشاشة التسلسلية:

# تضمين "Wire.h"

#define PCF8591 (0x90 >> 1) // عنوان ناقل I2C # تعريف ADC0 0x00 // بايت التحكم لقراءة ADC الفردية # تعريف ADC1 0x01 # تعريف ADC2 0x02 # تعريف ADC3 0x03 قيمة البايت 0 ، value1 ، value2 ، value3 ؛ إعداد باطل () {Wire.begin () ؛ Serial.begin (9600) ؛ } حلقة فارغة () {Wire.beginTransmission (PCF8591)؛ // استيقظ PCF8591 Wire.write (ADC0) ؛ // بايت التحكم - اقرأ ADC0 Wire.endTransmission () ؛ // end tranmission Wire.requestFrom (PCF8591، 2) ؛ value0 = Wire.read () ؛ value0 = Wire.read () ؛ Wire.beginTransmission (PCF8591) ؛ // استيقظ PCF8591 Wire.write (ADC1) ؛ // التحكم بايت - اقرأ ADC1 Wire.endTransmission () ؛ // end tranmission Wire.requestFrom (PCF8591، 2) ؛ value1 = Wire.read () ؛ value1 = Wire.read () ؛ Wire.beginTransmission (PCF8591) ؛ // استيقظ PCF8591 Wire.write (ADC2) ؛ // بايت التحكم - اقرأ ADC2 Wire.endTransmission () ؛ // end tranmission Wire.requestFrom (PCF8591، 2) ؛ value2 = Wire.read () ؛ value2 = Wire.read () ؛ Wire.beginTransmission (PCF8591) ؛ // استيقظ PCF8591 Wire.write (ADC3) ؛ // بايت التحكم - اقرأ ADC3 Wire.endTransmission () ؛ // end tranmission Wire.requestFrom (PCF8591، 2) ؛ value3 = Wire.read () ؛ value3 = Wire.read () ؛ Serial.print (القيمة 0) ؛ Serial.print ("") ؛ Serial.print (القيمة 1) ؛ Serial.print ("") ؛ Serial.print (القيمة 2) ؛ Serial.print ("") ؛ Serial.print (القيمة 3) ؛ Serial.print ("") ؛ Serial.println () ، }

عند تشغيل المخطط ، سيتم تقديمك بقيم كل ADC في الشاشة التسلسلية. على الرغم من أنه كان عرضًا توضيحيًا بسيطًا لتوضيح كيفية قراءة كل ADC بشكل فردي ، إلا أنه طريقة مرهقة للحصول على أكثر من بايت واحد في وقت واحد من ADC معين.

الخطوة السادسة:

للقيام بذلك ، قم بتغيير بايت التحكم لطلب زيادة تلقائية ، ويتم ذلك عن طريق تعيين بت 2 من بايت التحكم إلى 1. لذلك للبدء من ADC0 ، نستخدم بايت تحكم جديد من ثنائي 00000100 أو سداسي عشري 0x04. ثم اطلب خمسة بايت من البيانات (مرة أخرى نتجاهل البايت الأول) مما سيجعل PCF8591 يعيد جميع القيم في سلسلة واحدة من البايتات. هذه العملية موضحة في الرسم التخطيطي التالي:

# تضمين "Wire.h"

#define PCF8591 (0x90 >> 1) // قيمة بايت عنوان ناقل I2C 0 ، value1 ، value2 ، value3 ؛ إعداد باطل () {Wire.begin () ؛ Serial.begin (9600) ؛ } حلقة فارغة () {Wire.beginTransmission (PCF8591)؛ // استيقظ PCF8591 Wire.write (0x04) ؛ // بايت التحكم - اقرأ ADC0 ثم الزيادة التلقائية Wire.endTransmission () ؛ // end tranmission Wire.requestFrom (PCF8591، 5) ؛ value0 = Wire.read () ؛ value0 = Wire.read () ؛ value1 = Wire.read () ؛ value2 = Wire.read () ؛ value3 = Wire.read () ؛ Serial.print (القيمة 0) ؛ Serial.print ("") ؛ Serial.print (القيمة 1) ؛ Serial.print ("") ؛ Serial.print (القيمة 2) ؛ Serial.print ("") ؛ Serial.print (القيمة 3) ؛ Serial.print ("") ؛ Serial.println () ، }

ذكرنا سابقًا أن PCF8591 يمكنه فعل شيء لا يستطيع ADC الخاص بـ Arduino القيام به ، وهذا يقدم ADC تفاضليًا. على عكس Arduino أحادي النهاية (أي أنه يُرجع الفرق بين جهد الإشارة الموجبة و GND ، يقبل التفاضل ADC إشارتين (لا يلزم بالضرورة الرجوع إلى الأرض) ، ويعيد الفرق بين الإشارتين يمكن أن يكون هذا مناسبًا لقياس التغيرات الصغيرة في الفولتية لخلايا التحميل وما إلى ذلك.

الخطوة السابعة:

صورة
صورة

يعد إعداد PCF8591 للتفاضل ADC مسألة بسيطة لتغيير بايت التحكم. إذا انتقلت إلى الصفحة السابعة من ورقة البيانات ، ففكر في الأنواع المختلفة لبرمجة الإدخال التناظري. استخدمنا سابقًا الوضع "00" لأربعة مدخلات ، ومع ذلك يمكنك تحديد المداخل الأخرى الموضحة بوضوح ، على سبيل المثال الصورة.

لذلك لتعيين بايت التحكم لمدخلين تفاضليين ، استخدم الثنائي 00110000 أو 0x30. إذن فالأمر بسيط هو طلب وحدات بايت من البيانات والعمل معها. كما ترى ، هناك أيضًا مدخلات فردية / تفاضلية ومُركبة ثلاثية التفاضل. ومع ذلك سنتركهم في الوقت الحالي.

نأمل أن تكون قد وجدت هذا الاهتمام ، سواء إضافة DAC إلى تجاربك أو تعلم المزيد عن ADC. يرجى النظر في طلب PCF8591 الخاص بك من PMD Way.

هذا المنشور يقدمه لك pmdway.com - كل شيء للصانعين وعشاق الإلكترونيات ، مع التوصيل المجاني في جميع أنحاء العالم.

موصى به: