فهرست مطالب:

آردوینو و PCF8591 ADC DAC IC: 7 مرحله
آردوینو و PCF8591 ADC DAC IC: 7 مرحله

تصویری: آردوینو و PCF8591 ADC DAC IC: 7 مرحله

تصویری: آردوینو و PCF8591 ADC DAC IC: 7 مرحله
تصویری: 10 bit ADC MCP3002 with raspi 2024, جولای
Anonim
آردوینو و PCF8591 ADC DAC IC
آردوینو و PCF8591 ADC DAC IC

آیا تا به حال پین های ورودی آنالوگ بیشتری در پروژه آردوینو خود خواسته اید ، اما نمی خواهید برای مگا فورک کنید؟ یا دوست دارید سیگنالهای آنالوگ تولید کنید؟ سپس موضوع آموزش ما - IC NXP PCF8591 را بررسی کنید.

این دو مشکل را حل می کند زیرا دارای یک مبدل DAC (دیجیتال به آنالوگ) و چهار ADC (مبدل آنالوگ به دیجیتال) است - همه از طریق گذرگاه I2C قابل دسترسی هستند. PCF8591 به صورت DIP ، سطح نصب و ماژول موجود است ، که آزمایش با آن را آسان می کند.

قبل از ادامه ، برگه اطلاعات را بارگیری کنید. PCF8591 می تواند بر روی 5 ولت و 3.3 ولت کار کند بنابراین اگر از Arduino Due ، Raspberry Pi یا سایر بردهای توسعه 3.3 V استفاده می کنید ، خوب هستید. اکنون ابتدا DAC و سپس ADC ها را توضیح می دهیم.

مرحله 1: استفاده از DAC (مبدل دیجیتال به آنالوگ)

استفاده از DAC (مبدل دیجیتال به آنالوگ)
استفاده از DAC (مبدل دیجیتال به آنالوگ)

DAC در PCF8591 دارای وضوح 8 بیت است-بنابراین می تواند سیگنال نظری بین صفر ولت و ولتاژ مرجع (Vref) را در 255 مرحله تولید کند. برای اهداف نمایشی ، ما از Vref 5V استفاده می کنیم و شما می توانید از Vref پایین تر مانند 3.3V یا هر مقدار دیگری که می خواهید حداکثر مقدار باشد استفاده کنید … با این حال باید کمتر از ولتاژ منبع تغذیه باشد.

توجه داشته باشید که وقتی بار روی خروجی آنالوگ وجود دارد (در شرایط واقعی) ، حداکثر ولتاژ خروجی کاهش می یابد-برگه داده (که بارگیری کرده اید) برای بار 10 کیلو وات 10 درصد کاهش نشان می دهد. حالا برای مدار تظاهرات ما.

به استفاده از مقاومت های کششی 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" #تعریف PCF8591 (0x90 >> 1) // آدرس گذرگاه I2C void setup () {Wire.begin ()؛ } void loop () {for (int i = 0؛ i <256؛ i ++) {Wire.beginTransmission (PCF8591)؛ // بیدار شوید PCF8591 Wire.write (0x40) ؛ // بایت کنترل - DAC (باینری 1000000) Wire.write (i) را روشن کنید ؛ // مقدار ارسال به DAC Wire.endTransmission ()؛ // پایان انتقال}

برای (int i = 255؛ i> = 0؛ --i)

{Wire.beginTransmission (PCF8591) ؛ // بیدار شوید PCF8591 Wire.write (0x40) ؛ // بایت کنترل - DAC (باینری 1000000) Wire.write (i) را روشن کنید ؛ // مقدار ارسال به DAC Wire.endTransmission ()؛ // پایان انتقال}}

آیا در دستور #define به تغییر بیت آدرس اتوبوس توجه کرده اید؟ آردوینو آدرس های 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، 0xA2، 0xA5، 0xA8، 0xAB، 0xAE، 0xB1، 0xB3، 0xB6، 0xB9، 0xBC، 0xBF، 0xC1، 0xC4، 0xC7، 0xC9، 0xCC، 0xCE، 0xD1، 0xD3، 0xD5، 0xD8، 0xDA، 0xDC، 0xDE، 0xE0، 0xE2، 0xE4، 0xE6، 0xE8، 0xEA، 0xEB، 0xED، 0xEF، 0xF0، 0xF1، 0xF3، 0xF4، 0xF5، 0xF6، 0xF8، 0xF9، 0xFA، 0xFA، 0xFB، 0xFC، 0xFD، 0xFD، 0xFE، 0xFE، 0xFE، از 0xFF، از 0xFF، از 0xFF، از 0xFF، از 0xFF، از 0xFF، از 0xFF، 0xFE، 0xFE، 0xFE، 0xFD، 0xFD، 0xFC، 0xFB، 0xFA، 0xFA، 0xF9، 0xF8، 0xF6، 0xF5، 0xF4، 0xF3، 0xF1، 0xF0، 0xEF، 0xED، 0xEB، 0xEA، 0xE8، 0xE6، 0xE4، 0xE2، 0xE0، 0xDE، 0xDC، 0xDA، 0xD8، 0xD5، 0xD3، 0xD1، 0xCE، 0xCC، 0xC9، 0xC7، 0xC4، 0xC1، 0xBF، 0xBC، 0xB9، 0xB6، 0xB3، 0xB1، 0xAE، 0xAB، 0xA8، 0xA5، 0xA2، 0x9F، 0x9C، 0x99، 0x96، 0x93، 0x90، 0x8C، 0x89، 0x86، 0x83، 0x80، 0x7D، 0x7A، 0x77، 0x74، 0x70، 0x6D، 0x6A، 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، 0x0B، 0x0A، 0x08، 0x07، 0x06، 0x06، 0x05، 0x04، 0x03، 0x03، 0x02، 0x02، 0x02، 0x01 موجود، 0x01 موجود، 0x01 موجود، 0x01 موجود، 0x01 موجود، 0x01 موجود، 0x01 موجود، 0x02، 0x02، 0x02، 0x03، 0x03، 0x04، 0x05، 0x06، 0x06، 0x07، 0x08، 0x0A، 0x0B، 0x0C، 0x0D، 0x0F، 0x10، 0x11، 0x13، 0x15، 0x16، 0x18، 0x1A، 0x1C، 0x1E، 0x20، 0x22، 0x24، 0x26، 0x28، 0x2B، 0x2D، 0x2F، 0x32، 0x34، 0x37، 0x39، 0x3C، 0x3F، 0x41، 0x44، 0x47، 0x4A، 0x4D، 0x4F، 0x52، عدد 0x55، 0x58، 0x5B، 0x5E، 0x61، 0x64، 0x67، 0x6A، 0x6D، 0x70 ، 0x74 ، 0x77 ، 0x7A ، 0x7D} ؛ void setup () {Wire.begin ()؛ } void loop () {for (int i = 0؛ i <256؛ i ++) {Wire.beginTransmission (PCF8591)؛ // بیدار شوید PCF8591 Wire.write (0x40) ؛ // بایت کنترل - DAC (باینری 1000000) Wire.write (sine_wave ) را روشن کنید ؛ // مقدار ارسال به DAC Wire.endTransmission ()؛ // پایان انتقال}}

مرحله 4:

تصویر
تصویر

برای تخلیه تصویر DSO زیر ، Vref را به 3.3V تغییر دادیم - به تغییر حداکثر در موج سینوسی توجه کنید.

اکنون می توانید با DAC آزمایش جلوه های صوتی ، سیگنال یا کنترل سایر مدارهای آنالوگ را انجام دهید.

مرحله 5: استفاده از ADC ها (مبدل های آنالوگ به دیجیتال)

اگر از عملکرد analogRead () در Arduino خود استفاده کرده اید (راه برگشت در فصل اول) ، در حال حاضر با ADC آشنا هستید. بدون PCF8591 ما می توانیم ولتاژ بین صفر و Vref را بخوانیم و مقدار بین صفر تا 255 را باز می گرداند که مستقیماً با صفر و Vref متناسب است.

به عنوان مثال ، اندازه گیری 3.3 ولت باید 168 را برگرداند. وضوح (8 بیتی) ADC کمتر از پردازنده آردوینو (10 بیتی) است ، با این حال PCF8591 می تواند کاری را انجام دهد که ADC آردوینو نمی تواند. اما ما در یک لحظه به آن خواهیم رسید. ابتدا ، برای خواندن مقادیر هر پین ADC ، یک بایت کنترل ارسال می کنیم تا به PCF8591 بگوییم که کدام ADC را می خواهیم بخوانیم. برای ADC های صفر تا سه بایت کنترل به ترتیب 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 ؛ void setup () {Wire.begin ()؛ Serial.begin (9600)؛ } void loop () {Wire.beginTransmission (PCF8591)؛ // بیدار شوید PCF8591 Wire.write (ADC0) ؛ // بایت کنترل - ADC0 Wire.endTransmission () را بخوانید؛ // پایان انتقال سیم. درخواست از (PCF8591 ، 2) ؛ value0 = Wire.read ()؛ value0 = Wire.read ()؛ Wire.beginTransmission (PCF8591) ؛ // بیدار شوید PCF8591 Wire.write (ADC1) ؛ // بایت کنترل - ADC1 Wire.endTransmission () را بخوانید؛ // پایان انتقال سیم Wire.requestFrom (PCF8591، 2)؛ value1 = Wire.read ()؛ value1 = Wire.read ()؛ Wire.beginTransmission (PCF8591) ؛ // بیدار شوید PCF8591 Wire.write (ADC2) ؛ // بایت کنترل - ADC2 Wire.endTransmission () را بخوانید؛ // پایان انتقال سیم Wire.requestFrom (PCF8591، 2)؛ value2 = Wire.read ()؛ value2 = Wire.read ()؛ Wire.beginTransmission (PCF8591) ؛ // بیدار شوید PCF8591 Wire.write (ADC3) ؛ // بایت کنترل - ADC3 Wire.endTransmission () را بخوانید؛ // پایان انتقال سیم Wire.requestFrom (PCF8591، 2)؛ value3 = Wire.read ()؛ value3 = Wire.read ()؛ Serial.print (value0)؛ Serial.print ("")؛ Serial.print (value1) ؛ Serial.print ("")؛ Serial.print (value2)؛ Serial.print ("")؛ Serial.print (value3) ؛ Serial.print ("")؛ Serial.println ()؛ }

پس از اجرای طرح ، مقادیر هر ADC در مانیتور سریال ارائه می شود. اگرچه این یک تظاهرات ساده بود تا به شما نشان دهد چگونه هر ADC را به صورت جداگانه بخوانید ، اما این یک روش دست و پا گیر است که می توانید بیش از یک بایت در یک زمان از یک ADC خاص دریافت کنید.

مرحله 6:

برای انجام این کار ، بایت کنترل را برای درخواست افزایش خودکار تغییر دهید ، که با تنظیم بیت 2 بایت کنترل بر روی 1 انجام می شود. بنابراین برای شروع از ADC0 ما از یک بایت کنترلی جدید به نام باینری 00000100 یا هگزادسیمال 0x04 استفاده می کنیم. سپس پنج بایت داده درخواست کنید (بار دیگر اولین بایت را نادیده می گیریم) که باعث می شود PCF8591 همه مقادیر را در یک زنجیره بایت بازگرداند. این روند در طرح زیر نشان داده شده است:

#شامل "Wire.h"

#define PCF8591 (0x90 >> 1) // آدرس گذرگاه گذرگاه I2C byte value0، value1، value2، value3؛ void setup () {Wire.begin ()؛ Serial.begin (9600)؛ } void loop () {Wire.beginTransmission (PCF8591)؛ // بیدار شوید PCF8591 Wire.write (0x04) ؛ // بایت کنترل - ADC0 را بخوانید سپس Wire.endTransmission را افزایش دهید ()؛ // پایان انتقال سیم Wire.requestFrom (PCF8591، 5)؛ value0 = Wire.read ()؛ value0 = Wire.read ()؛ value1 = Wire.read ()؛ value2 = Wire.read ()؛ value3 = Wire.read ()؛ Serial.print (value0)؛ Serial.print ("")؛ Serial.print (value1) ؛ Serial.print ("")؛ Serial.print (value2)؛ Serial.print ("")؛ Serial.print (value3) ؛ Serial.print ("")؛ Serial.println ()؛ }

قبلاً اشاره کردیم که PCF8591 می تواند کاری را انجام دهد که ADC آردوینو نمی تواند ، و این یک ADC دیفرانسیل است. بر خلاف تک پایان آردوینو (یعنی تفاوت بین ولتاژ سیگنال مثبت و GND را برمی گرداند ، دیفرانسیل ADC دو سیگنال را می پذیرد (که لزوماً نباید به زمین اشاره شود) و تفاوت بین دو سیگنال را برمی گرداند. این می تواند برای اندازه گیری تغییرات کوچک در ولتاژ لودسل ها و غیره مناسب باشد.

مرحله 7:

تصویر
تصویر

راه اندازی PCF8591 برای دیفرانسیل ADC یک موضوع ساده برای تغییر بایت کنترل است. اگر به صفحه هفتم صفحه ورق می زنید ، انواع مختلف برنامه نویسی ورودی آنالوگ را در نظر بگیرید. قبلاً از حالت 00 برای چهار ورودی استفاده می کردیم ، اما می توانید بقیه را که به وضوح نشان داده شده است ، برای مثال تصویر ، انتخاب کنید.

بنابراین برای تنظیم بایت کنترل برای دو ورودی دیفرانسیل ، از دودویی 00110000 یا 0x30 استفاده کنید. سپس این یک موضوع ساده است که درخواست بایت داده ها و کار با آنها را انجام دهید. همانطور که می بینید ترکیبی از یک/دیفرانسیل و یک ورودی سه دیفرانسیل پیچیده نیز وجود دارد. با این حال ما فعلا آنها را ترک می کنیم.

امیدوارم این مورد مورد توجه شما واقع شده باشد ، چه افزودن DAC به آزمایشات شما و چه آشنایی بیشتر با ADC ها. لطفاً PCF8591 خود را از PMD Way سفارش دهید.

این پست توسط pmdway.com برای شما ارسال شده است - همه چیز برای سازندگان و علاقه مندان به لوازم الکترونیکی ، با ارسال رایگان در سراسر جهان.

توصیه شده: