فهرست مطالب:
- مرحله 1: استفاده از DAC (مبدل دیجیتال به آنالوگ)
- گام 2:
- مرحله 3:
- مرحله 4:
- مرحله 5: استفاده از ADC ها (مبدل های آنالوگ به دیجیتال)
- مرحله 6:
- مرحله 7:
تصویری: آردوینو و PCF8591 ADC DAC IC: 7 مرحله
2024 نویسنده: John Day | [email protected]. آخرین اصلاح شده: 2024-01-30 08:55
آیا تا به حال پین های ورودی آنالوگ بیشتری در پروژه آردوینو خود خواسته اید ، اما نمی خواهید برای مگا فورک کنید؟ یا دوست دارید سیگنالهای آنالوگ تولید کنید؟ سپس موضوع آموزش ما - IC NXP PCF8591 را بررسی کنید.
این دو مشکل را حل می کند زیرا دارای یک مبدل DAC (دیجیتال به آنالوگ) و چهار ADC (مبدل آنالوگ به دیجیتال) است - همه از طریق گذرگاه I2C قابل دسترسی هستند. PCF8591 به صورت DIP ، سطح نصب و ماژول موجود است ، که آزمایش با آن را آسان می کند.
قبل از ادامه ، برگه اطلاعات را بارگیری کنید. PCF8591 می تواند بر روی 5 ولت و 3.3 ولت کار کند بنابراین اگر از Arduino Due ، Raspberry Pi یا سایر بردهای توسعه 3.3 V استفاده می کنید ، خوب هستید. اکنون ابتدا DAC و سپس ADC ها را توضیح می دهیم.
مرحله 1: استفاده از 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 برای شما ارسال شده است - همه چیز برای سازندگان و علاقه مندان به لوازم الکترونیکی ، با ارسال رایگان در سراسر جهان.
توصیه شده:
MicroPython PCF8591 DAC تست: 3 مرحله (همراه با تصاویر)
MicroPython PCF8591 DACtest: من این کتاب را برای بهبود مهارت های Micropython: MicroPython for ESP8266 Workshop Development توسط Agus Kurniawan خریدم. این کتاب شروع بسیار خوبی است ، پروژه I2C از ماژول PCF8591 استفاده می کند. اما هیچ نمونه ای از برنامه نویسی DAC وجود ندارد ، بنابراین مجبور شدم بدانم که
تبدیل متن به گفتار آردوینو با استفاده از LM386 - پروژه صحبت کردن آردوینو - کتابخانه تاکی آردوینو: 5 مرحله
تبدیل متن به گفتار آردوینو با استفاده از LM386 | پروژه صحبت کردن آردوینو | کتابخانه Talkie Arduino: سلام بچه ها ، در بسیاری از پروژه ها ما به arduino نیاز داریم که چیزی شبیه به ساعت صحبت کردن یا گفتن برخی اطلاعات در این دستورالعمل را با استفاده از Arduino به گفتار تبدیل کنیم
آردوینو و TI ADS1110 ADC 16 بیتی: 6 مرحله
Arduino و TI ADS1110 ADC 16 بیتی: در این آموزش ما استفاده از Arduino را برای کار با Texas Instruments ADS1110 بررسی می کنیم-یک IC فوق العاده کوچک اما مفید 16 بیتی مبدل آنالوگ به دیجیتال. می تواند بین 2.7 تا 5.5 ولت کار کند ، بنابراین برای Arduino Due و سایر حجم های پایین نیز مناسب است
پخش آهنگ با آردوینو با استفاده از ADC به PWM در Flyback Transformer یا بلندگو: 4 مرحله
پخش آهنگها با آردوینو با استفاده از ADC to PWM در Flyback Transformer یا بلندگو: سلام بچه ها ، این قسمت دوم از دستورالعمل دیگر من است (که بسیار دشوار بود) ، اساساً ، در این پروژه ، من از ADC و TIMERS در Arduino خود استفاده کرده ام تبدیل سیگنال صوتی به سیگنال PWM. این بسیار ساده تر از دستورالعمل قبلی من است
ارزان ترین آردوینو -- کوچکترین آردوینو -- آردوینو پرو مینی -- برنامه نویسی -- آردوینو ننو: 6 مرحله (همراه با تصاویر)
ارزان ترین آردوینو || کوچکترین آردوینو || آردوینو پرو مینی || برنامه نویسی || آردوینو ننو: …………………………. لطفاً برای ویدیوهای بیشتر به کانال YouTube من مشترک شوید ……. .این پروژه در مورد نحوه ارتباط با کوچکترین و ارزانترین آردوینو است. کوچکترین و ارزان ترین آردوینو arduino pro mini است. شبیه آردوینو