راه اندازی ADC و DAC توسط Raspberry Pi 3
اضافه کردن مبدل ADC و DAC به رزبری:
اگر به پین های رزبری توجه کرده باشید متوجه عدم پشتیبانی GPIO های رزبری از سخت افزاری برای تبدیل مقادیرآنالوگ به دیجیتال و یا مبدل دیجیتال به آنالوگ میشوید. این دو مبدل GPIO های رزبری را بیشتر با دنیای خارج مرتبط میکند. این محدودیت در GPIO های رزبری مارا مجاب به انتخاب یکی از راه حل های زیر میکند.
1- استفاده از ADC و DAC ميکرو کنترلرها و آردینوها و ارسال مقادير اندارگيري شده از طريق يک رابط سريال به رزبری(اين راه مقرون به صرفه نيست)
2- استفاده از مدارهاي مجتمع مبدل آنالوگ به ديجيتال ADC ویا DAC که از يک رابط سريال پشتيباني ميکنند.
در این قسمت از راه حل دوم برای حل محدودیت ذکر شده استفاده میکنیم. مبدلی که در این قسمت مورد بررسی قرار میدهیم مبدلی با شماره ی آیسی PCF8591 میباشد.
PCF8591 از دو واحد مبدل دیجیتال به آنالوگ(ADC) و آنالوگ به دیجیتال (DAC) استفاده میکنید. این مبدل دارای 4 کانال ورودی آنالوگ مبدل ADC و یک کانال خروجی آنالوگ DAC میباشد. رزولوشن این دو مبدل 8 بیت می باشد. این مبدل از رابط سریال I2C برای ارتباط با MCU و یا رزبری پشتیبانی پشتیبانی میکند ، نرخ نمونه برداری این مبدل محدود به حداکثر نرخ ارسال داده ها در I2C است.
قبل از هر کاری ابتدا I2C رزبری را فعال کنید. برای فعل کردن I2C به آموزش های قبلی مراجعه کنید.
راه اندازی:
درکتابخانه ی wiringPi توابعی برای راه اندازی و کار با این قطعه در نظر گرفته شده که در ادامه با آنها آشنا خواهیم شد.
برای استفاده ازاین توابع کتابخانه ی زیر را به ابتدای پروژه اضافه کنید.
#include <pcf8591.h>
بعد از اضافه کردن کتابخانه ی بالا توابع زیر در دسترس هستند.
تابع تظیمات مبدل :
از این تابع برای تنظیم و آدرس دهی قطعه ی PCF8591 استفاده کنید.
pcf8591Setup (int PIN, int Ad)
این تابع دو ورودی دارد که در ورودی اول هر عددی که بیشتر از عدد 64 باشد، این عدد مربوط به تنظیمات ای سی میباشد.این تنظیمات توسط بایت کنترل آی سی تعیین میشود وشامل تنظیماتی همچون انتخاب نوع ورودی آنالوگ دیفرانسیلی و یا تک سیگنال میباشد. درحالت عادی یعنی حالت تک سیگنال عددی که در ورودی اول قرار میگرد عدد 120 میباشد. برای کسب اطلاعات بیشتر به برگه ی راهنمای این ای سی بروید.
ورودی تابع دوم آدرس مخصوص ای سی میباشد. برای پیدا کردن این آدرس ابتدا نرم افزار I2Ctool را با دستور زیر در رزبری خود نصب کنید
sudo apt-get install -y i2c-tools
وحالا دستور زیر را در ترمینال وارد کنید. تا آدرس قطعاتی که به رزبری متصل هستند در یک جدول به شکل زیر نمایش داده شود.
اگر آدرس ای سی در شبکه ای که با باس I2C ساخته اید تکراری بود میتوانید با تغییر پین های A0 ،A1 وA2 ادرس ای سی را تغییر دهید. با تغییر این پین ها میتوانید تا هشت عدد از این مبدل را در باس I2C قرار دهید.
از این تابع میتواند در هر جا و برای هر تعداد مبدل که در باس I2C قرار دارد استفاده کنید. به شرطی که آدرس و ورودی اول این تابع (یعنی PIN )عدهای متفاوتی باشند.
تابع خواندن مقادیر آنالوگ:
این تابع مقدار سیگنال آنالوگ متصل به یکی از پین های ورودی آنالوگ را تبدیل به یک مقدار دیجیتال تبدیل میکند.
Int analogRead (int PIN)
ورودی این تابع شماره ی کانال به اضافه ی تنظیمات ای سی میباشد(PIN+Number Of Channel).وخروجی این تابع مقدار دیجیتال سیگنال آنالوگ وصل شده به کانال مورد نظر است.
تابع نوشتن اندازه ی سیگنال آنالوگ:
این تابع مربوط به بخش مبدل DAC میباشد و مقدار ورودی این تابع تبدیل به سیگنال آنالوگ میکند.
Void analogWrite (int PIN,int value)
ورودی اول همان مقدار PIN توابع قبلی میباشد و در ورودی دوم مقدار سیگنال آنالوگ را به صورت دیجیتالی قرار میگیرد.
محاسبات:
ADC
همانطور که گفته شد رزولیشن این مبدل 8 بیت میباشد و رنج تغییراتی از 0 تا 255 به صورت دیجیتال را دارد. ولتاژ ریفرنس این مبدل به صورت نرمال برابر مقدار ولتاژ تغذیه میباشد. پس بنابر این مقدار ولتاژ ورودی از رابطه ی زیر بدست می آید.
vIn = value * 3.3 ÷ 255
DAC
در حالتی که از مبدل DAC استفاده میکنید میتوانید اندازه ی ولتاژخروجی این مبدل را از روی مقدار دیجیتالی که به آن ارسال کرده اید از رابطه ی زیر بدست آورید.
VOut = value ÷ 255 * 3.3
اندازه گیری شدت نور با LDR:
در اين قسمت قصد داريم از یک سنسور LDR برای اندازه گیری شدت نور محیط استفاده کنیم. این سنسور تغییرات نور محیط را تبدیل به تغیرات مقاومت میکند. مقدار مقاومت LDR تابع نور است به صورتي که با افزايش نور مقدار مقاومت آن کاهش يافته و با کاهش ميزان نور تابشي مقدار مقاومتش افزايش ميابد. معمولا مقاومتهايي که در بازار موجود هستند در شدت نور عادي(محيط در روز)مقدار مقاومتشان در حدود 1 کيلو اهم و در تاريکي مطلق مقدار مقاومتشان بين يک تا دو مگا اهم است. براي اينکه تغييرات مقاومت را نسبت به شدت نور انداژه گيري کنيم بايد اين تغييرات را به تغييراتي همچون ولتاژ تبديل کنيم تا واحد ADC بتوان عمل تبديل مقادير آنالوگ را به ديجيتال انجام دهد. براي تبديل تغييرات مقاومت به ولتاژ از مدار ساده ي مقسم ولتاژ مقاومتي استفاده ميکنيم. مقادیر اندازه گیری شده درنور مستقیم آفتاب و مهتاب اندازه گیری شده است ودرشکل زیر مقادیر اندازگیری شده را آورده ایم.
توضیحات برنامه:
در ابتدای برنامه دو کتابخانه ی wiringPi و PCF8591 اضافه شده تا بتوانیم توابع آن در راه اندازی مبدل استفاده کنیم.
از تابع pcf8591Setup مبدل برای راه اندازی و آدرس دهی مبدل استفاده شده است. عدد ورودی اول آن که همان PIN است که در ابتدای همین مقاله آنرا بررسی کردیم و ورودی دوم نیز آدرس پیش فرض مبدل میباشد. این آدرس درحالتی این عدد است که سه پین A0 تا A2 به زمین متصل شده باشند. از تابع analogRead برای تبدیل مقدار سیگنال آنالوگ متصل شده به کانال AIN0 استفاده شده است.برنامه ی فوق در فایل زمینه موجود میباشد.
#include <stdio.h> #include <wiringPi.h> #include <pcf8591.h> #define PCF 120 int AIN0 = PCF + 0; int main (void){ int Light; wiringPiSetupGpio (); pinMode(17,INPUT); // Setup pcf8591 on base pin 120, and address 0x48 pcf8591Setup (PCF, 0x48); // loop forever while(1) { Light=analogRead(AIN0); if((Light>=0)&&(Light<50)) printf("Moon Light"); else if((Light>100)&&(Light<=255)) printf("Moon Light"); else printf("Lamp Light 1M dis"); } return 0 ; }
نویسنده: میثم سعیدی msimeysamsaeedi @ gmail.com
سلام استاد ممنون از توضیحاتتون
من میخوام یه مبدل آنالوگ به دیجیتال به رزبری پای متصل کنم و خیلی مهمه که نرخ نمونه برداری باید 1.5 گیگاهرتز باشه
به نظر شما راهی برای دریافت بایت دیجیتال با همچین سرعتی هست ؟
میشه بدون سیستم عامل با برنامه نویسی از پینهای GPIO بعنوان ورودی دیجیتال و یک پین بعنوان کلاک برای ADC تعریف کرد
اگه رزبری پای پورت usb3 داشت خیلی عالی میشد ?